进程管理模拟系统(C语言源代码)

进程管理模拟系统(C语言源代码)
进程管理模拟系统(C语言源代码)

模拟进程管理源代码:

#include "stdio.h"

#include"graphics.h"

#include "dos.h"

#include "stdlib.h"

#include "conio.h"

#define SEC 3

#define NULL 0

char han1S[]={

0x00,0x80,0x00,0x80,0xFC,0x80,0x04, 0xFC,0x45,0x04,0x46,0x48,0x28,0x40, 0x28,0x40,0x10,0x40,0x28,0x40,0x24, 0xA0,0x44,0xA0,0x81,0x10,0x01,0x08, 0x02,0x0E,0x0C,0x04,

};

char han2S[]={

0x00,0x00,0x41,0x84,0x26,0x7E,0x14, 0x44,0x04,0x44,0x04,0x44,0xF4,0x44, 0x14,0xC4,0x15,0x44,0x16,0x54,0x14, 0x48,0x10,0x40,0x10,0x40,0x28,0x46, 0x47,0xFC,0x00,0x00,

};

char han3S[]={

0x02,0x20,0x42,0x20,0x22,0x28,0x2F, 0xFC,0x02,0x20,0x02,0x20,0xE2,0x20, 0x22,0x28,0x2F,0xFC,0x22,0x20,0x22, 0x20,0x22,0x20,0x24,0x20,0x50,0x26, 0x8F,0xFC,0x00,0x00,

};

char han4S[]={

0x04,0x00,0x02,0x00,0x01,0x00,0x01, 0x00,0x01,0x00,0x02,0x80,0x02,0x80, 0x02,0x80,0x04,0x40,0x04,0x40,0x08, 0x20,0x08,0x20,0x10,0x10,0x20,0x10, 0x40,0x0E,0x80,0x04,

};

char han5S[]={

0x10,0x10,0x11,0xF8,0x11,0x10,0x11, 0xF0,0xFC,0x04,0x17,0xBE,0x14,0xA4, 0x1F,0xBC,0x30,0x40,0xD0,0x44,0x1F, 0xFE,0x10,0xE0,0x11,0x50,0x12,0x4E, 0x54,0x44,0x20,0x40,

};

char han6S[]={

0xFE,0x12,0x80,0x32,0x80,0x54,0x90, 0x98,0xF8,0x10,0x80,0x10,0x80,0x10, 0x88,0x10,0xFC,0x10,0x80,0x10,0x80, 0x10,0x80,0x10,0x80,

};

char han7S[]={

0x00,0x38,0x7F,0xC0,0x04,0x00,0x04, 0x10,0x08,0x20,0x3F,0xC0,0x01,0x00, 0x02,0x20,0x04,0x10,0x3F,0xF8,0x01, 0x08,0x09,0x20,0x09,0x10,0x11,0x08, 0x25,0x08,0x02,0x00,

};

char han8S[]={

0x10,0x80,0x10,0x40,0x20,0x48,0x27, 0xFC,0x48,0x80,0xF9,0x10,0x12,0x08, 0x27,0xFC,0x41,0x24,0xF9,0x20,0x41, 0x20,0x01,0x20,0x1A,0x22,0xE2,0x22, 0x44,0x1E,0x08,0x00,

};

char han9S[]={

0x11,0x10,0x11,0x14,0x1F,0xFE,0x11, 0x10,0xFD,0x18,0x13,0xFC,0x32,0x08, 0x3B,0xF8,0x56,0x08,0x53,0xF8,0x90, 0x40,0x1F,0xFE,0x10,0x40,0x10,0xB0, 0x11,0x0E,0x16,0x04,

};

char han10S[]={

0x10,0x00,0x10,0x08,0x10,0x88,0x12, 0x48,0xFE,0x68,0x12,0x28,0x16,0x08, 0x1A,0x08,0x32,0x08,0xD2,0x08,0x12, 0x48,0x12,0x88,0x13,0x14,0x12,0x22, 0x50,0x42,0x20,0x80,

};

char han11S[]={

0x02,0x20,0x42,0x20,0x22,0x28,0x2F, 0xFC,0x02,0x20,0x02,0x20,0xE2,0x20, 0x22,0x28,0x2F,0xFC,0x22,0x20,0x22, 0x20,0x22,0x20,0x24,0x20,0x50,0x26, 0x8F,0xFC,0x00,0x00,

};

char han12S[]={

0x08,0x04,0x1D,0xFE,0xF1,0x04,0x11, 0x04,0x11,0x04,0xFF,0x04,0x11,0xFC,

0x28,0x91,0xFC,0x10,0x20,0x10,0x24, 0x17,0xFE,0x10,0x00,

};

char han13S[]={

0x10,0x40,0x1F,0x7C,0x28,0x90,0x45, 0x08,0x01,0x00,0x7F,0xFE,0x40,0x02, 0x9F,0xF4,0x10,0x10,0x1F,0xF0,0x10, 0x00,0x1F,0xF0,0x10,0x10,0x10,0x10, 0x1F,0xF0,0x10,0x00,

};

char han14S[]={

0x00,0x08,0x13,0xFC,0xFA,0x48,0x22, 0x48,0x23,0xF8,0x22,0x48,0xFA,0x48, 0x23,0xF8,0x20,0x40,0x20,0x50,0x23, 0xF8,0x3C,0x40,0xE0,0x40,0x40,0x44, 0x0F,0xFE,0x00,0x00,

};

char han15S[]={

0x20,0x00,0x10,0x00,0x10,0x04,0x05, 0xFE,0xFC,0x44,0x08,0x44,0x10,0x44, 0x34,0x44,0x58,0x44,0x94,0x44,0x10, 0x44,0x10,0x84,0x10,0x84,0x11,0x04, 0x12,0x28,0x14,0x10,

};

char han16S[]={

0x10,0x40,0x10,0x40,0x10,0x40,0x10, 0x80,0xFC,0x88,0x25,0x04,0x27,0xFE, 0x24,0x02,0x24,0x04,0x49,0xFE,0x29, 0x04,0x11,0x04,0x29,0x04,0x45,0x04, 0x85,0xFC,0x01,0x04,

};

char han17S[]={

0x08,0x80,0x08,0x80,0x08,0x80,0x10, 0x88,0x10,0x98,0x30,0xA0,0x50,0xC0, 0x90,0x80,0x11,0x80,0x12,0x80,0x14, 0x80,0x10,0x80,0x10,0x82,0x10,0x82, 0x10,0x7E,0x10,0x00,

};

char han18S[]={

0x00,0x80,0x00,0xA0,0x00,0x90,0x3F, 0xFC,0x20,0x80,0x20,0x80,0x20,0x84, 0x3E,0x44,0x22,0x48,0x22,0x48,0x22, 0x30,0x2A,0x20,0x24,0x62,0x40,0x92,

0x81,0x0A,0x00,0x06,

};

char han19S[]={

0x00,0x80,0x00,0x80,0x08,0x80,0xFC,

0x80,0x10,0x84,0x17,0xFE,0x10,0x84,

0x10,0x84,0x10,0x84,0x10,0x84,0x1D,

0x04,0xF1,0x04,0x41,0x04,0x02,0x44,

0x04,0x28,0x08,0x10,

};

char chu1S[]={

0x00,0x08,0x7F,0xFC,0x01,0x00,0x01,

0x00,0x01,0x00,0x01,0x00,0x11,0x10,

0x11,0xF8,0x11,0x00,0x11,0x00,0x11,

0x00,0x11,0x00,0x11,0x00,0x11,0x04,

0xFF,0xFE,0x00,0x00,

};

char chu2S[]={

0x02,0x00,0x02,0x00,0x02,0x04,0xFF,

0xFE,0x04,0x00,0x04,0x40,0x08,0x40,

0x08,0x50,0x13,0xF8,0x30,0x40,0x50,

0x40,0x90,0x40,0x10,0x40,0x10,0x44,

0x17,0xFE,0x10,0x00,

};

void drawmat(char *mat,int matsize,int x,int y,int color) {int i,j,k,n;

n=(matsize-1)/8+1;

for(j=0;j

for(i=0;i

for(k=0;k<8;k++)

if(mat[j*n+i]&(0x80>>k))

putpixel(x+i*8+k,y+j,color);

}

/*定义结构体*/

typedef struct PCB

{

int PID;

int UID;

struct PCB * next;

}PCB;

PCB *really , *excute , *wait;

/*create queue header */

/*queue operation 入队*/

int enqueue(PCB *head , PCB *node)

{

PCB *p;

p = head;

if(p -> next == NULL)

{

head -> next = node;

return 1;

}

while(p)

{

if(p -> next == NULL)

{

p -> next = node;

return 1;

}

else p = p -> next;

}

}/*enquue*/

/*dequeue 出队列 */

PCB * dequeue(PCB *head)

{

PCB *p;

p = head;

if(p -> next == NULL)

{

return NULL;

}

else

{

p = p -> next;

head -> next = p -> next;

p -> next = NULL;

return p;

}

/*head to next*/

}/*dequeue*/

/*PCB operate*/

/*新建进程*/

int create()

{

PCB *p;

p = (PCB*)malloc(sizeof(PCB));

p -> next = NULL;

printf("input PID and UID to a new process\n");

scanf("%d %d",&p -> PID,&p -> UID);

if(enqueue(really , p))

printf("create a process: PID = %d UID = %d\n", p -> PID , p -> UID); else

printf("create Failed\n");

}/*create*/

/*执行 fexcute*/

int fexcute()

{

PCB *p = dequeue(really);

if(p == NULL)

{

printf("NO process in queue \n");

return 0;

}

else

{

enqueue(excute , p);

printf("add a process into excute queue process: PID = %d UID= %d \n" ,p->PID , p->UID);

return 1;

}

}/*excute*/

int wake()

{

PCB *p = dequeue(wait);

if(p == NULL)

{

printf("NO process in queue \n");

return 0;

}

else

{

enqueue(really , p);

printf("add a process into wait really process: PID = %d UID= %d \n" ,p->PID , p->UID);

return 1;

}

}

int block()

{

PCB *p = dequeue(excute);

if(p == NULL)

{

printf("NO process in queue \n");

return 0;

}

else

{

enqueue(wait , p);

printf("add a process into wait queue process: PID = %d UID= %d \n" ,p->PID , p->UID);

return 1;

}

}/*block*/

/*输出队列 outputqueue*/

int outputqueue(PCB *head)

{

PCB *p;

if(head -> next == NULL)

{/*队列为空*/

printf("queue is null \n");

return 1;

}

p = head -> next;

while(p)

{/*打印process id UID*/

printf("PID = %d UID = %d \n" , p -> PID , p -> UID);

p = p -> next;

}

return 0;

}

/*output输出*/

int output()

{

printf("REALLLY QUEUE:\n");

outputqueue(really);

printf("EXCUTE QUEUE: \n");

outputqueue(excute);

printf("WAIT QUEUE: \n");

outputqueue(wait);

}/*output*/

/*init 初始化*/

int init()

{ int i;

PCB *p;

clrscr();

really = (PCB*)malloc(sizeof(PCB));

really -> next=NULL;

excute = (PCB*)malloc(sizeof(PCB));

excute -> next=NULL;

wait = (PCB*)malloc(sizeof(PCB));

wait -> next = NULL;

printf("_____________________________PROCESS

SECHUDLE__________________________________\n");

printf("WELCOME TO PROCESS SECHUDLE");

for(i=0;i<18;i++)

{

printf(". ");

delay(50000);

delay(50000);

}

printf("\nPlease input PID and UID as integer , 0 0 as over\n");

while(1)

{

p = (PCB*)malloc(sizeof(PCB));

p -> next = NULL;

scanf("%d %d",&p -> PID , &p -> UID);

if(p -> PID == 0 && p -> UID == 0)

break;

else

{

if(enqueue(really , p))

{

printf("new process PID = %d UID = %d added!\n",p -> PID , p -> UID); }

else return 0;

}

}

return 1;

}/*init*/

/*运行一个process*/

int run()

{

PCB *p = excute;

int s = SEC;

if(excute -> next == NULL)

{

printf("no process in excute queue \n");

return 0;

}

else

{

p = excute -> next;

printf("system will sleep %ds as process running\n",s);

sleep(3);

printf("process: PID = %d UID= %d excute successed..\n" , p -> PID , p -> UID );

excute -> next = p -> next;

free(p);

}

}/*run*/

/*离开*/

int leave()

{

int COMMAND;

printf("Are you sure to leave? YES-(1), NO-(2)\n");

scanf("%d",&COMMAND);

if(COMMAND==1)

{clrscr();

exit(0);

}

if(COMMAND==2)

{printf("\n");

help();

}

}

int help()

{

printf("__________________________HELP

MENU____________________________\n");

printf("\t-h HELP show help option\n");

printf("\t-c CREATE create a new process , and put to really queue\n"); printf("\t-b BLOCK block a process in excute queue\n");

printf("\t-w WAKE wake a process in wait queue\n");

printf("\t-e EXCUTE excute a process in really queue\n");

printf("\t-o OUTPUT output all processes in queues\n");

printf("\t-r RUN excute a process in excute queue\n");

printf("\t-x EXIT exit this program\n");

printf("_____________________________________________________________ __\n");

printf("\t type 'H' will show this menu\n"); }

int main()

{

char COMMAND = NULL;

int i,m;

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"");

setbkcolor(LIGHTBLUE);

setcolor(21);

for(i=40;i<=600;i+=12)

{

rectangle(i,40,i+10,49);

rectangle(i,451,i+10,460);

}

for(i=40;i<=450;i+=12)

{

rectangle(40,i,49,i+10);

rectangle(601,i,610,i+10);

}

setcolor(14);

rectangle(150,100,475,250);

setcolor(11);

rectangle(145,93,480,258);

line(145,93,150,100);

line(480,258,475,250);

line(150,250,145,258);

line(475,100,480,93);

drawmat(han1S,16,200,150,BLUE);

delay(50000);

delay(20000);

drawmat(han2S,16,230,150,BLUE);

delay(50000);

delay(20000);

drawmat(han3S,16,260,150,BLUE);

delay(50000);

delay(20000);

drawmat(han4S,16,290,150,BLUE);

delay(50000);

delay(20000);

drawmat(han5S,16,320,150,BLUE);

delay(50000);

delay(20000);

drawmat(han6S,16,350,150,BLUE);

delay(50000);

delay(20000);

drawmat(han7S,16,380,150,BLUE);

delay(50000);

delay(20000);

drawmat(han8S,16,410,150,BLUE);

delay(50000);

delay(50000);

delay(50000);

drawmat(han9S,16,220,189,BLUE);

delay(50000);

delay(20000);

drawmat(han10S,16,250,189,BLUE); delay(50000);

delay(20000);

drawmat(han11S,16,280,189,BLUE); delay(50000);

delay(20000);

drawmat(han12S,16,310,189,BLUE); delay(50000);

delay(20000);

drawmat(han13S,16,340,189,BLUE); delay(50000);

delay(20000);

drawmat(han14S,16,370,189,BLUE); sleep(1);

drawmat(han7S,16,225,305,YELLOW); delay(50000);

drawmat(han8S,16,250,305,YELLOW); delay(50000);

drawmat(chu1S,16,275,305,YELLOW); delay(50000);

drawmat(chu2S,16,300,305,YELLOW); delay(50000);

drawmat(han15S,16,325,305,YELLOW); delay(50000);

drawmat(han16S,16,350,305,YELLOW); delay(50000);

drawmat(han17S,16,375,305,YELLOW); delay(50000);

delay(50000);

setcolor(11);

rectangle(179,337,439,362);

sleep(2);

setfillstyle(SOLID_FILL,YELLOW); for(i=0;i<130;i++)

{m=2*i;

delay(9000);

bar(180+m,338,182,361);

}

sleep(1);

drawmat(han15S,16,240,373,11); delay(10000000000);

drawmat(han16S,16,265,373,11); delay(10000000000);

drawmat(han17S,16,290,373,11); delay(10000000000);

drawmat(han18S,16,315,373,11); delay(10000000000);

drawmat(han19S,16,340,373,11);

getch();

closegraph();

if( init() != 1)

{

printf("init falied ! \n ");

getch();

exit(0);

}

else

{

printf("init...OK\n");

output();

help();

}

while(1)

{

/*当三队列都不空执行调度 */

printf(">");

scanf("%c",&COMMAND);

switch(COMMAND)

{

case '\n': break;

case 'H':

case 'h': help(); break;

case 'C':

case 'c': create(); break; case 'B':

case 'b': block(); break; case 'W':

case 'w': wake(); break;

case 'E':

case 'e': fexcute(); break; case 'O':

case 'o': output(); break; case 'X':

case 'x': leave(); break; case 'R':

case 'r': run(); break; }

}

}

操作系统实验报告--实验一--进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

进程管理模拟实验指导书09

进程管理模拟系统实验指导书2 一、实验目的 学习进程管理的设计与实现,学习和运用操作系统原理,设计一个操作系统子系统的模拟系统。通过该系统的设计调试可增加对操作系统实现的感知性。同时可发挥团队协作精神和个人创造能力。使同学们对操作系统学习有一个实现的尝试和创新的思维。 二、实验规则 1.每组设计一个模拟系统(共100分) 2.每人设计系统中的一部分(满分60分) 3.集体调试创意(满分40分) 三、实验要求 1.进程管理功能以进程调度为主要功能。以进程控制为辅助功能。 2.体现操作系统原理中进程调度算法和进程控制算法。按照操作系统原理设计。 3.结构化设计。设计时构建出模块结构图并存于文件中。模块化实现,对每一功能,每一操作使用模块、函数、子程序设计方法实现。 4.进程以PCB为代表。队列、指针用图示。每一步功能在桌面上能显示出来。 5.系统应具有排错功能,对可能出现的错误应具有排查功能和纠错能力。 6.界面自行设计,语言自行选择。(可用VC/C++/C/C#语言,也可用你会的其他语言,甚至还可用PPT) 7.每人的设计功能都能表现或说明出来。 8.进程以队列法组织,对不同进程调度算法: FIFO队列或PRI队列或rotate(轮转队列)用同一个进程序列组织,对阻塞队列可设置一个,也可设多个。 9.因为是模拟系统,所以要显示每个功能和操作结果。显示应力求清晰、易读和一目了然(一屏),最好能用汉字,否则可用英语或汉语拼音。 10.操作方便,使用便捷。可视化程度高。 11.设计出系统后,还需要写出(介绍系统采用的语言、支撑平台、小组成员及分工。如何安装、如何启动、如何操作) 12.每组需写一份课程设计报告,内容包括:课程设计内容,课程设计设计思路,课程设计结构图,及分工内容、介绍。 13. 实验结果演示验收后,将可在任何环境下运行的可执行文件和系统说明书一起存盘并交盘。(可合组一张盘),上标:班级、组号、姓名。 14. 实验结束后从中选出优秀作品,介绍给大家。 四、系统功能 1.创建进程:主要创建PCB,并在创建后显示PCB及所在RL队列。内容包括①标识数(按产生顺序产生),②进程名(字母序列),③优先数(随机产生),④进程状态,⑤队列指针(可用数字或图表示),⑥其它(可自定义:如运行时间、家族等)。创建进程的个数可人工设定,或可自动设定,也可两者兼有。 2.撤销进程:撤销进程主要显示PCB的消失和队列的变化。 3.进程队列的组织:进程队列可对创建的所有进程变化队形:可组织成FIFO队列,也可组织成PRI队列;或rotate队列,对队列有插入、移出的功能,也有在队列中某位置插入删除功能。 4.显示功能:模拟系统在整个演示过程中都需要可视化,因此显示功能非常重要,要求对队列、PCB每次操作前后予以显示,以表示操作功能的实施效果。

操作系统-实验三-进程管理-实验报告

计算机与信息工程学院实验报告 一、实验内容 1.练习在shell环境下编译执行程序 (注意:①在vi编辑器中编写名为sample.c的c语言源程序 ②用linux自带的编译器gcc编译程序,例如:gcc –o test sample.c ③编译后生成名为test.out的可执行文件; ④最后执行分析结果;命令为:./test) 注意:linux自带的编译程序gcc的语法是:gcc –o 目标程序名源程序名,例如:gcc –o sample1 sample1.c,然后利用命令:./sample 来执行。如果仅用“gcc 源程序名”,将会把任何名字的源程序都编译成名为a.out的目标程序,这样新编译的程序会覆盖原来的程序,所以最好给每个源程序都起个新目标程序名。 2.进程的创建 仿照例子自己编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和“c”。观察记录屏幕上的显示结果,并分析原因。 3.分析程序 实验内容要在给出的例子程序基础上,根据要求进行修改,对执行结果进行分析。二、

实验步骤 1. 利用fork()创建一个小程序 (1)编写程序 #include main () { int i=5; pid_t pid; pid=fork(); for(;i>0;i--) { if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("i am the child process, my process id is %d and i=%d\n",getpid(),i); else printf("i am the parent process, my process id is %d and i=%d\n",getpid(),i); } for(i=5;i>0;i--) { if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("the child process, my process id is %d and i=%d\n",getpid(),i); else printf("the parent process, my process id is %d and

实验1_进程管理

实验一进程管理 【实验目的】 1.加深对进程概念及进程管理各部分内容的理解。 2.熟悉进程管理中主要数据结构的设计和进程调度算法、进程控制机构、同步机构、通讯机构的实施。 【实验要求】 1.调试并运行一个允许n 个进程并发运行的进程管理模拟系统。了解该系统的进程控制、同 2.步及通讯机构,每个进程如何用一个PCB 表示、其内容的设置;各进程间的同步关系;系统在运行过程中显示各进程的状态和有关参数变化情况的意义。 【实验环境】 具备Windows或MS-DOS操作系统、带有Turbo C 集成环境的PC机。 【实验重点及难点】 重点:理解进程的概念,进程管理中主要数据结构的设计和进程调度算法、进程控制 机构、同步机构、通讯机构的实施。 难点:实验程序的问题描述、实现算法、数据结构。 【实验内容】 一.阅读实验程序 程序代码见【实验例程】。 二.编译实验例程 用Turbo C 编译实验例程。 三.运行程序并对照实验源程序阅读理解实验输出结果的意义。 【问题与讨论】 系统为进程设置了几种状态?说明这些状态的含义。 三种。就绪、执行、阻塞。就绪:处于就绪状态的进程已经得到除 CPU之外的其他资源,只要由调度得到处理机,便可立即投入执行。执行:只有处于内存就绪状态的进程在得到处理机后才能立即投入执行。阻塞:进程因等待某个事件发生而放弃处理机进入等待状态。 采用何种方式来模拟时间片?简要说明实现方法。 系统分时执行各进程,并规定3个进程的执行概率均为33%。通过产生随机数x来模拟时间片。当进程process1访问随机数x时,若x ≥0.33;当进程process2访问x时,若x<0.33或x≥0.66;当进程process3访问x时,若x<0.66,分别认为各进程的执行时间片到限,产生“时间片中断”而转入低就绪态t。 进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。先从r状态进程中选择,在从t状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。 各进程在使用临界资源s1和s2时,通过调用信号量sem1和sem2上的P,V操作来实现同步,阻塞和唤醒操作负责完成从进程的执行态到等待态到就绪态的转换。 系统启动后,在完成必要的系统初始化后便执行进程调度程序。但执行进程因“时间片中断”,或被排斥使用临界资源,或唤醒某个等待资源时,立即进行进程调度。当3个进程都处于完成状态后,系统退出运行 由于输出结果较多,一屏显示不完,如何较好地阅读程序输出? 一是在程序中控制输出的行数,比如20行,输出后用gets停顿一下,继续时回车即可;

模拟进程管理

操作系统课程设计报告 院系:计算机科学技术 班级:计092班 姓名:杨志 学号:17 号 指导教师:鲁静轩__________ 2011 年12 月10 日

操作系统课程设计任务书 一、设计题目:模拟进程管理 二、设计目的 《操作系统原理》课程设计是软件工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。 三、设计要求 (1)选择课程设计题目中的一个课题,独立完成。 (2)良好的沟通和合作能力 (3)充分运用前序课所学的软件工程、程序设计等相关知识 (4)充分运用调试和排错技术 (5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。 (7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。 四、设计内容 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。 2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的模块。 4.程序调试与测试。采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。 6.编写课程设计报告; 设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容 设计报告的格式: (1)封面(题目、指导教师、专业、班级、姓名、学号) (2)设计任务书 (3)目录 (4)需求分析 (5)概要设计 (6)详细设计(含主要代码) (7)调试分析、测试结果 (8)用户使用说明 (9)附录或参考资料

兰州大学操作系统实验八存储管理模拟题目和答案实验报告

实验报告实验八 实验名称: 存储管理模拟 实验目的: 1.掌握请求分页存储管理系统的基本原理 2.实现一个模拟的虚拟分页存储管理系统 实验要求: 编写一个程序,模拟一个虚拟分页存储管理系统。其中,由系统随机产生进程; 进程大小、进程到达次序、时间、进程执行轨迹(页面访问顺序)也随机生成,但进程之间必须有并发存在,进程执行时间需有限,进程调度采用时间片轮转算法(以页面模拟);rss驻留集大小物理块分配策略采取固定分配局部置换;分配算法采用按比例分配算法;调页采用请求调页方式;置换分别采用FIFO、LRU(一直没用) 访问次数和简单CLOCK算法(循环链表)标志有没有被访问; 驻留集大小可调,观察驻留集大小对缺页率的影响。 算法思想: FIFO 先进先出法 LRU 最久未使用算法 CLOCK 简单时钟算法 命中率=1-页面失效次数/页地址流(序列)长度 驻留集大小可调,观察驻留集大小对缺页率的影响。

结构体定义 包含链表:空闲页面表忙页面表包含数组:进程数组页面号数组

流程图:

实验结果分析: 观察数据可看出:横向:三种替换算法的命中率由高到底排列应该是LRU>CLOCK>FIFO。 纵向:进程的驻留级越大,其缺页率就越低。

实验体会: 1.存中进程的多少会影响驻留集大小和缺页中断率。 如果存中进程太多,将导致每个进程的驻留集太小,发生缺页中断的概率很大。 相应地,系统发生抖动的可能性就会很大。 如果在存中保持太少的活动进程,那么所有活动进程同时处于阻塞状态的可能性就会很大,从而降低处理机的利用率。 2.置换算法的好坏将直接影响系统的性能,不适当的置换算法可能导致系统出现“抖动” 现象。常用的页面置换算法:最佳置换算法、最近最少使用算法、先进先出算法和时钟算法等。最佳置换算法难以实现但可以成为核对其他算法的标准。 3.也应注意负载问题,解决系统应当保持多少个活动进程驻留在存的问题,即控制多道程 序系统的度。当存中的活动进程数太少时,负载控制将增加新进程或激活一些挂起进程进入存;反之,当存中的进程数太多时,负载控制将暂时挂起一些进程,减少存中的活动进程数。 实验代码: #include #include #include #include #define TRUE 1 #define FALSE 0 #define INVALID -1 #define total_instruction 320 //指令流长 #define total_vp 32 //页长 #define clear_period 50 typedef struct //页面结构 { int pn, //页面序号 pfn, //页面所在存区的页框号 counter, //单位时间访问次数 time; //上次访问的时间 }pl_type; pl_type pl[total_vp]; //页面结构数组 struct pfc_struct{ //页面控制结构 int pn, //页面号 pfn; //存区页面的页框号 struct pfc_struct *next; //页面指针,用于维护存缓冲区的链式结构 }; typedef struct pfc_struct pfc_type; //主存区页面控制结构别名 pfc_type pfc[total_vp], //主存区页面控制结构数组

进程管理实验报告

实验名称: 进程管理 实验要求:阅读后面的C语言实例,修改程序,使其优先数在运行期间可以变化(动态优先 数)。例如,当某进程被时间片中断次数增加到一定数目时,提高其优先权。关键问题:读懂源程序代码,了解进程管理的方式,并设计一个算法使程序能在运行过程中修改进程优先级。 设计思路:在进程控制块中定义一个记录进程中断次数的变量,在block函数中设置跟踪并 记录进程中断次数,在调度函数schedule中设置算法,在进程中断3次后将该 进程的优先级提升至最高。 改动后的代码: #include #define TRUE 1 #define FALSE 0 #define MAXPRI 100 #define NIL -1 //进程控制块 struct { int id; //进程号 char status; //进程状态,'e'-执行态'r'-高就绪态't'-低就绪态'w'-等待态'c'-完成态 int nextwr; //等待链指针,指示在同一信号量上等待的下一个等待进程的进程号。 int priority; //进程优先数,值越小,优先级越高。 int c;//进程中断次数 }pcb[3];//共3个进程 //s1、s2为三个进程共享的变量;seed为随机值;registeri模拟寄存器值,存放计算的重复次数。 int registeri,s1,s2,seed,exe=NIL;//exe为当前运行(占有cpu)的进程号 //2个信号量sem[0]、sem[1],分别与共享变量s1、s2相联系。 //对应信号量sem[0]、sem[1]分别有两个阻塞队列,队列首由sem[].firstwr指定,队列链指针是pcb[].nextwr struct{ int value;//信号量值 int firstwr;//等待该信号量的阻塞队列的首个进程号 }sem[2];

进程管理实验报告

计算机操作系统教程(第4版)习题解答与实验指导: 《计算机操作系统教程(第4版)习题解答与实验指导》是2014年清华大学出版社出版的图书,作者是张尧学。 内容简介: 本书是作者在清华大学计算机系多年教学经验和科研成果的基础上,配合清华大学计算机系列教材之一的《计算机操作系统教程》(第4版)而编写的相关习题解答和实验指导。全书分为两大部分:第一部分是《计算机操作系统教程》(第4版)中各章习题的参考解答和部分硕士研究生入学考试用题及解答;第二部分为清华大学计算机系操作系统课程教学用实验指导及相应的程序设计与源代码分析。实验主要设计在Linux环境下用C语言编程完成,也可在UNIX系统Ⅴ或其他更高版本的UNIX环境下完成。 本书既可作为计算机专业和其他相关专业操作系统课程的补充教材,也可供有关人员自学,或供操作系统等系统设计人员阅读和参考。 目录: 第一部分习题解答1 第1章绪论3 第2章操作系统用户界面5 第3章进程管理9 第4章处理机调度21 第5章存储管理27

第6章进程与存储管理示例33 第7章Windows的进程与内存管理37 第8章文件系统43 第9章设备管理49 第10章Linux文件系统53 第11章Windows的设备管理和文件系统56 第12章嵌入式操作系统简介59 综合试题61 操作系统综合练习试题161 操作系统综合练习试题1解答62 操作系统综合练习试题264 操作系统综合练习试题2解答65 操作系统综合练习试题368 操作系统综合练习试题3解答68 第二部分实验指导71 系统调用函数说明、参数值及定义73 实验1进程管理80 实验2进程间通信82 实验3存储管理83 实验4文件系统设计85 实验1指导86 实验2指导94

操作系统进程管理实验报告

********实验报告纸 计算机科学与工程学院(院、系)网络工程专业083 班组操作系统课 实验一、进程管理(3学时、必做) 一、实验目的 通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。基本能达到下列具体的目标: 1、理解进程 PCB 的概念,以及 PCB 如何实现、如何组织以及管理。 2、复习数据结构中如何对链的操作,包括建链、删除、插入结点等,来实现进程的管 理。 二、实验内容 1、建立一个结点,即 PCB 块包括用户标识域、状态域(执行、等待、就绪)、 link 域。 2、建立三个队列(执行队列、就绪队列、等待队列)。 3、根据进程状态转换实现对三个队列的具体操作。具体的驱动可以采用时间片算法或 手动调度的形式完成三个状态之间的转换 4、用 switch 选择语句选择状态。 5、按照自己的设定能完成所有的状态转换的运行(包括创建和运行结束)。 三、实验步骤 1、复习进程管理三状态模型部分内容。 2、预习C++ Builder或VC++、Delphi、JBuilder线程编程。 3、运行示例程序,进一步明确实验要求。可以采用控制台模式或窗口模式。 4、上机编程、调试程序。 5、完成实验报告。 四、实验过程 1、进程管理三状态模型部分内容

进程从因创建而产生直至撤销而消亡的整个生命周期中,有时占用处理器执行,有时虽然可以运行但分不到处理器,有时虽然处理器空闲但因等待某个事件发生而无法执行,这一切都说明进程和程序不同,进程是活动的且有状态变化,状态及状态之间的转换体现进程的动态性,为了便于系统管理,一般来说,按照进程在执行过程中的不同情况至少要定义三种进程状态。 (1)运行态:进程占用处理器运行的状态。 (2)就绪态:进程具备运行条件,等待系统分配处理器以便起运行的状态。 (3)等待态:进程不具备运行条件,正在等待某个时间完成的状态。 2、程序设计环境 3、程序界面设计 本实验的目的不在界面的创新,所以界面的设计模仿示例程序二,程序界面设计如下: 图 1. 程序界面设计 界面中的元件包括:标题、队列管理、进程状态转换操作、进程转换示意图、作者及版本信息。各元件的设计具体如下:

操作系统实验报告实验一进程管理.docx

. 实验一进程管理 一、目的 程度是理机管理的核心内容。本要求写和一个的程度程序。通本 加深理解有关程控制、程列的概念,并体会和了解程度算法的具体施法。 二、实验内容及要求 1、程控制PCB 的构( PCB 构通常包括以下信息:程名(程ID )、程先数、 片、程所占用的CPU 、程的状、当前列指等。可根据的不同,PCB 构的内容可以作适当的增)。了便于理,程序中的某程运行以片位算。各程的 数以及程需运行的片数的初始均由用定。 2 、系源( r1?r w),共有w,每数目r1? r w。随机生 n程 P i( id,s(j,k) ,t),0<= i<= n,0<= j<=m,0<=k<=dt 运行,在运行程中,会随机申新的源。 3、每个程可有三个状(即就状W 、运行状R、等待或阻塞状B),并假初始状 就状。建立程就列。 4、制程度算法:片度算法 本程序用算法 n 个程行度,程每行一次,CPU 片数加 1,程需要的片 数减 1。在度算法中,采用固定片(即:每行一次程,程的行片数已行了1个位),, CPU 片数加 1,程需要的片数减1,并排列到就列的尾上。 三、实验环境 操作系境:Windows 系。 程言: C# 。 四、实验思路和设计 1、程序流程

. 开始 对进程进行初始化,建立就绪队列、阻塞队列。Input() 触发时钟,调用时间片轮转调度算法。runFcfs() 是 就绪队列为空?结束 否 输出就绪队列和阻塞队列的信息。 outputall() 取就绪队列的第一个进程,判断其运行的时间片 是否达到所需次数。如果达到,则释放资源 如果没达到,则运行一个时间片。running() 检查阻塞队列,对于当前资源数目满足阻塞队列的进程, 由阻塞转入就绪队列。testblock() 检查是否有新进程产生,如果有,则判断系统资源是否 够用,如果够用,则分配给该进程,插入就绪队列。如 果不够用,则插入阻塞队列。testnew() 显示三类资源情况。rescore()

操作系统实验(模拟进程管理)

操作系统实验 ————(1)模拟进程管理 专业:信息管理与信息系统 班级:信管082 姓名:温静

实验一进程管理 1.目的和要求 通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。 2.实验内容 用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。 3.主体程序 #include #include #include struct PCB_type { int pid; int priority; int cputime; int state; int shumu=0,pid_l; struct PCB_type neicun[20]; struct PCB_type hc[10]; int max=0;int number=0; void create(); void run(); void huanchu(); void kill(); /* 创建新进程*/ void create() { if(shumu>=20) { printf("\n内存已满,请先结束或换出进程\n");

} else { shumu++; printf("\n请输入新进程的程序名\n"); scanf("%d",&neicun[shumu-1].pid); printf("\n请输入新进程的优先级\n"); scanf("%d",&neicun[shumu-1].priority); printf("\n请输入新进程的运行时间\n"); scanf("%d",&neicun[shumu-1].cputime); printf("\n创建进程时令其状态为就绪\n"); neicun[shumu-1].state=2; } printf("\n创建进程成功!\n"); } /* 查看当前运行进程*/ void run() { int max=0; for(int i=0;i=neicun[max].priority)) max=i; } neicun[max].state=3; printf("当前运行进程程序名:\n%d",neicun[max].pid); printf("\n该进程的优先级:\n%d",neicun[max].priority); printf("\n该进程的运行时间:\n%d",neicun[max].cputime); printf("\n该进程的状态:\n%d",neicun[max].state); } /* 换出*/ void huanchu() { int k; printf("请输入要换出程序的程序名:"); scanf("%d",&k); for(int j=0;j

进程管理_实验报告

实验一 课程名称:操作系统 课程类型:必修 实验项目名称:进程管理 实验题目:短作业优先算法、动态可剥夺优先数算法和基本循环轮转算法。 一、实验目的 进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实验要求学生独立的用高级语言编写和调试一个简单的模拟进程调度的程序。通过本实验,加深学生理解有关进程控制块、进程队列的概念,并体会和了解短作业优先、优先数和时间片轮转调度算法的具体实施办法。 二、实验要求及实验环境 (1)设计一个有n 个进程的进程调度程序(具体个数可由键盘输入)。每一个进程用一个进程控制块PCB 来代表。PCB 中应包含下列信息:进程名、进程优先数、进程的状态、进程需要运行的时间及利用CPU运行的时间等。进程的个数、各进程的优先数、轮转时间片数以及进程运行需要地时间可由

键盘输入。 (2)调度程序应包含2~3 种不同的调度算法,运行时可任选一种。 (3)每个进程处于运行Run、就绪ready 和完成Finish 三种状态之一,假定初始状态都为就绪状态ready。(也可没有Finish状态,可以在设计程序时实现处以Finish状态的进程删掉)。 (4)系统能显示各进程状态和参数的变化情况。(5)动态可剥夺优先数算法是:在创建进程时给定一个初始的优先数,当进程获得一次cpu后其优先数就减少1,如果就绪队列中有优先级更高的将剥夺运行中的进程。 三、设计思想 (本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系) 1.程序流程图 (见下图) 2.逻辑设计 使用链表表示就绪队列,每个元素包括进程名、进程优先数、进程的状态、进程需要运行的时间及利用CPU运行的时间等信息。 该结构需支持以下操作:取头节点,在表尾插入节

操作系统实验二 进程管理

操作系统实验 实验二进程管理 学号 姓名 班级 华侨大学电子工程系

实验目的 1、理解进程的概念,明确进程和程序的区别。 2、理解并发执行的实质。 3、掌握进程的创建、睡眠、撤销等进程控制方法。 实验内容与要求 基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。 实验报告内容 1、进程、进程控制块等的基本原理。 进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。 进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下: 由于多个程序并发执行,各程序需要轮流使用CPU,当某程序不在CPU上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得CPU时,能够正确执行。为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块PCB (Process Control Block)。 进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。当创建一个进程时,实际上就是为其建立一个进程控制块。 在通常的操作系统中,PCB应包含如下一些信息: ①进程标识信息。为了标识系统中的各个进程,每个进程必须有惟一的标识名或标 识数。 ②位置信息。指出进程的程序和数据部分在内存或外存中的物理位置。 ③状态信息。指出进程当前所处的状态,作为进程调度、分配CPU的依据。 ④进程的优先级。一般根据进程的轻重缓急其它信息。 这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。

进程管理模拟实验

进程管理 一、目的与要求 1.目的 进程是操作系统最重要的概念之一,是了解操作系统实质的关键。本课题实习的目的是,加深对进程概念及进程管理各部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构、通讯机构的实施。 2.要求 要求设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括以下内容:(1)简单的进程控制(2)同步及通讯机构(3)中断机构(4)进程调度。其进程调度算法可任意选择。每个进程用一个PCB表示,其内容可根据具体情况设置。各进程之间有一定的同步关系。系统在运行过程中应能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。 二、范例 1.题目支持多个进程并发运行的简单进程管理模拟系统 本系统的同步机构采用信号量上的P、V操作的机制;控制机构包括阻塞和唤醒操作;时间片中断处理程序模拟时间片中断;进程调度程序负责为各进程分配处理机。系统中涉及了3个并发进程。它们之间的关系是:3个进程需要互斥使用临界资源S2,进程1和进程2又需互斥使用临界资源S1.本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。 2.算法与N~S图 系统为进程设置了5种运行状态:e—执行态;r—高就绪态;t—低就绪态(执行进程因时间片到限而转入);w—等待态;c—完成态。各进程的初始状态均设置为r. 系统分时执行各进程,并规定3个进程的执行概率均为33%。通过产生随机数x来模拟时间片。当进程process1访问随机数x时,若x>=0.33;当进程process2访问x时,若x<0.33或x>=0.66;当进程process3访问x时,若x<0.66,则分别认为各进程的执行时间片到限,产生“时间片中断”而转入低就绪态t。 进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。先从r状态进程中选择,再从t状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。 各进程在使用临界资源S1和S2时,通过调用信号量sem1和sem2上的P、V操作来实现同步。阻塞和唤醒操作负责完成从进程的执行态到等待态以及从等待态到就绪态的转换。 系统启动后,在完成必要的系统初始化后便执行进程调度程序。当执行进程因“时间片中断”,或被排斥使用临界资源,或唤醒某个进程时,立即进行进程调度。当3个进程都处于完成状态后,系统退出运行。 N-S图在此显示不出。

实验一 进程管理

实验一进程管理 一、实验目的 ⒈加深对进程概念及进程管理各部分内容的理解; ⒉熟悉进程管理中主要数据结构的设计及进程调度算法; 二、实验要求 ⒈设计一个允许n个进程并发运行的进程调度模拟系统。 ⒉该系统包括有简单的进程控制、同步及通讯机构,其进程调度算法可以任意选择。 ⒊每个进程用一个PCB表示,其内容可根据具体情况设置。 ⒋各进程之间应有一定的同步关系(可选)。 ⒌系统在运行过程之中应能显示或打印各进程的状态及有关参数的变化情况。 三、实验题目和内容 编写一个支持多个进程并发运行的简单进程调度模拟系统。 构造进程控制块,根据用户的输入信息,创建相应的进程,并初始化进程控制块中相关信息,建立相应的进程状态队列,并根据进程状态将其排列在相应队列中。分别采用不同的调度算法(短作业优先,高优先级优先,高相应比优先)对创建的进程进行调度。对不同的调度算法,建立相应的调度函数。系统在运行过程中随即打印各进程的状态变换过程,系统的调度过程及公共变量的变化情况。 实验二银行家算法(选做) 一、实验目的 1.了解死锁产生的必要条件。 2.了解安全序列的定义和意义以及如何在动态分配资源的过程中采用死锁避免算法防止系统进入不安全序列状态。 3.掌握Dijkstra银行家算法的具体实现。 二、实验要求 熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。 三、实验题目和内容 模拟实现银行家算法以避免死锁的出现。 建立相应的数据结构(系统中每类资源的总量,进程对各类资源的最大需求量矩阵,资源已分配情况矩阵)根据用户的输入信息,完成数据的初始化,随机输入用户的资源需求申请,调用安全性算法得出此次资源申请是否安全的结论,若安全,输出安全序列,否则,不予分配。

实验二-实验报告(进程管理)

实验二模拟实现进程管理 组长:李和林软件1402 一、实验目的 1.理解进程的概念,明确进程和程序的区别。 2.理解并发执行的实质。 3.掌握进程的创建,睡眠,撤销等进程控制方法。 二、实验内容 用C语言,JAVA语言,C++语言编写程序,模拟实现创建新的进程;查看运行进程,换出某个进程;杀死运行进程。 三、实验准备 1.进程的定义 进程是程序在一个数据集合上的运行过程,是系统资源分 配和调度的一个独立单位。一个程序在不同的数据集合上 运行,乃至一个程序在同样数据集合上的多次运行都是不 同的进程。 2.进程的状态 通常情况下,一个进程必须具有就绪,执行和阻塞三种基本

情况。 1)就绪状态 当进程已分配到除处理器外的所有必要资源后,只要再 获得处理器就可以立即执行,这时进程的状态就为就绪 状态。在一个系统里,可以有多个进程同时处于就绪状 态,通常把这些就绪进程排成一个或多个队列,称为就 绪队列。 2)执行状态 处于就绪状态的进程一旦获得处理器,就可以运行,进 程状态也就处于执行状态,在单处理器系统中,只能有 一个进程处于执行状态,在多处理器系统中,则可能有 多个进程处于执行状态 3)阻塞状态 正在执行的进程因为发生某些事件而暂停运行,这种受 阻暂停的状态称为阻塞状态,也可称为等待状态。通常 将处于阻塞状态的进程拍成一个队列,称为阻塞队列, 在有些系统中,也会按阻塞原因的不同将阻塞状态的进 程排成多个队列。 3.进程状态之间的转换

4.进程控制块 1)进程控制块的作用 进程控制块是进程实体的重要组成部分,主要包含下述四个方面的信息: a)进程标示信息 b)说明信息 c)现场信息 d)管理信息 5.进程控制块的组织方式 1)链接方式 2)索引方式 6.进程控制原语 1)创建原语 2)撤销原语 3)阻塞原语 4)唤醒原语 7.程序代码 #include #include usingnamespace std; void clrscr(); void create(); void run( ); void exchange( );//唤出 void kill( ); void wakeUp( );//唤醒 struct process_type{

操作系统课程设计(进程管理)-参考模板

操作系统课程设计报告 题目: 专业: 班级: 姓名: 学号: 指导老师: 年月日

《操作系统》课程设计任务书 一、课程设计题目(任选一个题目) 1.模拟进程管理 2.模拟处理机调度 3.模拟存储器管理 4.模拟文件系统 5.模拟磁盘调度 二、设计目的和要求 1.设计目的 《操作系统原理》课程设计是计算机科学与技术专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。 2.基本要求: (1)选择课程设计题目中的一个课题,独立完成。 (2)良好的沟通和合作能力 (3)充分运用前序课所学的软件工程、程序设计、数据结构等相关知识 (4)充分运用调试和排错技术 (5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。 (7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。 三、设计内容及步骤 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。

2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的模块。 4.程序调试与测试。采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。 6.编写课程设计报告; 设计报告和实验报告要求:A4纸和实验报告册,详细设计部分主要叙述本人的工作内容 设计报告的格式: (1)封面(题目、指导教师、专业、班级、姓名、学号) (2)设计任务书 (3)目录 (4)需求分析 (5)概要设计 (6)详细设计(含主要代码) (7)调试分析、测试结果 (8)用户使用说明 (9)附录或参考资料 四、进度安排 设计在第四学期的第1-18周(共18课时)进行,时间安排如下:

实验一二 进程管理

实验一 Linux的命令控制界面和编程界面(1学时) 实验目的 (1)熟悉Linux下的基本操作,学会使用各种Shell命令去操作 Linux,对Linux 有一个感性认识。 (2)熟悉使用Linux的编程接口,即系统调用。 (3)学会使用编辑器编辑简单的C语言程序,并能对其编译和调试。 实验内容 (1)使用Login,Logout等命令实现系统的访问 (2)以root用户身份登陆,并使用“ls”,“cat”“cd”等命令来实现基本的文 件操作并观察Linux文件系统的特点; (3)使用编辑器编写一个C程序,并用gcc命令进行编译和链接,并用a.out来 进行输出结果。 实验指导 一、登陆Linux 进入,再选择Ubuntu登陆窗口,进入Ubuntu图形桌面环境。二、熟悉Ubuntu图形桌面环境 桌面包含上方的菜单栏和下方的任务栏。菜单栏包含“应用程序菜单”、“位置”、“系统”。通过主菜单可访问应用程序。 (1) “应用程序”菜单 “应用程序”菜单包含“办公”、“附件”、“互联网”、“图形”、“游戏”等。 “办公”包含了文字处理及电子表格等应用程序。 “附件”下包含了“搜索工具”、“计算器”、“文本编辑器”和“终端”等应用程序。(2)“位置”菜单 “位置”菜单包含“主文件夹”、“桌面”等信息。 (3)“系统”菜单

“系统”菜单包含“首选项”和“系统管理”等信息。 (4)启动终端模拟器 GNOME终端模拟器用一个窗口来模拟字符终端的行为。终端常常被称为命令行或者shell,Linux 中绝大部分工作都可以用命令行完成。要启动一个终端,可以选择应用程序→ 附件→ 终端。 三、练习常用的Shell命令。 当用户登录到字符界面系统或使用终端模拟窗口时,就是在和称为shell的命令解释程序进行通信。当用户在键盘上输入一条命令时,shell程序将对命令进行解释并完成相应的动作。这种动作可能是执行用户的应用程序,或者是调用一个编辑器、GNU/Linux实用程序或其他标准程序,或者是一条错误信息,告诉用户输入了错误的命令。 1.目录操作 mkdir abc 创建一个目录abc cd abc 将工作目录改变到abc cd 改变当前目录到主目录 ls 列出当前目录的内容 ls -l 输出当前目录内容的长列表,每个目录或文件占一行 pwd 显示当前目录的全路径 2.文件显示实用程序 cat mx.c 显示mx.c文件内容 more mx.c 分屏显示mx.c内容 tail mx.c 显示文件后几行 cat file1 file2 连接file1 和file2 head filename 显示文件filename的开始10行 wc filename 统计文件filename中的行数、单词数和字符数 od 文件查看非文本文件 3.文件管理实用程序 cp file1 file2 将文件1复制到文件2 mv file1 file2 将文件重命名为file2 rm filename 删除文件filename rm -i filename 请求用户确认删除 4.数据操作实用程序 tty 显示当前终端的路径和文件名 who 显示当前登录用户的列表 sort filename 显示文件filename中的行的排序结果 spell filename 检查文件filename中的拼写错误 5.其他实用程序 date 输出系统日期和时间 cal 显示本月的日历。cal 2002 显示2002年的日历 clear 清除终端屏幕

相关文档
最新文档