操作系统实验报告材料_第1页
操作系统实验报告材料_第2页
操作系统实验报告材料_第3页
操作系统实验报告材料_第4页
操作系统实验报告材料_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、实用标准文档实验二 进程调度1 目的和要求通过这次实验, 理解进程调度的过程, 进一步掌握进程状态的转变、 进程调度的策略, 进一步体会多道程序并发执行的特点, 并分析具体的调度算法的特点,掌握对系统性能的评价方法。2 实验内容阅读教材 计算机操作系统 第二章和第三章, 掌握进程管理及调度相关概念和原理。编写程序模拟实现进程的轮转法调度过程,模拟程序只对 PCB 进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有n 个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞) ,且每过 t 个时间片系统释放资源,唤醒处于阻塞队

2、列队首的进程。程序要求如下:1)输出系统中进程的调度次序;2)计算CPUPJ用率。3 实验环境Windows操作系统、VC+6.0C语言4 设计思想:( 1 ) 程序中进程可用 PCB 表示,其类型描述如下:struct PCB_typeint pid ;/进程名文案大全实用标准文档int state ;/ 进程状态2表示“执行”状态1表示“就绪”状态0表示“阻塞”状态int cpu_time ; /运行需要的 CPU 时间(需运行的时间片个数)用 PCB 来模拟进程;( 2)设置两个队列,将处于“就绪”状态的进程PCB 挂在队列 ready 中;将处于“阻塞”状态的进程PCB 挂在队列 bl

3、ocked 中。 队列类型描述如下:struct QueueNodestruct PCB_type PCB;Struct QueueNode *next;并设全程量:struct QueueNode *ready_head=NULL,/ready 队列队首指针*ready_tail=NULL , /ready 队列队尾指针*blocked_head=NULL,/blocked 队列队首指针*blocked_tail=NULL; /blocked 队列队尾指针( 3) 设计子程序:start_state();读入假设的数据, 设置系统初始状态, 即初始化就绪队列和阻塞队列。dispath();模

4、拟调度, 当就绪队列的队首进程运行一个时间片后, 放到就绪队列末尾, 每次都是队首进程进行调度, 一个进程运行结束就从就绪队列中删除,当到 t 个时间片后,唤醒阻塞队列队首进程。calculate();就绪进程运行一次,usecpu加1,当就绪队列为空时unusecpu加1,CPU 利用率为 use_cpu/(use_cpu+unuse_cpu)。5 源代码:#include<stdio.h>#include<stdlib.h>struct PCB_type int pid ;/进程名int state ;/ 进程状态/2-表示 "执行 "状态/1-

5、表示 "就绪 "状态/0-表示 " 阻塞 "状态int cpu_time ;/运行需要的 CPU 时间(需运行的时间片个数);struct QueueNodestruct PCB_type PCB;struct QueueNode *next;/ready 队列队首指针/ready 队列队尾指针/blocked 队列队首指针/blocked 队列队尾指针struct QueueNode *ready_head=NULL,*ready_tail=NULL,*block_head=NULL,*block_tail=NULL;int use_cpu,unuse

6、_cpu;void start_state() /读入假设的数据,设置系统初始状态int n,m;int i;struct QueueNode *p,*q;printf(" 输入就绪节点个数n:");scanf("%d",&n);printf(" 输入阻塞节点个数m:");scanf("%d",&m);p=(struct QueueNode *)malloc(sizeof(struct QueueNode);p->next =NULL;ready_head=ready_tail=p;for(i

7、=0;i<n;i+)p=(struct QueueNode *)malloc(sizeof(struct QueueNode);p->next =NULL;p->PCB.state=1;printf(" 输入就绪进程%d 的 pid 和 cpu_time:",i+1);scanf("%d%d",&p->PCB.pid,&p->PCB.cpu_time);ready_tail->next=p;ready_tail=p;q=(struct QueueNode *)malloc(sizeof(struct Q

8、ueueNode);q->next =NULL;block_head=block_tail=q;for(i=0;i<m;i+)q=(struct QueueNode *)malloc(sizeof(struct QueueNode); q->next=NULL;q->PCB.state=0;printf(" 输入阻塞进程%d 的 pid 和 cpu_time:",i+1);scanf("%d%d",&q->PCB.pid,&q->PCB.cpu_time);block_tail->next=q;

9、block_tail=q;printf("n 处于就绪状态的进程有:n");p=ready_head->next;i=1;state 和while(p)printf( “ 进 程 %d 的 pid 和cpu_time:%5d%5d%5dn",i,p->PCB.pid,p->PCB.state,p->PCB.cpu_time); p=p->next;i+;void dispath()/模拟调度int x=0,t;use_cpu=0;unuse_cpu=0;printf(" 输入 t:");scanf("%d

10、",&t);printf(" 开始调度 n");while(ready_head!=ready_tail|block_head!=block_tail) struct QueueNode *p,*q;if(ready_head!=ready_tail) p=ready_head->next;ready_head->next=p->next;p->next=NULL;if(ready_head->next=NULL) ready_tail=ready_head;p->PCB.state=2;printf(" 进程

11、 %d 调度 t",p->PCB.pid);use_cpu+;x+;p->PCB.cpu_time-;if(p->PCB.cpu_time)ready_tail->next=p;ready_tail=p;elseprintf(" 进程 %d 完成 t",p->PCB.pid);free(p);elseunuse_cpu+;x+;printf(" 空闲一个时间片 t");if(x=t&&block_head!=block_tail)q=block_head->next;block_head-&g

12、t;next=q->next;q->next=NULL;if(block_head->next=NULL)block_tail=block_head;ready_tail->next=q;ready_tail=q;x=0;void calculate() /计算 CPU 利用率printf("ncpu 的利用率 %.2fn",(float)use_cpu/(use_cpu+unuse_cpu);void main()start_state();dispath();calculate();6运行结果:一组八人人入入,.一二n:2 导个砺:3 圣1的诞d

13、和cpu 等的pid.和cpu 聚1的pid知cpu 是2的贯麻口£ pu 星3的pid和cpu七十就绪状态的进程有二程 1的 pid和wtatc和cpu_t ine : 程2 的 pid和“Ate 1.Qcpu_t ime : 入七;6躁Fin融I 量南度 进;pu的利用率0.83 pess anu key to continue_t ine 一time _t imeiine2345片间 匿成度篇度 粤调 2 2 3 4-5 7 王口王旱sr片 间 需成度度度 1-3 455 iis 进空进进进进程 进进空进进片 间7实验总结:实验帮我复习了数据结构和c语言,且巩固课本知识,知道了

14、如何定义结构体,如何在链接队列中增删节点。模拟进程调度帮我们巩固了进程三状态之间的变迁。懂得调式的重要性。总之,我们明白了理论联系实际。多看书,多上机。实验三 可变分区存储管理1 目的和要求通过这次实验, 加深对内存管理的认识, 进一步掌握内存的分配、 回收算法 的思想。2 实验内容阅读教材计算机操作系统第四章,掌握存储器管理相关概念和原理。编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理, 采用最坏适应算法从自由链中寻找空闲区进行分配, 内存回收时假定不做与 相邻空闲区的合并。假定系统白内存共640K,初始状态为操作系统本身占用 64K。在t1时间之 后,有作业 A B、C

15、、D分别请求8K、16K、64K、124K的内存空间;在t2时间 之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之 后,作业D完成。要求编程序分别输出t1、t2、t3、t4时刻内存的空闲区的状 态。3 实验环境Windows操作系统、VC+6.0C语言4 . 设计思想模拟内存分配和回收, 要设置两个链队列, 一个空闲区链和一个占用区链, 空闲区链节点有起始地址, 大小和指向下一节点的指针等数据域, 占用区链节点有起始地址,大小,作业名和指向下一节点的指针等数据域, 本实验用最坏适应算法, 每次作业申请内存都是从空闲链队头节点分配,如果相等,就删除空闲头结点,如果小于申

16、请的,就不分配,否则就划分内存给作业, 剩下的内存大小,重新插入空闲链队, 按从大到小,接着把作业占用的内存放到占用区链节点的末尾。 每次作业运行完, 就要回收其占用的内存大小, 把作业节点按从大到小插入到空闲链队中。文案大全实用标准文档文案大全5. 源代码:#include<stdio.h>#include<stdlib.h>struct freelinkNodeint len;int address;struct freelinkNode *next;struct busylinkNodechar name;int len;int address;struct bu

17、sylinkNode *next;struct freelinkNode *free_head=NULL;struct busylinkNode *busy_head=NULL;struct busylinkNode *busy_tail=NULL;void start(void) /* 设置系统初始状态/自由链队列(带头结点)队首指针/占用区队列队(带头结点)首指针/占用区队列队尾指针*/struct freelinkNode *p;struct busylinkNode *q;free_head=(struct freelinkNode*)malloc(sizeof(struct free

18、linkNode);free_head->next=NULL; / 创建自由链头结点busy_head=busy_tail=(struct busylinkNode*)malloc(sizeof(struct busylinkNode);busy_head->next=NULL; / 创建占用链头结点p=(struct freelinkNode *)malloc(sizeof(struct freelinkNode);p->address=64;p->len=640-64;/OS 占用了 64Kp->next=NULL;free_head->next=p;q

19、=(struct busylinkNode *)malloc(sizeof(struct busylinkNode);q->name='S' /* S 表示操作系统占用 */q->len=64; q->address=0; q->next=NULL; busy_head->next=q; busy_tail=q;void requireMemo(char name, int require) /* 模拟内存分配*/freelinkNode *w,*u,*v;busylinkNode *p;if(free_head->next->len&

20、gt;=require) p=(struct busylinkNode*)malloc(sizeof(struct busylinkNode); p->name=name;p->address=free_head->next->address;p->len=require;p->next=NULL;busy_tail->next=p;busy_tail=p;elseprintf("Can't allocate");w=free_head->next;free_head->next=w->next;if(w-

21、>len=require)free(w);elsew->address=w->address+require;w->len=w->len-require;u=free_head;v=free_head->next;while(v!=NULL)&&(v->len>w->len) u=v;v=v->next;u->next=w;w->next=v;void freeMemo(char name) /* 模拟内存回收*/int len;int address;busylinkNode *q,*p;freelink

22、Node *w,*u,*v;q=busy_head;p=busy_head->next;while(p!=NULL)&&(p->name!=name) q=p;p=p->next;if (p=NULL)printf("%c is not exist",name);elseif(p=busy_tail) busy_tail=q;else q->next=p->next;len=p->len;address=p->address;free(p);w=(struct freelinkNode*)malloc(sizeof(

23、struct freelinkNode);w->len=len;w->address=address;u=free_head;v=free_head->next;while(v!=NULL)&&(v->len>len) u=v; v=v->next;u->next=w;w->next=v;void past(int time) /* 模拟系统过了 time 时间 */printf(" 过了时间 %d 后 :n",time);void printlink() /* 输出内存空闲情况(自由链的结点) */freelinkNode *p;printf(" 内存的空闲情况为:n");p=(struct freelinkNode *

温馨提示

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

评论

0/150

提交评论