操作系统:进程调度

衡量调度的标准

不同的调度算法有各自不同的属性,侧重点是不一样的.
调度准则用于比较不同的调度算法.根据不同的调度准则进行比较,则得出的比较结果是不同的.

  • CPU利用率:使CPU尽可能的忙碌
  • 吞吐量(Throughput):单位时间内运行完的进程数
  • 周转时间(Turnaround time):从提交到运行结束的全部时间
  • 等待时间:进程在就绪队列中等待调度的时间总和
  • 响应时间:从进程提出请求到首次被响应的时间段[在分时系统环境下不是输出完结果的时间]
  • 优化标准:最大的CPU利用率、最大的吞吐量、最短的周转时间、最短的等待时间、最短的响应时间。

题目

1、本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假定起始状态都是就绪状态W。

为了便于处理,程序中进程的运行时间以时间片为单位计算。各进程的优先数或轮转时间片数、以及进程需要运行的时间片数,均由伪随机数发生器产生。

进程控制块结构如表2-1所示:

进程控制块链结构如图2-1所示:

图2-1 进程控制块链结构

其中:RUN—当前运行进程指针;
HEAD—进程就绪链链首指针;
TAIL—进程就绪链链尾指针。

2. 算法与框图 程序框图如图2-2所示。

(1)优先数法。 进程就绪链按优先数大小从大到小排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3。理由是该进程如果在一个时间片中完成不了,优先级应降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续运行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。

(2)简单轮转法。 进程就绪链按各进程进入的先后次序排列,链首进程首先投入运行。进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相应于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。

注:基于实验报告的修改

#include <stdio.h>
#include <stdlib.h>
#define furthest 5
/*author:haobotime:20.12.7
*/
struct process {     /*PCB STRUCTURE*/int id;     //进程idint priority;       //优先级int cputime;    //现运行时间int alltime;    //总运行时间char state;     //状态int next;       //指向下一个
}prochain[furthest+1];//进程队列int procnum;
int rand();
int algo;
int run,head,tail,j;void insert2();
void insert(int q);
void print();//process
void init();
void prisch();
void timesch();int main() {  /*MAIN PROGRAM*/
agan:/*两种算法1-->调度简单轮转法2-->优先数法*/printf("type the algorithm is (1:RR,2:PRIO):");scanf("%d",&algo);if (algo==2) {printf("output of priority.\n");init();prisch();} else {if (algo==1) {printf("output of round robin.\n");init();timesch();} else {printf("try again,please\n");goto agan;}}for (j=1; j<=40; j++) {printf("=");}printf("\n\n");for (j=1; j<=40; j++) {printf("=");}printf("\n\n");printf("system finished\n");getchar();//
}void insert2() {/*PUT A PROCESS ONTO THE TAIL OF THE QUEUE*///将进程插入到队列头部prochain[tail].next=run;tail=run;prochain[run].next=0;
}void insert(int q) {/*INSERT A PROCESS*///插入一个进程int p,s;p=head;s=prochain[head].next;while((prochain[q].priority<prochain[s].priority)&&(s!=0)) {p=s;s=prochain[s].next;}prochain[p].next=q;prochain[q].next=s;
}void print(){/*PRINT THE RUNNING PROCESS,WAITINGQUEUE AND PCB SEQUENCE LIST*/int k,p;for (k=1; k<=40; k++)printf("=");printf("\nrunning proc.                ");printf("waiting queue.");printf("\n    %d      ",prochain[run].id);p=head;while(p!=0) {printf("%5d",p);p=prochain[p].next;}printf("\n");for (k=1; k<=40; k++)printf("=");printf("\n");printf(" id            ");for (k=1; k<furthest+1; k++)printf("%5d",prochain[k].id);printf("\n");printf("priority       ");for (k=1; k<furthest+1; k++)printf("%5d",prochain[k].priority);printf("\n");printf("cputime        ");for (k=1; k<furthest+1; k++)printf("%5d",prochain[k].cputime);printf("\n");printf("alltime        ");for (k=1; k<furthest+1; k++)printf("%5d",prochain[k].alltime);printf("\n");printf("state          ");for (k=1; k<furthest+1; k++)printf("%5c",prochain[k].state);printf("\n");printf("next           ");for (k=1; k<furthest+1; k++)printf("%5d",prochain[k].next);printf("\n");
}void timesch() {/*THE PROCESS WITH RR ALRORITHM简单轮转法*/while(run!=0) {prochain[run].alltime-=1;//prochain[run].priority-=3;prochain[run].cputime+=1;if(prochain[run].alltime==0) {prochain[run].state='F';prochain[run].next=0;if(head!=0) {run=head;prochain[run].state='R';head=prochain[head].next;} else {prochain[0].id=prochain[run].id;run=0;}} else {if((prochain[run].cputime==prochain[run].priority)&&(head!=0)) {prochain[run].state='W';//prochain[run].cputime=0;insert2();run=head;prochain[run].state='R';head=prochain[head].next;}}print();}
}void init() {/*CREATE A WAITING QUEUE*///wait进程int i;head=0;if (algo==2) {for (i=1; i<furthest+1; i++) {//初始化进程表//printf("%d\n  furthest222",furthest);prochain[i].id=i;prochain[i].priority=(rand()+11)%41;//%5+1prochain[i].cputime=0;prochain[i].alltime=(rand()+1)%7+1;prochain[i].state='W';prochain[i].next=0;if((prochain[i].priority<prochain[head].priority)&&(head!=0)){insert(prochain[i].id);}else {prochain[i].next=head;head= prochain[i].id;}}} else {for (i=1; i<furthest+1; i++) {prochain[i].id=i;prochain[i].priority=(rand()+1)%3+1;//%5+1prochain[i].cputime=0;prochain[i].alltime=(rand()+1)%7+1;prochain[i].state='W';prochain[i].next=(i+1)%(furthest+1);}head=1;tail=furthest;prochain[furthest].next=0;}run=head;prochain[run].state='R';head=prochain[head].next;prochain[run].next=0;print();
}void prisch() {/*THE PROCESS WITH PRIO ALGORITHM优先数*/while(run!=0) {prochain[run].cputime+=1;prochain[run].priority-=3;//prochain[run].alltime-=1;if(prochain[run].alltime==0) {//此进程结束prochain[run].state='F';prochain[run].next=0;if(head!=0) {//若队列还有,切换run=head;prochain[run].state='R';head=prochain[head].next;} else {prochain[0].id=prochain[run].id;run=0;}} else {if((prochain[run].priority<= prochain[head].priority)&&(head!=0)) {//当前运行优先级低于链瘦时候prochain[run].state='W';insert(run);run=head;prochain[run].state='R';head= prochain[head].next;}}print();}
}

进程调度:优先数法与轮转法的实现相关推荐

  1. 计算机操作系统实验之进程调度(一)轮转调度法(C语言)

    计算机操作系统实验之进程调度(一)轮转调度法(C语言) 实验目的 实验内容与基本要求 轮转调度法的基本原理 实现思路及功能分析 算法流程图 全部代码 工程图 ProcessScheduling.h P ...

  2. 操作系统之进程调度——优先权法和轮转法(附上样例讲解)

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  3. cmd命令行进行C++代码编译运行;实现进程调度和存储管理

    最近刚考完一门,也算是有点闲暇时间,写个博客,就当做操作系统实验的笔记吧.        客官先别急着白嫖点个赞再看吧求求了 文章目录 一.在cmd命令行下编译运行C++源代码 1.进入目标目录 2. ...

  4. 操作系统进程调度 FCFS,SJF,RR算法(Java实现)

    有用就给个关注呗 进程控制块 为了管理和控制进程,系统在创建每一个进程时,都为其开辟一个专用的存储区,用以随时记录它在系统中的动态特性.通常,把这一存储区称为该进程的"进程控制块" ...

  5. 二分查找法的实现和应用汇总

    此文转自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现 ...

  6. 百鸡问题用计算机什么法解决,《穷举法解决问题》教学设计

    一.教学目标 1.知识与技能 ⑴了解穷举法的基本概念及用穷举法设计算法的基本过程. ⑵分析建立正确的数学模型,归纳穷举法穷举技巧. ⑶能够根据具体问题的要求,使用穷举法设计算法,编写程序求解问题. 2 ...

  7. C语言展开法和全排列法实现n阶行列式计算

    在这里向大家介绍两种实现n阶行列式计算的方法 目录 1.展开法 2.全排列法 一.展开法: 展开法的实现思想就是利用递归不断将行列式某一行或者某一列的n-1个(假设行列式为n行n列)置为0,剩余一个置 ...

  8. java的头插法和尾插法

    header:头部 tailer:尾部 头插法: 头插法的实现相对简单 思路是将新形成的节点的下一个赋值为header 再把新形成的节点地址传给header即将header向前移动 尾插法: 尾插法相 ...

  9. 上海大学计算机工程与科学学院官网,上海大学计算机工程与科学学院.PDF

    上海大学计算机工程与科学学院 操作系统课程组 二0 一一年十二月 计算机操作系统 (二)实验目录 第一部分 <计算机操作系统(二)>课程实验 实验一 操作系统的进程调度 3 实验二 死锁观 ...

最新文章

  1. GString及IntelliJIdea中调试Groovy的操作步骤
  2. 关于Spring Boot WebSocket整合以及nginx配置详解
  3. Extjs09 双击事件
  4. strcmp java_C语言中strcmp的实现原型
  5. idea中使用逆向工程----三部曲
  6. 【渝粤教育】国家开放大学2018年秋季 0714-21T建筑识图与CAD 参考试题
  7. Atitit easyui翻页组件与vue的集成解决方案attilax总结
  8. CenterCrop图像裁剪原理
  9. win10 64位下Oracle10g安装
  10. matlab2012教程答案,MATLAB教程2012a习题解答1-7章完整版-张志涌编-北航.doc
  11. Android开启桌面模式,Android Q自带桌面模式:支持大宽屏幕
  12. 贪心科技机器学习训练营(十二)
  13. 413 Arithmetic Slices
  14. 新浪微博发布文章html,JS实现仿新浪微博发布内容为空时提示功能代码
  15. 笔记本硬盘与移动硬盘之间的转换
  16. 区块链+金融潜力有多大?透视这30家金融机构的布局!
  17. 2017IDC企业级WLAN榜单将揭晓,新华三继续领跑企业级市场、聚焦“十连冠”
  18. SolidWorks焊件中将各结构构件分解成单个零件的方法
  19. SQL 注入之二次注入
  20. 如何在VScode中利用git来下载GitHub上的源码

热门文章

  1. ogg mysql表结构不一致_OGG-01163 Bad column表结构一致、trail文件meta不一致处理
  2. Error: .eslintrc.js » eslint-config-standard: Environment key “es2021“ is unknown 版本兼容问题
  3. 【C语言】输入5个整数并按输入顺序逆序输出
  4. C#LeetCode刷题之#728-自除数(Self Dividing Numbers)
  5. C#设计模式之9-装饰者模式
  6. mysql创建表语句和修改表语句
  7. es6生成器_ES6生成器
  8. 清空网站浏览记录就行啦?看Python如何实时监控网站浏览记录
  9. 有哪些开源的 Python 模块让你相见恨晚?
  10. 并发服务器模型——多进程服务器