( 2010 — 2011 学年 第 二 学期 )
课程名称:操作系统 开课实验室:计算机中心204 2010年04月20日 专业、年级、班 实验项目名称 教 师 评 语 教师签名: 年 月 日 进程管理 学号 姓名 成绩 指导教师 注:报告内容按实验须知中七点要求进行。
一、实验目的:运用优先权法和轮转法来模拟进程的控制,掌握进程的状态转换、进程的整个控制工作。
二、实验原理及基本技术路线图(方框原理图):
实验原理:用C语言或C++语言开发。需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。要求有创建、撤销、调度、阻塞、唤醒进程等功能。
基本技术路线图: 开始
输入进程数n 输入进程信息 设置3个优先级队列
-1-
将不同优先级的进程依次插入不同队列 Ch>n Ch=y或n 不打印 Ch=y 调用run函数,没运行过一次,将优先级降低,插入下一队列中,若所需时间为0,则释放空间 否 结束 若三个优先级队列为空 是 结束 -2-
三、所用仪器、材料(设备名称、型号、规格等):VC++ 6.0。
四、实验方法、步骤: 源程序:
#include \"stdio.h\" #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 struct pcb { /* 定义进程控制块PCB */ char name[10]; char state; int super; int ntime; int rtime; int retime; int jsuper;//静态优先级 struct pcb *link; }*ready=NULL,*p; typedef struct pcb PCB; sort() /* 建立对进程进行优先级排列函数*/ { PCB *first, *second; int insert=0; if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/ { p->link=ready; -3- ready=p; } else /* 进程比较优先级,插入适当的位置中*/ { first=ready; second=first->link; while(second!=NULL) { if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/ { /*插入到当前进程前面*/ p->link=second; first->link=p; second=NULL; insert=1; } else /* 插入进程优先数最低,则插入到队尾*/ { first=first->link; second=second->link; } } if(insert==0) first->link=p; } } input() /* 建立进程控制块函数*/ { int i,num=5; //有5个进程 for(i=0;i -4- p=getpch(PCB); printf(\"\\n 输入进程名:\"); scanf(\"%s\ printf(\"\\n 输入进程静态优先数:\"); scanf(\"%d\p->retime=i; printf(\"\\n 输入进程运行时间:\"); scanf(\"%d\ p->super=(p->jsuper-(p->ntime+p->retime))+10;//使优先级不为负数 printf(\"\\n\"); p->rtime=0;p->state='w'; p->link=NULL; sort(); /* 调用sort函数*/ } } int space() { int l=0; PCB* pr=ready; while(pr!=NULL) { l++; pr=pr->link; } return(l); } disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ { printf(\"\\n 进程名\ 状态\ 动态优先级\ 静态优先级 \Needtime\Runtime\RStime\\n\"); //不好打印 就只能将就了 哈 printf(\"|%s\\printf(\"|%c\\ -5- printf(\"|%d\\\printf(\"|%d\\\printf(\"|%d\\\printf(\"|%d\\printf(\"|%d\printf(\"\\n\"); } check() /* 建立进程查看函数 */ { PCB* pr; printf(\"\\n **** 当前正在运行的进程是:%s\显示当前运行进程*/ disp(p); pr=ready; printf(\"\\n ****当前就绪队列状态为:\\n\"); /*显示就绪队列状态*/ while(pr!=NULL) { disp(pr); pr=pr->link; } } destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ { printf(\"\\n 进程 [%s] 已完成.\\n\free(p); } running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime)++; if(p->rtime==p->ntime) destroy(); /* 调用destroy函数*/ else -6- { (p->super)--; p->state='w'; sort(); /*调用sort函数*/ } } main() /*主函数*/ { int len,h=0; char ch; input(); len=space(); while((len!=0)&&(ready!=NULL)) { ch=getchar(); h++; printf(\"\\n The execute number:%d \\n\p=ready; ready=p->link; p->link=NULL; p->state='R'; check(); running(); printf(\"\\n 按任一键继续......\"); ch=getchar(); } printf(\"\\n\\n 进程已经完成.\\n\"); ch=getchar(); } -7- 五、实验过程原始记录: 六、实验总结: 操作系统是计算机系统中必不可少的系统软件,它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。操作系统采用时间片法调度进程,是系统资源得到充分利用,用户可以花更少的时间完成过多的工作。通过这次实验,将以前只会做题的过程转化外程序执行的过程,模拟了在单处理机情况下的处理及调度问题,体会到了程序执行的过程,加深了对进程调度的理解。 -8- 因篇幅问题不能全部显示,请点此查看更多更全内容