OS计算机操作系统课程实验报告

上传人:博****1 文档编号:389272734 上传时间:2023-05-13 格式:DOC 页数:12 大小:150.50KB
返回 下载 相关 举报
OS计算机操作系统课程实验报告_第1页
第1页 / 共12页
OS计算机操作系统课程实验报告_第2页
第2页 / 共12页
OS计算机操作系统课程实验报告_第3页
第3页 / 共12页
OS计算机操作系统课程实验报告_第4页
第4页 / 共12页
OS计算机操作系统课程实验报告_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《OS计算机操作系统课程实验报告》由会员分享,可在线阅读,更多相关《OS计算机操作系统课程实验报告(12页珍藏版)》请在金锄头文库上搜索。

1、肇庆学院计算机科学与软件学院计算机操作系统课程实验报告姓名:学号:班级:完成日期:实验题目进程调度模拟程序实验形式小组合作 独立完成 设计目的1. 加深对进程、进程控制块及进程队列等概念的理解。2. 了解优先数和时间片轮转调度算法的具体实施办法,加深对进程管理各部分内容的理解。 设计预备知识1. 进程管理。2. 优先数调度算法、时间片轮转算法。设计内容可按实际情况选择一下列出的1个题目:1.设计一个采用优先数调度算法的模拟进程调度程序。2.设计一个采用时间片轮准调度算法的模拟进程调度程序。3.进程调度模拟程序的设计(包括至少两种调度算法)。要求如下:(1)设计进程控制块PCB表结构,分别适用于

2、优先权调度算法和时间片轮转调度算法。PCB结构包括以下信息:进程名、进程优先数(或轮转时间片),进程所占用的CPU时间,进程的状态,当前队列指针等。根据调度算法的不同,PCB结构的内容可以作适当的增删。(2)建立进程就绪队列。对两种不同算法编制入链子程序。(3)设计的程序中能显示或打印进程控制块的动态变化过程。一、设计理论描述(1)抢占式优先权调度算法进程按照优先数的大小进行排队,优先数最高的先执行,直到出现另一个优先权更高的进程,进程调度便停止当前进程的执行,重新将处理机分配给新到的优先权更高的进程。(2)时间片轮转法(先来先服务原则) 进程按先来先服务原则将所有的进程排队,每次调度时,把C

3、PU分配给队首进程,并令其执行一个时间片,当时间片用完,则把它送入队列末尾,再执行下一个进程,如此循环。二、设计思想、设计分析及数据结构模型程序中利用快速排序算法,效率更高,通过此算法可以确定进程的入队顺序。然后再按照不同的算法要求执行进程。程序中用到的数据结构:快速排序函数: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_te

4、m)/ 进程间的复制;加入这个函数,是为了可以选择多个运行,调用每个算法时,不用重新输入每个进程的值;/不改变它的值;如 PCB_tem 复制到 PCB ,如果没有这个函数,那么 PCB 的值就会改变;int i;for(i=0; in; i+)PCBi.degree = PCB_temi.degree;PCBi.rtime = PCB_temi.rtime;strcpy(PCBi.name, PCB_temi.name);strcpy(PCBi.state, PCB_temi.state);队列的使用:具体表现在进程的出队入队。三、变量说明及程序流程图char name20; 进程名 int

5、 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; /

6、运行所要的时间;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

7、%d %d %sn,PCB0.name,PCB0.degree,PCB0.rtime,正在运行);for(i=1; in; i+)if(strcmp(PCBi.state, 已经结束) = 0) / 表明已经结束;printf( %s - - %sn,PCBi.name,PCBi.state);else /还没结束;printf( %s %d %d %sn,PCBi.name,PCBi.degree,PCBi.rtime,PCBi.state);cout endl;PCB0.degree-; / 权值会减一;PCB0.rtime-; / 运行时间也一样;if(PCB0.rtime = 0) /

8、 判断该进程是否运行完毕;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,PCBi.name,PCBi.state); / 全部输出;cout n随便输入一个键返回菜单。n;getch(); system(cls); / 清屏;bre

9、ak; / 结束;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

10、 %d %sn,PCBi.name,PCBi.rtime,PCBi.state);for(i=0; ilen; i+) printf( %s - %sn,temi.name,已经完成); /输出已经运行的进程;cout endl;PCB0.rtime-; / 运行完之后,这个进程的时间就会减一;node zero; zero = PCB0;if(PCB0.rtime = 0) / 表示已经完成了;strcpy(PCB0.state, 已经结束); temlen = PCB0; / 已经完成的就放在tem;for(j=1; jn; j+) / 相当于一个队头,每次都运行完减一,每个进程都相互轮着

11、当队列的头元素;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,temi.name,已经完成);cout n随便输入一个键返回菜单。n;getch(); system(cls);b

12、reak;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(PCBi.name, PCB_temi.name);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; in

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号