5.12 操作系统——进程调度
1. 目的和要求
1.1. 实验目的
用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
1.2. 实验要求
1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序。
进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法。
(1). 每个进程有一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、优先级、到达时间、需要运行时间、已用CPU时间、进程状态等等。
(2). 进程的优先级及需要的运行时间可以事先人为地指定,进程的运行时间以时间片为单位进行计算。
(3). 每个进程的状态可以是就绪 r(ready)、运行R(Running)、或完成F(Finished)三种状态之一。
(4). 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
(5). 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待调度。
(6). 每进行一次调度程序都打印一次运行进程、就绪队列中各个进程的 PCB,以便进行检查。
(7). 重复以上过程,直到所要进程都完成为止。
思考:作业调度与进程调度的不同?
1.2.2实验题A:编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对N(N不小于5)个进程进行调度。
“最高优先级优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
(1). 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。
(2). 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定规则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1,并且进程等待的时间超过某一时限(2个时间片时间)时增加其优先数等。
(3). (**)进程的优先数及需要的运行时间可以事先人为地指定,(也可以由随机数产生)。
(4). (**)在进行模拟调度过程可以创建(增加)进程,其到达时间为进程输入的时间。
0.
1.2.3实验题B:编写并调试一个模拟的进程调度程序,采用“基于时间片轮转法”调度算法对N(N不小于5)个进程进行调度。 “轮转法”有简单轮转法、多级反馈队列调度算法。
(1). 简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片长度相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。(此调度算法是否有优先级?)
(2). 多级反馈队列调度算法的基本思想是:
将就绪队列分为N级(N=3~5),每个就绪队列优先数不同并且分配给不同的时间片:队列级别越高,优先数越低,时间片越长;级别越小,优先数越高,时间片越短。
系统从第一级调度,当第一级为空时,系统转向第二级队列,.....当处于运行态的进程用完一个时间片,若未完成则放弃CPU,进入下一级队列。
当进程第一次就绪时,进入第一级队列。
(3). (**)考虑进程的阻塞状态B(Blocked)增加阻塞队列。进程的是否阻塞和阻塞的时间由产生的“随机数”确定(阻塞的频率和时间长度要较为合理)。注意进程只有处于运行状态才可能转换成阻塞状态,进程只有处于就绪状态才可以转换成运行状态。
2. 实验内容
根据指定的实验课题:A(1),A(2),B(1)和B(2)
完成设计、编码和调试工作,完成实验报告。
注:带**号的条目表示选做内容。
3. 实验环境
vc++6.0
4. 实验原理及核心算法参考程序段
动态优先数(优先数只减不加):
源代码:
#include<stdio.h> #include<string.h> #include<stdlib.h>typedef struct pcb{char name[10]; //进程名称char status[10]; //进程状态int priority; //优先级int arrtime; //到达时间 int reqtime; //进程所需时间int cpuTime; //已用cpu时间int trueTime; //实际运行时间int startime; //开始时间int fintime; //结束时间 }PCB;int n,N; PCB pcb[100]; int systime=0;//菜单 void menu() {printf("\n\n |*************** 作业调度 *************|\n");printf(" |======================================|\n");printf(" | 1.读取进程 |\n");printf(" | 2.进程调度 |\n");printf(" | 0.退出 |\n");printf(" |======================================|\n"); }//读取TXT文档 int ReadFile() {int m=0;int i=1;FILE *fp; //定义文件指针fp=fopen("进程.txt","r"); //打开文件if(fp==NULL){printf("File open error !\n");exit(0);}while(!feof(fp)){fscanf(fp,"%s%d%d%d",&pcb[i].name,&pcb[i].priority,&pcb[i].arrtime,&pcb[i].reqtime); //fscanf()函数将数据读入i++;};n=i;if(fclose(fp)) //关闭文件 {printf("Can not close the file !\n");exit(0);}m=i-1;return m; }//输出 void Print() {int i;n=n+N;printf("\n\n 进程调度状态表:\n");printf("\n 进程名称 优先级 到达时间 需要运行时间 CPU运行时间 状态\n");for(i=0;i<n;i++)printf(" %s\t\t %d\t\t%d\t %d\t\t %d\t\t%s\n",pcb[i].name,pcb[i].priority,pcb[i].arrtime,pcb[i].reqtime,pcb[i].cpuTime,pcb[i].status);printf("\n\t\t\t\t\t\t现在系统时间: %d\n",systime); }//交换artime void SwapData(int *x,int *y) {int temp;temp=*x;*x=*y;*y=temp; }//交换名字 void SwapName(char x[],char y[]) {char temp[8];strcpy(temp,x);strcpy(x,y);strcpy(y,temp); }//排序 int Descend(int a,int b) {return a>b; }//先到先服务算法 void sort(int(*compare)(int a,int b)) {int i,j,k;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){if((*compare)(pcb[j].priority,pcb[k].priority))k=j;}if(k!=i){SwapData(&pcb[k].arrtime,&pcb[i].arrtime);SwapName(pcb[k].name,pcb[i].name);SwapData(&pcb[k].reqtime,&pcb[i].reqtime);SwapData(&pcb[k].priority,&pcb[i].priority);SwapData(&pcb[k].cpuTime,&pcb[i].cpuTime);SwapData(&pcb[k].trueTime,&pcb[i].trueTime);}}strcpy(pcb[0].status,"Running");Print(pcb); }void running() //运行函数。判断是否完成 { int slice,i,k;slice=1;//3.思考:slice的作用?以及赋值变化的原因?for(i=1;i<((n+1)-pcb[i].priority);i++)slice=slice*2;for(i=0;i<slice;i++){(pcb[i].cpuTime)++; pcb[0].trueTime++;if(pcb[0].trueTime>=pcb[0].reqtime) break; }if(pcb[0].trueTime>=pcb[0].reqtime) {printf("\n 进程 %s 已完成.\n",pcb[0].name); for(i=0;i<n;i++){k=i+1;pcb[i].arrtime=pcb[k].arrtime;strcpy(pcb[i].name,pcb[k].name);pcb[i].reqtime=pcb[k].reqtime;pcb[i].priority=pcb[k].priority;pcb[i].cpuTime=pcb[k].cpuTime;pcb[i].trueTime=pcb[k].trueTime;strcpy(pcb[i].status,pcb[k].status);}n=n-1;sort(Descend); }else { if(pcb[0].priority>1) (pcb[0].priority)--; strcpy(pcb[0].status,"Running");sort(Descend); /*调用sort函数*/ } } main() {while(1){int m;char ch;menu();printf(" 请选择模块(0~3): ");scanf("%d",&m);printf("\n");switch(m){case 1:ReadFile();Print();break;case 2:running();break;case 0:exit(0);break; }} }
运行结果:
从文件读取进程表:
进程调度过程:
转载于:https://www.cnblogs.com/blueYE00/p/5487199.html
5.12 操作系统——进程调度相关推荐
- java模拟实现操作系统进程调度中的多级反馈队列算法
java模拟实现操作系统进程调度中的多级反馈队列算法 操作系统学了一学期了,期末作业布置下来,用编程语言模拟进程调度的过程,只会java,于是就写了一下,通过控制台模拟,模拟过程看起来可能十分不直观. ...
- 12 操作系统第三章 内存管理 非连续分配管理方式 基本分页存储管理 基本分段存储管理 段页式存储管理
文章目录 1 基本分页存储管理 1.1 什么是分页存储 1.2 重要的数据结构--页表 1.3 基本地址变换机构 1.4 具有快表的地址变换机构 1.4.1 什么是快表(TLB) 1.4.2 引入快表 ...
- 操作系统-进程调度(FCFS和SJF)
文章目录 进程调度(FCFS和SJF) 问题描述 实验环境 输入 输出 测试数据 实验设计 数据结构 函数的功能.参数和输出 主要函数算法设计 详细设计 流程图 实验结果与分析 结果展示与描述 结果分 ...
- 操作系统—进程调度—HRRN,RR 高响应比和时间片轮转算法
1.问题描述及需求分析 设计程序模拟进程的高响应比HRRN和时间片轮转RR调度过程.假设有n个进程分别在T1, - ,Tn时刻到达系统,它们需要的服务时间分别为S1, - ,Sn.如果选择RR算法,还 ...
- 【操作系统 进程调度】
操作系统与进程调度 操作系统 1.操作系统的概念: 2.操作系统的主要功能: 1.进程管理: 2.内存管理: 3.设备管理: 4.文件管理: 5.提供操作系统与用户之间的接口: 3.程序与进程: 3. ...
- 操作系统 进程调度-银行家算法实验报告
实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...
- 操作系统进程调度先来先服务FCFS
一,实验的流程图 二,实验代码 注:本代码主要来自豆丁,加入本人的部分修改..//本FCFS是用不带都结点的链表完成.当然也可以用其他数据结构 #include<stdio.h>#incl ...
- 0512 操作系统进程调度实验
实验三进程调度模拟程序 专业:商软2班 姓名:韩麒麟 学号:201406114253 一. 目的和要求 1.1. 实验目的 用高级语言完成一个进程调度程序,以加深对进程的 ...
- 操作系统-进程调度(HRRN和RR)
文章目录 进程调度(HRRN和RR) 问题描述 实验环境 输入 输出 测试数据 实验设计 数据结构 函数的功能.参数和输出 主要函数算法设计 详细设计 流程图 实验结果与分析 结果展示与描述 结果分析 ...
最新文章
- c#sort升序还是降序_被玩坏的数组排序之sort函数
- Working with FBX SDK (2)
- SAP Commerce Impex语法
- ABAP Development Tools的语法增强
- [Java基础]JDK内置注解
- LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)
- 记录青春的人人网又回来了,情怀还能唤回用户吗?
- 字节跳动面试:java编程思想电子版非pdf
- 模板 - 洲阁筛 + min25筛
- matlab画圆函数
- 线性代数与矩阵论知识点总结
- 使用matlab在图片上画框,并保存
- 初学者入门编程最开始要学什么?
- 【自用错题集】C语言 基础错题整理
- 【Adobe】Photoshop :Mac 系统 Photoshop 软件更换许可指引
- 基于搜狗微信的爬虫知识总结
- Oracle 19 创建数据库、表空间
- MySQL函数Locate的使用
- 微型计算机的字符信息编码方案,微型计算机中普遍采用的字符信息编码方案是(.doc...
- Excel柱状图,饼图,折线图
热门文章
- vant 日历插件slots_vue的vant组件库中的slot如何按需使用呢
- mongodb数据库安装和启动及操作笔记
- Unity3D之Material(材质、着色器、纹理)
- Go语言中命令行参数的实现
- TheWorld不能访问Taobao的解决办法
- XML文档的使用方法
- 面试题 01.04. 回文排列
- 台式计算机 一万元,一万元左右i7-8700K/Z370/GTX1070Ti水冷游戏台式电脑主机配置推荐(2)...
- es6 嵌套数组循环_ES6 常用数组循环
- a*算法matlab代码_10分钟带你入门MATLAB