资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
word理工大学信息工程与自动化学院学生实验报告( 2010 2011学年 第二学期)课程名称:操作系统 开课实验室:信自楼4442011 年 4 月 10日年级、专业、班学号成绩实验项目名称进程管理指导教师教师评语 教师签名: 年 月 日一、实验目的通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。二、实验原理及基本技术路线图(方框原理图)用C语言或C+语言开发。需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。要求有创建、撤销、调度、阻塞、唤醒进程等功能。进程的状态转换图创建就绪运行终止等待创建调度选中剥夺结束等待事件事件发生数据结构定义、主要变量的说明、函数的说明及各原语的功能说明typedef struct PCB 定义结构体PCB进程控制块;char NAME20 定义结构体变量,进程名;long ID 定义进程id;int RUNTIME 定义进程运行时间;char STATE6 定义进程状态有 ready 、wait 、run;int PRIORITY定义权值。 typedef struct QNode PCB pcb;struct QNode *next;QueuePtr;定义单链表,有定义指针next。typedef struct LinkQueue int prior; QueuePtr *front; QueuePtr *rear; int PartTime; LinkQueue;链队列中定:优先级、结构体里的QueuePtr类型指针变量,指向该优先级的进程的头结点和尾结点,还运行的时间片。LinkQueue Readyqueue10 链队列的单链表。void schedule() 声明调度函数,用来调度进程的运行;void show() 声明输出函数,用来输出的一个函数;void Create()声明创建进程的函数,用来创建进程。yunxingshijian=1+(int)(rand()%30); 此语句是随机生成一个整数赋给运行时间RUNTIME;youxianji=1+(int)(rand()%9); 该语句随机生成一个整数(19)赋给优先级; strcpy(p-pcb.NAME,name)将名字赋给PCB块;strcpy(p-pcb.STATE,Ready)将进程状态赋给PCB块; p-pcb.PRIORITY=youxianji将优先级赋给PCB块; p-pcb.RUNTIME=yunxingshijian; 将运行时间赋给PCB块; p-pcb.ID=id 将id号赋给PCB块。Readyqueuei.front-next=p-next; Readyqueuei+1.rear-next=p; Readyqueuei+1.rear=p; p-next=NULL; p移到下一队列的队尾,使Readyqueuei+1.rear指向最后一个结点。Readyqueuei.front-next=p-next; Readyqueue9.rear-next=p; p-next=NULL;Readyqueue9.rear=p; /p-next前移,把p移到运行结束的队列Readyqueue9.rear。多级反馈队列调度算法的描述一个进程被调度,则其运行时间有p-pcb.RUNTIME=p-pcb.RUNTIME-(int )pow(2,i+1),此后如果该进程的p-pcb.RUNTIMEpcb.RUNTIME=0,此进程就结束且加入到Readyqueue9.rear-next=p且p-next=NULL。没有结束就移加到下一队列的尾部且优先级减“1”(Readyqueuei.front-next=p-next;Readyqueuei+1.rear-next=p;Readyqueuei+1.rear=p;p-next=NULL; )。然后往下执行。如此循环.iv Readyqueuei.front-next!=NULL发生时,就往下一优先级运行。直到所有进程结束。程序功能结构图、流程图 创建进程函数Create()(左图) 调度函数schedule()(右图)开 始调用InitQueue()函数输入m1=j输入name随机生成优先级、运行时间for i=0 to 9youxianji=9-ik=Readyqueuei.front; strcpy(p-pcb.NAME,name); strcpy(p-pcb.STATE,Ready); p-pcb.PRIORITY=youxianji; p-pcb.RUNTIME=yunxingshijian; p-pcb.ID=id;Yk-next=nullNk=k-nextk-next=p; p-next=NULL; Readyqueuei.rear=pYprintf(“创建成功”);jmNY调用show()结 束开 始p=Readyqueuei.front-next; Sleep(int)pow(2,i+1); p-pcb.RUNTIME=p-pcb.RUNTIME-(int)pow(2,i+1); strcpy(p-pcb.STATE,run); N调用show();函数p-pcb.RUNTIMEnext=p-next; Readyqueue9.rear-next=p; p-next=NULL;Readyqueue9.rear=p; strcpy(p-pcb.STATE,finish);调用show()Readyqueuei.front-next=p-next;Readyqueuei+1.rear-next=p; Readyqueuei+1.rear=p; p-next=NULL;strcpy(p-pcb.STATE,ready);YReadyqueuei.front-next=NULL1=iYNi9结 束三、所用仪器、材料(设备名称、型号、规格等)。所用仪器:计算中心201;操作系统:Microsoft Visual C+;软件平台:Microsoft Visual C+四、实验方法、步骤#include#include#include#include#includetypedef struct PCB /定义结构体PCB进程控制块char NAME20; /结构体变量,进程名long ID; /进程idint RUNTIME; /进程运行时间char STATE6; /进程状态 ready wait runint PRIORITY; /权值 PCB; typedef struct QNode /单链表 PCB pcb;struct QNode *next;QueuePtr;typedef struct LinkQueue /链队列 int prior; /优先级QueuePtr *front; /结构体里的QueuePtr类型指针变量,指向该优先级的进程的头结点QueuePtr *rear; /结构体里的QueuePtr类型指针变量,指向该优先级的进程的尾结点int PartTime; /时间片LinkQueue;LinkQueue Readyqueue10; /链队列的单链表int N; /N为当前进程数void schedule(); /声明调度函数void show(); /声明输出函数 void InitQueue() / 队列的初始化、给每个队列加个头结点 for(int i=0;inext=NULL; /初始化时Readyqueuei.front-next为空 /*创建进程*void Create() InitQueue();char name20; long id=201031101; /定义ID和初始化为201031101 int m;QueuePtr *p;int yunxingshijian,youxianji; /运行时间、优先级printf(ntt请输入要创建进程的数目:);fflush(stdin);scanf(%d,&m); for(int j=1;j=m;j+) /创建用户所需进程m个printf(tt输入进程名:); /用户输入用户名scanf(%s,&name);
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号