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

下载本文档

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

文档简介

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

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

3、ueNode struct 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-表示"就绪"状态 /0-表示"阻塞&quo

5、t;状态 int cpu_time ; /运行需要的CPU时间(需运行的时间片个数);struct QueueNode struct PCB_type PCB; struct QueueNode *next;struct QueueNode *ready_head=NULL, /ready队列队首指针 *ready_tail=NULL, /ready队列队尾指针 *block_head=NULL, /blocked队列队首指针 *block_tail=NULL; /blocked队列队尾指针int use_cpu,unuse_cpu;void start_state() /读入假设的数据,设置

6、系统初始状态 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=0;i<n;i+) p=(struct Qu

7、eueNode *)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 QueueNode); q->next =NU

8、LL; 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;block_tail=q; printf(&qu

9、ot;n处于就绪状态的进程有:n"); p=ready_head->next; i=1; while(p) printf(“进程%d的pid和state和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",&t); printf

10、("开始调度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("进程%d调度t",p->

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

12、t;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运行结果:7实验总结:实验帮我复习了数据结构和C语言,且巩固课本知识,

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

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

15、内存大小,重新插入空闲链队,按从大到小,接着把作业占用的内存放到占用区链节点的末尾。每次作业运行完,就要回收其占用的内存大小,把作业节点按从大到小插入到空闲链队中。5.源代码:#include<stdio.h>#include<stdlib.h>struct freelinkNodeint len;int address; struct freelinkNode *next;struct busylinkNodechar name; int len;int address;struct busylinkNode *next;struct freelinkNode *fr

16、ee_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 freelinkNode); free_head->next=NU

17、LL; / 创建自由链头结点 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占用了64K p->next=NULL; free_head->next=p; q=(struct busylinkNode *)m

18、alloc(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>=require)p=(struct bus

19、ylinkNode*)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;else printf("Can't allocate"); w=free_head->next; free_head->next=w->next; if(w->len=require) fr

20、ee(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;freelinkNode *w,*u

21、,*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);else if(p=busy_tail) busy_tail=q; else q->next=p->next; len=p->len;address=p->address;free(p); w=(struct freelinkNode*)malloc(sizeof(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)

温馨提示

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

评论

0/150

提交评论