1、操作系统实验-进程状态转换及其 PCB 的变化1. 目的:自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的 PCB 内容 、组织的变化,理解进程与其 PCB 间的一一对应关系。2. 内容及要求:1) 设计并实现一个模拟进程状态转换及其相应 PCB 内容、组织结构变化的程序。2) 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及 PCB 的组织形式可自行选择。3) 合理设计与进程 PCB 相对应的数据结构。 PCB 的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。4) 设计出可视性较好的界面,应能反映出进程状
2、态的变化引起的对应 PCB 内容、组织结构的变化。5) 代码书写要规范,要适当地加入注释。6) 鼓励在实验中加入新的观点或想法,并加以实现。7) 认真进行预习,完成预习报告。8) 实验完成后,要认真总结,完成实验报告。3. 程序流程图4.代码部分(1) 数据结构部分进程结构体struct PCBchar P_name10;int P_id; int P_state;int needtime;int lefttime;int P_level;进程结构体有:进程号,进程状态,进程剩下的时间,进程需要的时间,进程的优先级队列结构体struct QueuePCB qNode5;int queueLen
3、gth;定义的队列最多有 5 个进程。(2)程序解释这里做的是对操作系统课程里面将的“3 状态”的模型的模拟,给它提供的初始状态是有 5 个进程,而进程所需要的时间和进程的状态都是随机产生的,并把就绪队列里面的进程按照进程的优先级(P_level)进行排序,设置初始状态时没有在运行的程序。(3)程序的代码/#include #include #include #include struct PCBchar P_name10;int P_id;int P_state;int needtime;int leavetime;int P_level;struct QueuePCB qNode5;int
4、 queueLength;int insertQueue(Queue *q,PCB *p)int i=0;if (q-queueLength=0)q-qNodei=*p;q-queueLength+;return 1;elsewhile(p-P_levelqNodei.P_level)i+;for (int j=q-queueLength;j=i;j-)q-qNodej=q-qNodej-1;q-qNodei=*p;q-queueLength=q-queueLength+1;return 1;void setQueue(PCB pcb5,Queue *ready,Queue *blocked,
5、Queue *finish)ready-queueLength=0;blocked-queueLength=0;finish-queueLength=0;for (int i=0;iqNodeblocked-queueLength=pcbi;blocked-queueLength+;void show(Queue ready,Queue blocked,Queue fininsh,PCB run)printf(“n 完成队列n“);printf(“进程名- 优先级- 所需时间-剩余时间n“);for (int i=0;ifininsh.queueLength;i+)printf(“%s%d %
6、d %d%dn“,fininsh.qNodei.P_name,fininsh.qNodei.P_id,fininsh.qNodei.P_level,fininsh.qNodei.needtime,fininsh.qNodei.leavetime);printf(“n“);if (run.needtime!=0)printf(“当前正在运行的进程:n“);printf(“进程名-优先级-所需时间- 剩余时间 n“);printf(“%s%d %d %d%dn“,run.P_name,run.P_id,run.P_level,run.needtime,run.leavetime);printf(“
7、n“);printf(“就绪队列n“);printf(“进程名-优先级-所需时间- 剩余时间 n“);for ( i=0;iready.queueLength;i+)printf(“%s%d %d %d%dn“,ready.qNodei.P_name,ready.qNodei.P_id,ready.qNodei.P_level,ready.qNodei.needtime,ready.qNodei.leavetime);printf(“n“);printf(“阻塞队列n“);printf(“进程名-优先级-所需时间- 剩余时间 n“);for (i=0;iblocked.queueLength;
8、i+)printf(“%s%d %d %d%dn“,blocked.qNodei.P_name,blocked.qNodei.P_id,blocked.qNodei.P_level,blocked.qNodei.needtime,blocked.qNodei.leavetime);void P_levelRun(Queue ready,Queue blocked,Queue finish,PCB run)int i_blocked=0;int i_finish=0;while(finish.queueLength!=5)printf(“*n“);int i_ready=0;if (run.ne
9、edtime!=0)run.leavetime-;if (run.needtime!=0finish.queueLength+;i_finish+;run.needtime=0;if (ready.queueLength!=0)run=ready.qNodei_ready;for (;i_readyready.queueLength;i_ready+)ready.qNodei_ready=ready.qNodei_ready+1;ready.queueLength=ready.queueLength-1;elseint temp=run.P_id;if (run.P_level=ready.q
10、Node0.P_level)insertQueue(run.needtime=0;printf(“时间片用尽,%s%d 进入就绪队列,优先级更高的%s%d 开始运行!n“,run.P_name,run.P_id,ready.qNode0.P_name,ready.qNode0.P_id);elseprintf(“时间片用尽,但是没有更高优先级的进程, %s%d 继续运行n“,run.P_name,run.P_id);else if (run.needtime=0)if (ready.queueLength!=0)run=ready.qNodei_ready;for (;i_readyready
11、.queueLength;i_ready+)ready.qNodei_ready=ready.qNodei_ready+1;ready.queueLength=ready.queueLength-1;if (blocked.queueLength!=0)srand(int) time(0);int temp=rand()%2;if (temp=1)printf(“n%s%d 所需资源产生,进程从阻塞队列转到就绪队列n“,insertQueue(blocked.queueLength=blocked.queueLength-1;if (blocked.queueLength!=0)for (in
12、t i=0;iblocked.queueLength+1;i+)blocked.qNodei=blocked.qNodei+1;else if(temp=0)printf(“n%s%d 所需资源没有产生,等待。n“,show(ready,blocked,finish,run);void main()Queue ready,blocked,finish;PCB pcb5;PCB run;run.needtime=0;printf(“设置了 5 个进程!n说明:进程的状态,所需时间和优先级等是随机产生的。nnn“);srand(int) time(0);for (int i=0;i5;i+)pcb
13、i.P_name0=P;pcbi.P_name1=r;pcbi.P_name2=o;pcbi.P_name3=c;pcbi.P_name4=e;pcbi.P_name5=s;pcbi.P_name6=s;pcbi.P_name7=0;pcbi.P_id=i;pcbi.P_state=rand()%2;pcbi.P_level=rand()%10+1;pcbi.needtime=rand()%2+1;pcbi.leavetime=pcbi.needtime;setQueue(pcb,printf(“各队列的初始信息如下:nn“);show(ready,blocked,finish,run);P_levelRun(ready,blocked,finish,run);printf(“n5 个进程都运行完,停止。n“);(4)截图部分: