1、东北大学操作系统实验之Linux及进程状态操作系统实验报告一 实验一 进程状态转换及其PCB的变化一、实验目的:自行编制模拟程序,通过形象化的状态显示,使学生理解进程的概念、进程之间的状态转换及其所带来的PCB内容 、组织的变化,理解进程与其PCB间的一一对应关系。二、实验内容及要求:(1)、 设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。(2)、 独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状态或其它)以及PCB的组织形式可自行选择。(3)、 合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控制信息、资源需求及现场信息。(
2、4)、 设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、组织结构的变化。(5)、 代码书写要规范,要适当地加入注释。(6)、 鼓励在实验中加入新的观点或想法,并加以实现。(7)、 认真进行预习,完成预习报告。 (8)、 实验完成后,要认真总结,完成实验报告。五状态模型: 3、主要数据结构:struct Run_type /运行态进程 char name; int state; int needtime; int priority;struct Ready_type /就绪态进程 char name; int needtime; int priority;struct Bl
3、ocked_type /阻塞态进程 char name; int needtime; int priority;4、程序源代码:#include#include#includeint i=0; int j=0;struct Run_type char name; int state; int needtime; int priority;struct Ready_type char name; int needtime; int priority;struct Blocked_type char name; int needtime; int priority;struct Run_type
4、Cpu;struct Ready_type Ready10;struct Blocked_type Blocked10;void Creat() /创建一个新的进程 int k=0;label1: printf( input new process name(input a letter): n); scanf(%s,&(Readyi.name);getchar(); for(k=0;ki;k+) if(Readyi.name=Readyk.name|Readyi.name=Readyk.name+32|Readyi.name=Readyk.name-32) printf(the proces
5、s is already exist!); goto label1; printf(input needtime (input a int number):n);label3: scanf(%d,&(Readyi.needtime);getchar(); if(Readyi.needtime100) printf(please input the true needtime(1-100)n); goto label3; printf( input the priority(1-10): n);label2: scanf(%d,&(Readyi.priority);getchar(); if(R
6、eadyi.priority10) printf(please 1-10!n); goto label2; i+;void Dispath() /P135 int t;char v;int k;int j; if(Cpu.state=0) if(Readyi-1.needtime=0) printf(* there is no process ready!n); exit(0); else for(k=0;ki-1;k+) for(j=0;jReadyj+1.priority) t=Readyj.priority; Readyj.priority=Readyj+1.priority;Ready
7、j+1.priority=t; t=Readyj.needtime; Readyj.needtime=Readyj+1.needtime;Readyj+1.needtime=t; v=Readyj.name; Readyj.name=Readyj+1.name;Readyj+1.name=v; -i; Cpu.name=Readyi.name;Cpu.needtime=Readyi.needtime;Cpu.priority=Readyi.priority;Cpu.state=1; printf(*%5c is send to cpu! n,Cpu.name); Cpu.needtime-;
8、if(Cpu.needtime=0) printf(*%5c is finished n,Cpu.name); Cpu.state=0; else Readyi.name=Cpu.name; Readyi.needtime=Cpu.needtime; Readyi.priority=Cpu.priority; for(k=0;ki;k+) for(j=0;jReadyj+1.priority) t=Readyj.priority; Readyj.priority=Readyj+1.priority;Readyj+1.priority=t; t=Readyj.needtime; Readyj.n
9、eedtime=Readyj+1.needtime;Readyj+1.needtime=t; v=Readyj.name; Readyj.name=Readyj+1.name;Readyj+1.name=v; Cpu.name=Readyi.name;Cpu.needtime=Readyi.needtime;Cpu.priority=Readyi.priority;Cpu.state=1; printf(*%5c is send to cpu! n,Cpu.name); Cpu.needtime-; if(Cpu.needtime=0) printf(*%5c is finished n,Cp
10、u.name); Cpu.state=0; void Timeout() if(Cpu.state=0) printf(* there is no process in cpu(please select Dispath!n); exit(0); else Readyi.name=Cpu.name; Readyi.needtime=Cpu.needtime; Readyi.priority=Cpu.priority; printf(%c is timeout n,Cpu.name); Cpu.name=0; Cpu.needtime=0; Cpu.priority=0; Cpu.state=0
11、; i+; void Eventwait() if(Cpu.state!=0) Blockedj.name=Cpu.name; Blockedj.needtime=Cpu.needtime; Blockedj.priority=Cpu.priority; printf(* %c is Blocked !n,Cpu.name); j+; Cpu.name=Blockedj.name; Cpu.needtime=Blockedj.needtime; Cpu.priority=Blockedj.priority; Cpu.state=0; else printf(* There is no proc
12、ess in cpu!);void Eventoccurs(char a) int k=0;int m=0;int n=0;int p=0; if(Blocked0.needtime=0) printf(* there is no process blocked!n); exit(0); else for(k;kj;k+) if(Blockedk.name=a) Readyi.name=Blockedk.name; Readyi.needtime=Blockedk.needtime; Readyi.priority=Blockedk.priority; p=1; m=j-k; for(n;nm
13、;n+) Blockedk.name=Blockedk+1.name; Blockedk.needtime=Blockedk+1.needtime; Blockedk.priority=Blockedk+1.priority; k+; j-;i+; if(p=1) printf(* %c is ready!n,a); else printf(* %c is not found! n,a); void main() Cpu.state=0; int Cputime=0; int x=6; while(x!=0) printf(n1:input new process 2:Dispathn); p
14、rintf(3:Timeout 4:Eventwaitn); printf(5:Eventoccurs(select whose eventoccur ) 0:exitn);label4: scanf(%d,&x);getchar(); printf(n=n); if(x=0|x=1|x=2|x=3|x=4|x=5) switch(x) case 1:Creat();break; case 2:Dispath();break; case 3:Timeout();break; case 4:Eventwait();break; case 5:char a;scanf(%c,&a);getchar
15、(); Eventoccurs(a);break; default:printf(please select from 0 to 5n); printf(- Cputime:%3d -n,Cputime); printf(| ProceNsname NeedTime Priority |n); if(Cpu.state!=0)/显示Cpu中的程序 printf(| Cpu:%16c,Cpu.name);printf(%20d,Cpu.needtime);printf(%18d |n,Cpu.priority); else printf(| * Cpu is free |n); int y=0;
16、 if(i=0)/显示Ready队列中的数据 printf(| *There is no process ready. |n); else for(y;yi;y+)/显示Ready中的程序 printf(| Ready%d:,y); printf(%15c,Readyy.name);printf(%20d,Readyy.needtime);printf(%18d |n,Readyy.priority); int z=0; if(j=0) /显示Blocked队列中的程序 printf(| *There is no process blocked. |n); else for(z;zj;z+)
17、printf(| Blocked%d:,z); printf(%13c,Blockedz.name);printf(%20d,Blockedz.needtime);printf(%18d |n,Blockedz.priority); Cputime+; if(Cpu.state!=0) Cpu.needtime=Cpu.needtime-1; printf(-n); else printf(please input 0-5n); goto label4; 5、运行结果:1.创建a,b两个进程2、调度进程(由于b优先级高,所以b先进入运行态)3、当b时间片到了,b变为就绪态4、再次调度(由于b优先级高,故还是b变成运行态)5、正在运行的b阻塞6、当b等待的事件发生,b重新进入就绪态6、程序使用说明:编译程序后若无错就执行程序,初始如下:其中:1表示创建新进程,随后输入进程名,所需时间,优先级 2表示系统调度进程,首先调度最高优先级 3表示时间片已到,运行中的进程将编程就绪态 4表示进程所需的事件尚未发生,进程将被阻塞 5表示进程等待的事件已发生,进程从阻塞态变为就绪态 0退出程序
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1