实验一进程调度实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一,进程调度实验
一、实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.
二、实验内容及要求
1.编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。
可以采用静态或动态最高优先数优先的算法。
2、编写并调试一个模拟的进程调度程序,采用简单轮转法和多队列轮转法的“轮转法”调度算法对五个进程进行调度。
三、实验主要仪器设备和材料
硬件环境:LBM-PC或兼容机
软件坏境:C语言编程环境
四、实验设计方案及原理
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W (Wait).运行R (Rim)、或完成F (Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
(静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变;动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。
例如:在进程获得一次CPU后就将其优先数减少1或者,进程等待的时间超过某一时限时增加其优先数的值,等等。
) 简单轮转法的基本思想是:所有就绪进程按FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。
如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。
直至所有的进程运行完毕。
多队列轮转法的基本思想是:设置多个就绪队列,每个队列的优先级不同,每个队列的CPU 时间片人小不等:一个新的进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度:仅当第一队列空闲时,调度程序才调度第二队列中的进程运行,后面的队列同理。
采用链表的形式存储各进程,表头就是将要执行的进程,对于新到进程或是还未完成的进程按各调度算法进行寻位、插入。
五、程序流程图
(图一)cc最高优先数优先”调度算法
(图二)简单轮转法调度算法
(图三)多队列轮转法调度算法
六、源程序清单
“最高优先数优先”调度算法,源程序名为:FPF.c,可执行程序名为:FPF.exeo
#include n stdio.h M
#include <stdlib.h>
#include <conio.h>
# define getpcb(tvpe) (type*)malloc(siz亡ootype)) stmct pcb{〃定义进程控制块PCB chai- state;//进程状态
chai- naine[l 0];〃进程名字
Ult super;//进程优先级
mt total_time;// 服务时间
mt nin_time;//已运行时间
stmct pcb *next;
} *p, *readv=NULL;//ready 就绪队列
tvpedef stmct pcb PCB;
SOIt0{〃对进程按优先级数进行排队
Ult flag=l; PCB *tml,*tm2;//用flag标志进程有没有插到就绪队列中
if(ready=NULL){〃就绪队列为空时,直接插入
ready=p; i eady->next=NULL;
}
else if(p->super>ieady->super) {//优先级数最人时,插入到队首
p・>11 亡xt=wady; ready=p;
}
else{//比较优先级数,插入到合适的位置
tml=readv; tni2=readv->next;
while(tni2) {
if(p->super>tiii2->super) {//找到进程插入的位置,进行插入p->next=tni2;
tml->next=p;
flag=O; break;
}
tni2=tiii2->next; tml =tml->next;〃继续查找插入位置
}
if(flag){//优先级数最小时,插到队尾tml->next=p; p->next=NULL;
}
}
}
mput(){//建立控制块,输入进程信息
iiit i,num;
pnntfC'\n 请输入进程数:”);scanf(”%d",&num);
for (i=O;i<num;i-H-){
进程号:No.%d:\n",i+1);
p=getpcb(PCB);
输入进程名:”);scanf(”%s",p->name); 输入进程优先级:”);scanf(”%
d",&p->super);
pnntf(”\n 输入进程运行时间:”);scanf(”%d”,&p->toml_dme);
p->i-un_time=O; p->state=V; p->next=NULL;
soil();//调用排序函数,每输入一个进程就排序一次
}
}
display(PCB *q){〃建立进程显示函数,用于显示进程当前的状态
printf("\n name\t state\t supei\t total_tiine\t i-un_tiine\ii");
pnntf(,,%s\t%c\t%d\t\t%d\t\t%d\ii'\q->naine,q->state,q->super,q->total_tinie,q->i-un_tinie);
}
destroy(){//建立进程撤消函数(进程运行结束,撤消进程)
piiiitffg 进程[%$]已完成・\n"p>nam亡);
fiee(p); p=NULL;
}
Riiimng(){//建立进程运行函数(进程运行时间结束后,置就绪状态) p->niii_tiine-H-;// 占有CPU 时间+1 if(p->iuii_tiine=p->totaLtmie) destrov();//进程完成,撤消该进程else { p->super-; p->state-w r;
} if(p)sort();//每运行一个CPU时间调度一次
}
check。
{//建立进程查看函数
PCB *pr;
当前正在运行的进程是:%s",p->naine);//显示当前运行的进程信息display®);
pi-readv;
当前就绪队列状态为:5”);〃显示就绪队列中进程信息wliile(pr) {
display(pr);
pi-pr->next;
}
}
main(){〃主函数
mt h=0;〃记录所有进程运行的次数
system(H cls H);// 清屏
pnntfC1^模拟进程调度系统——最高优先数优先调度算法\n”); mput();
wliile(ready) {
getcharQ; h++;
The execute number:%d
p=ieady;ieady=ieady->next;//就绪队列首进程获得CPU
p->next=NULL;p->state=,R,;
checkQ;
running^;
pnntf(”\n 按任键继续......”);
} pnntf(H\n\n所有进程己经完成・\n”);
}
简单轮转调度算法,源程序名为:sunple.c,可执行程序名为:simple.exe。
#include ”stdio.h"
#include <stdlib.h>
#include <conio.h>
# define getpcb(tvpe) (t\7pe*)nialloc(sizeof(type))
stmct pcb{〃定义进程控制块PCB
char state;//进程状态
chai- naine[l 0];〃进程名
mt totaLtime;// 服务时间
Ult nin_time;//已运行时间
int aiiive_tuney/到达时间
stmct pcb *next;
}*p,*readv=NULL;//ready 就绪队列。