OS计算机操作系统课程实验报告.doc_第1页
OS计算机操作系统课程实验报告.doc_第2页
OS计算机操作系统课程实验报告.doc_第3页
OS计算机操作系统课程实验报告.doc_第4页
OS计算机操作系统课程实验报告.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

肇庆学院计算机科学与软件学院计算机操作系统课程实验报告姓名:学号:班级:完成日期:实验题目进程调度模拟程序实验形式小组合作 独立完成 设计目的1. 加深对进程、进程控制块及进程队列等概念的理解。2. 了解优先数和时间片轮转调度算法的具体实施办法,加深对进程管理各部分内容的理解。 设计预备知识1. 进程管理。2. 优先数调度算法、时间片轮转算法。设计内容可按实际情况选择一下列出的1个题目:1.设计一个采用优先数调度算法的模拟进程调度程序。2.设计一个采用时间片轮准调度算法的模拟进程调度程序。3.进程调度模拟程序的设计(包括至少两种调度算法)。要求如下:(1)设计进程控制块pcb表结构,分别适用于优先权调度算法和时间片轮转调度算法。pcb结构包括以下信息:进程名、进程优先数(或轮转时间片),进程所占用的cpu时间,进程的状态,当前队列指针等。根据调度算法的不同,pcb结构的内容可以作适当的增删。(2)建立进程就绪队列。对两种不同算法编制入链子程序。(3)设计的程序中能显示或打印进程控制块的动态变化过程。一、设计理论描述(1)抢占式优先权调度算法进程按照优先数的大小进行排队,优先数最高的先执行,直到出现另一个优先权更高的进程,进程调度便停止当前进程的执行,重新将处理机分配给新到的优先权更高的进程。(2)时间片轮转法(先来先服务原则) 进程按先来先服务原则将所有的进程排队,每次调度时,把cpu分配给队首进程,并令其执行一个时间片,当时间片用完,则把它送入队列末尾,再执行下一个进程,如此循环。二、设计思想、设计分析及数据结构模型程序中利用快速排序算法,效率更高,通过此算法可以确定进程的入队顺序。然后再按照不同的算法要求执行进程。程序中用到的数据结构:快速排序函数:int cmp(const void *a, const void *b)/ 快速排序的函数;node *c = (node *)a;node *d = (node *)b;return d-degree - c-degree;进程间的复制:void copy(int n, node *pcb, node *pcb_tem)/ 进程间的复制;加入这个函数,是为了可以选择多个运行,调用每个算法时,不用重新输入每个进程的值;/不改变它的值;如 pcb_tem 复制到 pcb ,如果没有这个函数,那么 pcb 的值就会改变;int i;for(i=0; in; i+)pcbi.degree = pcb_temi.degree;pcbi.rtime = pcb_temi.rtime;strcpy(pcb, pcb_);strcpy(pcbi.state, pcb_temi.state);队列的使用:具体表现在进程的出队入队。三、变量说明及程序流程图char name20; 进程名 int degree; 优先权 int rtime; 运行所要的时间char state30; 运行状态 inc 计数器请选择:1、优先权调度算法2、时间片轮转调度算法0、退出case1:调用函数f1();case2:调用函数f2();开始函数f1()实现优先权调度算法函数f2()实现时间片轮转调度算法case0:退出程序函数说明:四、源代码#include#include#include#include#includeconio.husing namespace std;typedef struct node char name20; int degree; / 优先权;int rtime; / 运行所要的时间;char state30;node;int cmp(const void *a, const void *b)/ 快速排序的函数;node *c = (node *)a;node *d = (node *)b;return d-degree - c-degree;void work(int n, node * pcb)/ 优先权调度算法,程序的核心;int i, inc = 0;while(1)qsort(pcb, n, sizeof(pcb0), cmp); / 排序,相当于进一个队列了;printf(name degree rtime staten);printf( %s %d %d %sn,pcb0.name,pcb0.degree,pcb0.rtime,正在运行);for(i=1; in; i+)if(strcmp(pcbi.state, 已经结束) = 0) / 表明已经结束;printf( %s - - %sn,pcb,pcbi.state);else /还没结束;printf( %s %d %d %sn,pcb,pcbi.degree,pcbi.rtime,pcbi.state);cout endl;pcb0.degree-; / 权值会减一;pcb0.rtime-; / 运行时间也一样;if(pcb0.rtime = 0) / 判断该进程是否运行完毕;inc+; / inc 的作用是记录已经完成的进程个数;pcb0.degree = -65535; / 如果运行完毕,就致它的权值为-65535,不再争用;strcpy(pcb0.state, 已经结束); /状态相应的致为“已经结束”;if(inc = n)/ 任务全部完成;printf(name degree rtime staten);for(i=0; in; i+)printf( %s - - %sn,pcb,pcbi.state); / 全部输出;cout n随便输入一个键返回菜单。n;getch(); system(cls); / 清屏;break; / 结束;void work_time(int n, node *pcb)/ 时间片轮转调度算法;int i, j, n_tem = n, len=0;node *tem; tem = (node *)malloc(n * sizeof(node); / 动态分配开数组,放已经结束的进程;while(1)/ 也是把全部进程都放进数组, 循环直到所有进程运行完毕;printf(name rtime staten);printf( %s %d %sn,pcb0.name,pcb0.rtime,正在运行);for(i=1; in_tem; i+) / 输出还没运行的进程;printf( %s %d %sn,pcb,pcbi.rtime,pcbi.state);for(i=0; ilen; i+) printf( %s - %sn,,已经完成); /输出已经运行的进程;cout endl;pcb0.rtime-; / 运行完之后,这个进程的时间就会减一;node zero; zero = pcb0;if(pcb0.rtime = 0) / 表示已经完成了;strcpy(pcb0.state, 已经结束); temlen = pcb0; / 已经完成的就放在tem;for(j=1; jn; j+) / 相当于一个队头,每次都运行完减一,每个进程都相互轮着当队列的头元素;pcbj-1 = pcbj;n_tem-; len+;n = n_tem;else / 还没完成;for(j=1; jn; j+)pcbj-1 = pcbj; / 这里是将每个进程向前移进作为队列的头元素;n = n_tem;pcbn_tem-1 = zero; / 把刚才正在运行的进程放在最后;if(n_tem=0) / 表示全部进程完毕;printf(name rtime staten);for(i=0; ilen; i+) printf( %s - %sn,,已经完成);cout n随便输入一个键返回菜单。n;getch(); system(cls);break;void copy(int n, node *pcb, node *pcb_tem)/ 进程间的复制;加入这个函数,是为了可以选择多个运行,调用每个算法时,不用重新输入每个进程的值;/不改变它的值;如 pcb_tem 复制到 pcb ,如果没有这个函数,那么 pcb 的值就会改变;int i;for(i=0; in; i+)pcbi.degree = pcb_temi.degree;pcbi.rtime = pcb_temi.rtime;strcpy(pcb, pcb_);strcpy(pcbi.state, pcb_temi.state);int main()/freopen(in.txt,r,stdin);int i, n;char ch;cout n;node *pcb, *pcb_tem;pcb = (node *)malloc(n * sizeof(node); / 动态分配空间;pcb_tem = (node *)malloc(n * sizeof(node); / copy 函数有用到,用它不用重复输入;cout 请输入每个进程的名称,优先数,所需要运行的时间:n;for(i=0; i pcb_ pcb_temi.degree pcb_temi.rtime;strcpy(pcb_temi.state, 等待中ing.);cout n*n;cout 0.结束;n;cout 1.优先权调度算法;n;cout 2.时间片轮转调度算法;n;cout *n;cout ch)switch(ch)case0: return 0;case1: copy(n, pcb, pcb_tem); work(n, pcb); break;case2: copy(n, pcb, pcb_tem); work_time(n, pcb); break;default: break;cout n请输入你的选择:n;cout n*n;cout 0.结束;n;cout 1.优先权调度算法;n;cout 2.时间片轮转调度算法;n;cout *n; cout endl;return 0;五、程序运行结果及分析分析:优先权调度算法按照给定的优先数,优先数高的进程先执行,每执行一次该进程的优先数和执行时间均减少1,当执行到两个进程的优先数相同时,则先执行未执行过的进程,然后再按新的优先数高低顺序执行为完成的进程,当进程执行完毕时会显示。时间片轮转调度算法则是按照进程输入的先后顺序进行的,每执行一次执行时间减少1,然后轮到下一个进程执行,这样循环运行,直到进程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论