操作系统综合性实验报告-进程调度(含代码)_第1页
操作系统综合性实验报告-进程调度(含代码)_第2页
操作系统综合性实验报告-进程调度(含代码)_第3页
操作系统综合性实验报告-进程调度(含代码)_第4页
操作系统综合性实验报告-进程调度(含代码)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、XXXXXX计算机系综合性实验实 验 报 告 课程名称 操作系统 B 实验学期 XXXX 至 XXXX 学年 第 X 学期学生所在系部 计算机系 年级 XXXX 专业班级 XXXXXX 学生姓名 XXXX 学号 XXXXXXXXXXXX 任课教师 XXX 实验成绩 计算机系制 操作系统B 课程综合性实验报告开课实验室: 年 月 日实验题目进程调度算法模拟程序设计一、实验目的通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。二、设备与环境1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序

2、开发环境,如C C+Java 等编程语言环境。三、实验内容1. 用C语言(或其它语言,如Java)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。2. 每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:typedef struct node char name10; /进程的名字 int round; /一次分配CPU的时间片 int cputime; /CPU已执行时间 int needtime; /进程执行所需要的时间 char state; /进程的状态,W-就绪态,R-执行态,F-完成态 i

3、nt 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 = r

4、eady; 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) /进程执行完毕

5、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 Nr

6、un->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)、时间片的工作流程是:时间片轮转的原则是系统将所有的就绪进程按

7、照先来先服务的原则排成一个队列,每次调度时,把CPU分配队首进程,并令其执行一个时间片,当执行完时,有一个计时器发出时钟中断请求,该进程停止,并被送到就绪队列的末尾,然后再把处理机分配就绪队列的队列进程,同时也让它执行一个时间片。(3)、通过亲手实验,对上述写的时间片的工作流程和原理有了更贴切的认识。另外本次实验遇到了很大的麻烦,其实大部分代码是借鉴网上的,但自己通过修改,来获取自己想要的,在自己的努力和同学的帮助下终于调试正确,很是高兴。教 师 评 价评定项目ABCD评定项目ABCD算法正确界面美观,布局合理程序结构合理操作熟练语法、语义正确解析完整实验结果正确文字流畅报告规范题解正确其他:

8、评价教师签名:年 月 日附代码:#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node char name10; /进程的名字 int round; /一次分配CPU的时间片 int cputime; /CPU已执行时间 int needtime; /进程执行所需要的时间 char state; /进程的状态,W-就绪态,R-执行态,F-完成态 int count; /记录进程执行的次数 struct node *next; /队列指针 PCB; PCB *

9、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(

10、"n*时间片轮转进程调度算法 *n");printf("n* 计科B082 韩友 *n");printf("n* 200807014225 *n");printf("n* 2011年5月15日 *n"); printf("n请输入要创建的进程数目:n"); scanf("%d",&num); getchar(); /吸收回车符号 TimeCreate(); RoundRun(); Output(); void GetFirst() /取得第一个就绪队列节点 run =

11、 ready; if(ready!=NULL) run ->state = 'R' ready = ready ->next; run ->next = NULL; void Output() /输出队列信息 PCB *p; p = ready; printf("进程 轮数 cpu时间 需要时间 进程状态 计数器n"); while(p!=NULL) printf("%st%dt%dt%dt%ct%dn",p->name,p->round,p->cputime,p->needtime,p->

12、state,p->count); p = p->next; p = finish; while(p!=NULL) printf("%st%dt%dt%dt%ct%dn",p->name,p->round,p->cputime,p->needtime,p->state,p->count); p = p->next; p = run; while(p!=NULL) printf("%st%dt%dt%dt%ct%dn",p->name,p->round,p->cputime,p->

13、needtime,p->state,p->count); p = p->next; 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; void InsertFinish(PCB *in) /将进程插入到

14、完成队列尾部 PCB *fst; fst = finish; if(finish = NULL) in->next = finish; finish = in; else while(fst->next != NULL) fst = fst->next; in ->next = fst ->next; fst ->next = in; void TimeCreate() /时间片轮转输入函数 PCB *tmp; int i; printf("输入进程名字和进程时间片所需时间:n"); for(i = 0;i < num; i+) i

15、f(tmp = (PCB *)malloc(sizeof(PCB)=NULL) perror("malloc"); exit(1); scanf("%s",tmp->name); getchar(); scanf("%d",&(tmp->needtime); tmp ->cputime = 0; tmp ->state ='W' tmp ->round = 2; /假设每个进程所分配的时间片是2 tmp ->count = 0; InsertTime(tmp); void RoundRun() /时间片轮转调度算法 int flag = 1; GetFirst(); while(run != NULL) Output(); while(flag) run->count+; run->cputime+; run->needtime-; if(run-&

温馨提示

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

评论

0/150

提交评论