操作系统课程设计报告
目 录
一 需求分析6
二 概要设计6
三 详细设计(含主要代码)6
四 调试分析、测试结果12
五 用户使用说明14
六 后记14
七 参考资料14
一 需求分析
在多道处理程序运行环境下,进程数目一般多于处理机数目,使得进程要通过竞争来使用处理机。这就要求系统能按照某种算法,动态地把处理机分配给就绪队列中的一个进程,使之运行,分配处理机的任务是由金城调度程序完成的。一个进程被创建后,系统为了便于对进程进行管理,将系统中的所有进程按照其状态,将其组成不同的进程队列。于是系统中有运行进程队列、就绪队列和各种事件的进程等待队列。进程调度的功能就是从就绪队列中挑选一个进程到处理机上运行。进程调度的算法有多种,常用的有优先级调度算法、先来先服务算法、时间片轮转算法。
二 概要设计
最高优先级优先调度算法
动态优先数是指在进程创建时例如:在进程获得一次CPU后就将其优先数减少。或者,进程等待的时间超过某一时限时增加其优先数的值,等等所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。CPU的时间如果运行进程用完它的时间片后还完成,就把它送回到就绪队列的末尾,队首进程。直至所有的进程运行完毕。所有就绪进程按排成一个队列,( PCB)进程控制块包含如下信息:等等。
图.最高优先级优先调度算法流程图
主要代码:void priority(char algo){
PCB q;
prt1(algo);
for(int i = 0; i<= Num ; i++)
{
q = pq.top();
pq.pop();
if(q.state != 3)
q.state = 1;
prt2(algo , q);
if(q.state !=3 )
q.state = 2;
q.cputime++;
if(q.needtime>0)
q.needtime--;
if(q.needtime == 0)
q.state = 3;
if(q.state!=3)
q.prio-=3;
pp.push(q);
while(!pq.empty())
{
q = pq.top();
pq.pop();
if(q.needtime == 0)
q.state = 3;
prt2(algo , q);prt1(algo);
pp.push(q);
}
pq = pp;
pp = pqempty;
}
printf("**************************************************************************\n");
printf(" 输出结束\n");
getchar();
}
二.时间片轮转算法:
用户可以自行输入进程的数量,每一个进程由进程控制块( PCB)void Roundrun(int timeSlice){
while(run != NULL){
run->cputime = run->cputime + timeSlice;
run->needtime = run->needtime - timeSlice;
run->round+=timeSlice;
run->count++;
if(run->needtime <= 0){
run->needtime = 0;
run->next = finish;
finish = run;
if(run != tail){
tail->next = ready;
}
else{
ready = NULL;
}
run->state = 'F';
run = NULL;
if(ready != NULL){
firstin();
}
}
else{
if(ready != NULL){
run->state = 'W';
tail = run;
run = ready; //就绪队列的头指针赋值给运行
run -> state = 'R'; //进程状态变为等待状态
ready = ready -> next; //就绪队列头指针移到下一个进程
}}
prt(