进程调度文档格式.docx
《进程调度文档格式.docx》由会员分享,可在线阅读,更多相关《进程调度文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
2、深入理解同步与互斥的概念及p、v操作;
3、上机前仔细阅读参考程序,并在参考程序的基础上,对程序作相应的修改;
给出实验数据与结果
二、实验目的
进程调度时进程管理的主要内容之一,通过设计,编制,调试一个简单的进程调度模拟系统,对进程调度,进程运行状态变换及PV操作加深理解和掌握。
三、实验环境
每人一台电脑,在下实现。
四、实验内容
1、模拟批处理多道操作系统的进程调度;
采用剥夺式优先算法,对三个进程进行模拟调度
2、模拟实现同步机构避免并发进程执行时可能与时间相关的错误;
模拟PV操作同步机构,用PV操作解决进程进入临界区的问题。
五、实验程序数据结构
1,进程控制块PCB
Struct{
Intid;
Charstatus;
Intpriorrty;
Intwaiter1;
}
2,信号量
Struct
{
Intvalue;
Intwater2;
}sem[2]
3,现场保护栈
Charstack[11][4]
每个进程都有一个为10个字的现场保护栈,用来保护被中断时的断点地址等。
以及全局变量
Inti;
charaddr;
intm1,m2;
六、实验输入数据
输入进程:
输入PCB参数
3,4,,5进程以此类推。
七、实验输出数据与分析总结
按任意键开始一次时间片调度:
进行了一次进程调度轮回,每一个进程公平的获得了一定时间的CPU使用。
进程全部运行完毕,正常退出。
实验结果的分析及说明
实验结果很明显的看出时间片轮转片算法的实质,即每一个进程按顺序公平的获得一定的CPU使用时间,如果没有运行结束,那么它将排到队尾等待下一次调度。
等待队列中的进程也会有次序的排队等待调度。
八、教师评语
教师签字:
年月日
程序中源程序和可执行程序:
voidmain();
/*主函数,用来进行调度操作*/
voidnewPCB();
/*建立PCB块并将他们组成一个队列*/
voidpushPCB();
/*将新的PCB块放到链表末尾*/
voidshowPCB();
/*调度一次时间轮转算法并显示*/
voidpinrtSort();
/*排序输出各个进程的PCB*/
代码清单:
/*
本程序实现模拟进程的时间片轮转调度算法,即每一个进程按照在队列中的顺序平均获得cpu执行时间,
如未能在时间片中完成,则该进程回到队尾等待调度,直到运行完毕
Authorjuju
*/
#include<
stdio.h>
stdlib.h>
conio.h>
windows.h>
staticintid=0;
intprocess_num;
intcurrent_process;
structpcb
charname[20];
intid;
charstate;
intneed_time;
intrun_time;
structpcb*next;
}*p,*q,*first_pcb=NULL;
typedefstructpcbPCB;
/*排序输出各个进程PCB*/
voidprintSort()
inti;
q=first_pcb;
for(i=0;
i<
process_num;
){
if(i==q->
id){
printf("
|%s\t\t|%d\t\t|%c\t\t|%d\t\t|%d\n"
q->
name,q->
id,q->
state,q->
need_time,q->
run_time);
i++;
}else{
q=q->
next;
if(q==NULL){
q=first_pcb;
i++;
}
}
}
/*调度一次PCB并显示*/
voidshowPCB()
first_pcb->
run_time++;
state='
r'
;
/*进程执行完毕,将其清除出链表*/
if((first_pcb->
run_time)==(first_pcb->
need_time)){
current_process--;
printf("
进程%s已经运行完毕"
first_pcb->
name);
system("
pause"
);
first_pcb=first_pcb->
if(first_pcb==NULL){
printf("
所有进程都已经运行完毕"
system("
return;
first_pcb->
system("
cls"
/*显示运行的进程和就绪的进程*/
q=first_pcb->
-------当前运行的进程是:
进程%s\n\n"
-------在等待队列的进程是:
"
while(q!
=NULL){
进程%s"
q=q->
/*显示相应的PCB块*/
\n\n------------------------------进程详细PCB------------------------------------"
\n\n|进程名\t\t|进程ID\t\t|进程状态\t|进程所需时间\t|进程运行时间\n"
printSort();
/*进行一次时间片轮换调度算法,将队首的进程放到队尾,之前第二位进程获得cpu时间片*/
while(q->
next!
w'
q->
next=first_pcb;
first_pcb=first_pcb->
next->
next=NULL;
\n"
运行调度"
/*将新的PCB块放到链表末尾*/
voidpushPCB(inti)
next=p;
q=p;
if(i==process_num-1)q->
/*建立PCB块并将他们组成一个队列*/
voidnewPCB()
请输入进程数:
scanf("
%d"
&
process_num);
q=(PCB*)malloc(sizeof(PCB));
first_pcb=(PCB*)malloc(sizeof(PCB));
i++){
p=(PCB*)malloc(sizeof(PCB));
请输入第%d个进程名:
id+1);
scanf("
%s"
p->
请输入进程需要的运行时间:
p->
need_time);
p->
id=id++;
run_time=0;
if(i==0){
first_pcb=q=p;
p->
elsepushPCB(i);
voidmain()
newPCB();
current_process=process_num;
按任意键开始进程调度\n"
while(current_process){
showPCB();