操作系统进程调度课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计时间: 2012-1-1至2012-1-08
姓名:学号:
组员:
专业年级:
一.设计目的:
通过课程设计, 加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
二.设计内容:
2.题目:进程调度算法的设计
设计要求:
①设计进程控制块PCB表结构,分别适用于优先数调度算法和循环轮转调度算法。
②建立进程就绪队列。对两种不同算法编制入链子程序。
③编制两种进程调度算法:1)优先数调度;2)循环轮转调度
开发环境:VC++6.0
设计技术参数:
①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。
②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
③在优先数算法中,优先数的值为50与运行时间的差值,即P_TIME-process->needtime。进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。
④对于遇到优先数一致的情况,采用FIFO策略解决。
三.设计过程
1、个人负责实现的功能:
2、/函数功能:优先级法调度将进程插入到就绪队列算法
3、
4、void FirstInsert(PCB *q)
5、{
6、 PCB *p,*s,*r; /*p,*r用来控制就绪队列滚动,S指向插入的队列*/
7、 int b; /*b作为插入控制标志的*/
9、 p=READY;
10、 r=p;
11、 b=1;
12、 if(s->PRIO>=READY->PRIO)
13、 {
14、 s->next=READY;
15、 READY=s;
16、 }
17、 else
18、 {
19、 while((p!=NULL)&&b)
20、 {
21、 if(p->PRIO>=s->PRIO)
22、 {
23、 r=p;
24、 p=p->next;
25、 }
26、 else
27、 {
28、 b=0;
29、 }
30、 }
31、 s->next=p;
32、 r->next=s;
33、 }
34、}
35、//函数功能:时间片轮转算法调度将进程插入到就绪队列算法
36、
37、void SecondInsert(PCB *q)
38、{
39、 tail->next=q;
40、 tail=q;
41、 q->next=NULL;
42、}
设计思路
首先设计分成两个主要部分:
1、优先级法调度将进程插入到就绪队列算法:
*p,*r用来控制就绪队列滚动,*S指向插入的队列,再比较p和s的进程的优先度大小,如果大于等于则直接加到首部。否则和第二个再比较,p指向下一个进程,r指向p的上一个进程,如果p==NULL,则将新进程插到队尾。否则s的next指向p,r的next指向s。
2时间片轮转算法调度将进程插入到就绪队列算法:
直接将要插进的进程插进就绪队尾即可,也就是将尾部的进程的next指向新插进队列。tail指向新插进程的地址。
开始
输入P或R到参数algo
是P还
是R
以pcreate_task 创建任务,代表优先数算法以rcreate_task 创建任务,代表轮转算法
priority(char algo),执行优先数算法
roundrun(char
algo) ,执行轮
转算法
终止
算法和流程图
Main函数流程图:
P R
是否运行完毕?
needtime==0?
run->state='W'; insert1(run); run=NULL;
返回 运行数加1; 需要时间减1;优先数减3; run->next=finish; finish=run; run->state='F'; run=NULL; 将进程就绪队列中第一个放进运行队列 就绪队列不空,并且,就绪队列队首优先数大于运行的进程 将进程就绪队列中第一个放进运行队列 打印运行情况 进程运行完毕? 优先数算法流程图:
Y
N
Y
N
N
Y
开始
是否运行完毕?
needtime==0?
run->count=0; 返回 运行数加1; 需要时间减1;运行时间加1; run->next=finish; finish=run; run->state='F'; run=NULL; 将进程就绪队列中第一个放进运行队列 时间片等于运行时间run->count==run->ro und ? run->state='W';insert2(rn; firstin();
打印运行情况 进程运行完毕? 就绪队列间为空?
Y
N
Y
N
N
Y
Y
N
开始