XXXXXX计算机系综合性实验实 验 报 告 课程名称 操作系统 B 实验学期 XXXX 至 XXXX 学年 第 X 学期学生所在系部 计算机系 年级 XXXX 专业班级 XXXXXX 学生姓名 XXXX 学号 XXXXXXXXXXXX 任课教师 XXX 实验成绩 计算机系制《 操作系统B 》课程综合性实验报告开课实验室: 年 月 日实验题目进程调度算法模拟程序设计一、实验目的通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解二、设备与环境1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java 等编程语言环境。
三、实验内容1. 用C语言(或其它语言,如Java)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟2. 每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:typedef struct node { char name[10]; //进程的名字 int round; //一次分配CPU的时间片 int cputime; //CPU已执行时间 int needtime; //进程执行所需要的时间 char state; //进程的状态,W-就绪态,R-执行态,F-完成态 int count; //记录进程执行的次数 struct node *next; //队列指针 }PCB; 3.主要算法:(1)取得第一个就绪队列节点void GetFirst() { run = ready; if(ready!=NULL) { run ->state = 'R'; ready = ready ->next; run ->next = NULL; } } (2)将进程插入就绪片队列void InsertTime(PCB *in) //将进程插入到就绪队列尾部{ PCB *fst; fst = ready; if(ready == NULL) { in->next = ready; ready = in; } else { while(fst->next != NULL) { fst = fst->next; } in ->next = fst ->next; fst ->next = in; } } (3)时间片轮转调度void RoundRun() { int flag = 1; GetFirst(); while(run != NULL) { Output(); while(flag) { run->count++; run->cputime++; run->needtime--; if(run->needtime == 0) //进程执行完毕 { run ->state = 'F'; InsertFinish(run); flag = 0; } else if(run->count == run->round)//时间片用完 { run->state = 'W'; run->count = 0; //计数器清零,为下次做准备 InsertTime(run); flag = 0; } } flag = 1; GetFirst(); } } 4.流程图:开始界面显示输入进程数目进程信息输入并初始化将进程插入就绪队列设标志flag=1取就绪队列首节点Run!=null N结束输出各队列进程信息 YFlag=1 Nrun->count++; run->cputime++;run->needtime--; run->cputime++; run->needtime--; Yrun->needtime == 0run->count== run->roundrun->roundrun->round Y N N 将进程插入完成队列将进程插入就绪队列 YFlag=0 四、实验结果及分析 1.程序运行截图:2.实验体会(1)、本实验的难点是每执行一个时间片就让它排到队尾,也即重新排序,并从头开始调度执行!(2)、时间片的工作流程是:时间片轮转的原则是系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度时,把CPU分配队首进程,并令其执行一个时间片,当执行完时,有一个计时器发出时钟中断请求,该进程停止,并被送到就绪队列的末尾,然后再把处理机分配就绪队列的队列进程,同时也让它执行一个时间片。
3)、通过亲手实验,对上述写的时间片的工作流程和原理有了更贴切的认识另外本次实验遇到了很大的麻烦,其实大部分代码是借鉴网上的,但自己通过修改,来获取自己想要的,在自己的努力和同学的帮助下终于调试正确,很是高兴教 师 评 价评定项目ABCD评定项目ABCD算法正确界面美观,布局合理程序结构合理操作熟练语法、语义正确解析完整实验结果正确文字流畅报告规范题解正确其他:评价教师签名:年 月 日附代码:#include #include #include typedef struct node { char name[10]; //进程的名字 int round; //一次分配CPU的时间片 int cputime; //CPU已执行时间 int needtime; //进程执行所需要的时间 char state; //进程的状态,W-就绪态,R-执行态,F-完成态 int count; //记录进程执行的次数 struct node *next; //队列指针 }PCB; PCB *ready=NULL,*run=NULL,*finish=NULL; //定义三个队列,就绪队列,执行队列和完成队列 int num; void GetFirst(); //从就绪队列取得第一个节点 void Output(); //输出各队列信息 void InsertTime(PCB *in); //插入就绪片队列 void InsertFinish(PCB *in); //插入完成队列 void TimeCreate(); //时间片输入函数 void RoundRun(); //时间片轮转调度 void main() { printf("\n****** 欢迎光临指导 ******\n"); printf("\n****** 时间片轮转进程调度算法 ******\n"); printf("\n****** 计科B082 韩友 ******\n"); printf("\n****** 200807014225 ******\n"); printf("\n****** 。