编辑: 元素吧里的召唤 | 2019-07-06 |
/*进程状态*/ int ntime;
/*进程运行时间*/ int rtime;
struct pcb*link;
/*链指针*/ }*ready=NULL,*p;
typedef struct pcb PCB;
4、程序流程图
5、实验的核心代码(少量) ,并附有注释,代码部分分成两栏(字号小五) 插入进程队列* void initp() { PCB *first,*second;
if(ready==NULL) { p->link=ready;
ready=p;
} else { first=ready;
second=first->link;
while(second!=NULL) { first=first->link;
second=second->link;
} first->link=p;
} } 建立进程就绪函 数* void running(int tpit) { int k=0;
while((krtimentime)) { (p->rtime)++;
k++;
} if(p->rtime==p->ntime) destroy();
else{p->state='W';
initp();
}}
五、实验结果及分析
1、运行结果(要求截图) (能动态说明执行结果) 简单轮转法
2、实验结果的分析及说明 在操作系统中,由于进程总数多于处理机,它们必然竞争处理机.进程调度的功能就是按一 定策略、 动态地把处理机分配给处于就绪队列中的某一进程并使之执行. 根据不同的系统设 计目标,可有多种选择某一进程的策略.例如系统开销较少的静态优先数法,适合于分时系 统的轮轮法以及 UNIX 采用的动态优先数反馈法等.本实验是采用优先数法进程调度算法来 模拟演示进程调度,编程语言为 C 语言.
六、调试总结及心得体会 先模拟建立进程就绪链表----置所有进程的到达时间均为 0, 依PCB 链接顺序从第一个进程 PCB 开始,使进程编号依次为 0,1,2,3,4……;
就绪链表中进程的数量,由常量 num 控制;
再 模拟建立调度函数--------取表头 PCB,修改进程执行时间,得到的新时间,即为剩余 执行时间,当剩余时间小于或等于
0 时,将此进程的 PCB 取出,依完成的先后次序链到完成 链表中,记录当前完成进程的完成时间,同时修改就绪链表表头;
最后 计算和打印里程调 度信息-----计算出各进程周转时间及所有进程的平均周转时间. 心得体会 由于网上给出了最高优先数优先的算法,所以照猫画虎,写轮转法起来也很容易 不同的算法原理不同,但实现起来确是很像的 实验难点主要在于对于算法原理的理解,理解了原理做起程序来很快 第一次实验比较简单,没什么好说的.
七、思考题
1、 分析不同调度算法的调度策略,比较不同调度算法的优缺点,总结它们的适用范围. 先来先服务法 先提交的作业先运行,运行一个之后再轮到下一个 这种算法实现简单,但是响应不及时,适用于交互性要求不高的系统 轮转法 轮转法规定由各个准备就绪进程顺次轮流使用 CPU,而且每一次使用的时间一般规定为一定 值 当时间片结束时,就强迫一个现行进程出让 CPU. 轮转法实现也较简单, 而可以保证不会有进程长期得不到响应, 缺点是无法照顾到一些特殊 进程,早期分时系统采用的就是简单轮转法. 最高优先数优先法 为每一个进程设置一个优先数,CPU 调度时每次选择就绪进程中优先数最大者,让它占 用CPU 运行. 优先数法可划分成静态优先数法和动态优先数法两种: 静态优先数法在创建进 程时就已确定了该进程的优先数,并且在进程运行的整个过程中该优先数不再动态地改变, 那么这种优先数的确定方法便称为静态优先数法. 采用静态优先数法简单, 而且实现比较容 易,但太死板,且适用范围也较小.另外,采用静态优先数法可能会使某些低优先数的进程 无限期地等待 CPU,不能准确地反映出系统以及进程在运行过程中不断变化的特性.随着进 程的推进, 进程的许多与优先数确定相关的因素也都将随之发生变化. 动态优先数法按照变 化着的情况对各个进程的优先数不断适时地做出调整. 从以上可以看出该算法优点是即保证了不会有进程长期等待, 也能照顾到特殊进程, 缺点是 每次需重新计算进程优先级,占用较多资源.适用于性能较好的分时系统.