操作系统实验报告进程调度
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五邑大学实验报告
操作系统课程
2016~2017年度第1学期实验题目:进程调度
院系:计算机学院
班级: 140801
学号: 3114002472
姓名:黄凯鑫
任课教师:白明成绩评定:
实验二题目:进程调度
完成日期:2016年12 月11 日
1、实验目的
(1)设计一个有n个进程工行的进程调度程序。每个进程由一个进程控制块(PCB)表示。进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。(2)调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。
(3)系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程
2、实验内容
(1)编制和调试示例给出的进程调度程序,并使其投入运行。
(2)自行设计或改写一个进程调度程序,在相应机器上调试和运行该程序,其功能应该不亚于示例。
(3)直观地评测各种调度算法的性能。
3、算法设计
算法:
(1) 优先数法。
进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。
(2) 简单轮转法。
进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。
实验源代码:
#include
#include
#include
#include
#include
#include
enum state //进程的状态
{
Ready,
Working,
Finish
};
struct pcb //PCB数据结构
{
int pid;
int priority;
int cputime;
int needtime;
int round;
state process;
pcb *next;
};
int timepiece;
pcb *get_process(){ //优先数算法--输入进程个数int proc;
pcb *q;
pcb *t;
pcb *p;
int i=0;
cout << "Input Process Number(1-10): ";
cin >> proc;
while (proc<1 || proc>10)
{
cout << endl << "Illegal Input!" << endl << endl << "Input Process Number(1-10): "; cin>>proc;
}
//cout << endl << endl<< "Start Scheduling!!!\n\n";
getch();
srand((unsigned)time(NULL)); //初始化随机数种子发生器
while (i { q=(struct pcb *)malloc(sizeof(pcb)); q->pid=rand()%10000; q->needtime=rand()%10+1; q->cputime=0; q->priority=rand()%100; q->process=Ready; q->next=NULL; //利用随机数生成进程信息 if (i==0) { p=q; t=q; } else { t->next=q; t=q; } //尾插法建立PCB节点 i++; } //while return p; } void display(pcb *p) { //优先数算法结果输出 cout<<"ProcessID"<<" "<<"Cputime"<<" "<<"Needtime"<<" "<<"Priority"<<" "<<"State"< while(p) { cout<<" "<< p->pid; cout<<"\t\t"; cout< cout<<"\t"; cout< cout<<"\t"; if(p->needtime==0) cout<<"Done"; else cout< cout<<"\t\t"; switch(p->process){ case Ready:cout<<"Ready"< case Working:cout<<"\b\b->Working<-"< case Finish:cout<<"Finish"< } p=p->next; } } int process_finish(pcb *q) //判断是否所有进程都已完成,是则返回1