1、 /进程状态 2表示“执行”状态 1表示“就绪”状态 0表示“阻塞”状态 int cpu_time ; /运行需要的CPU时间(需运行的时间片个数) 用PCB来模拟进程;(2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。 队列类型描述如下: struct QueueNode struct PCB_type PCB; Struct QueueNode *next;并设全程量:struct QueueNode *ready_head=NULL,/ready队列队首指针*ready_tail=NULL , /ready队列
2、队尾指针*blocked_head=NULL,/blocked队列队首指针*blocked_tail=NULL; /blocked队列队尾指针(3)设计子程序: start_state(); 读入假设的数据,设置系统初始状态,即初始化就绪队列和阻塞队列。dispath();模拟调度,当就绪队列的队首进程运行一个时间片后,放到就绪队列末尾,每次都是队首进程进行调度,一个进程运行结束就从就绪队列中删除,当到t个时间片后,唤醒阻塞队列队首进程。 calculate(); 就绪进程运行一次,usecpu加1,当就绪队列为空时unusecpu加1,CPU利用率为use_cpu/(use_cpu+unus
3、e_cpu)。5源代码:#includestdlib.hstruct PCB_type int state ; /进程状态 /2-表示执行状态 /1-表示就绪状态 /0-表示阻塞 /运行需要的CPU时间(需运行的时间片个数);struct QueueNode struct QueueNode *next;struct QueueNode *ready_head=NULL, /ready队列队首指针 *ready_tail=NULL, /ready队列队尾指针 *block_head=NULL, /blocked队列队首指针 *block_tail=NULL;int use_cpu,unuse_
4、cpu;void start_state() /读入假设的数据,设置系统初始状态 int n,m; int i; struct QueueNode *p,*q; printf(输入就绪节点个数n:); scanf(%d,&n);输入阻塞节点个数m:m); p=(struct QueueNode *)malloc(sizeof(struct QueueNode); p-next =NULL; ready_head=ready_tail=p; for(i=0;iPCB.pid,&PCB.cpu_time); ready_tail-next=p; ready_tail=p; q=(struct Qu
5、eueNode *)malloc(sizeof(struct QueueNode); q- block_head=block_tail=q;m;next=NULL;PCB.state=0;输入阻塞进程%d的pid和cpu_time:q- block_tail-next=q; block_tail=q;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- p=p- i+;void dispath() /模拟调度 int
6、 x=0,t; use_cpu=0; unuse_cpu=0;输入t:t);开始调度n while(ready_head!=ready_tail|block_head!=block_tail) if(ready_head!=ready_tail) ready_head-next=p- p- if(ready_head-next=NULL) ready_tail=ready_head; PCB.state=2; printf(进程%d调度t,p-PCB.pid); use_cpu+; x+;PCB.cpu_time-; if(p-PCB.cpu_time) ready_tail=p; else
7、printf(进程%d完成t free(p); else unuse_cpu+;空闲一个时间片t if(x=t&block_head! q=block_head- block_head-next=q- q- if(block_head- block_tail=block_head; ready_tail- ready_tail=q; x=0;void calculate() /计算CPU利用率ncpu的利用率%.2fn,(float)use_cpu/(use_cpu+unuse_cpu);void main()start_state(); dispath();6运行结果:7实验总结:实验帮我复
8、习了数据结构和C语言,且巩固课本知识,知道了如何定义结构体,如何在队列中增删节点。模拟进程调度帮我们巩固了进程三状态之间的变迁。懂得调式的重要性。总之,我们明白了理论联系实际。多看书,多上机。实验三 可变分区存储管理通过这次实验,加深对存管理的认识,进一步掌握存的分配、回收算法的思想。阅读教材计算机操作系统第四章,掌握存储器管理相关概念和原理。编写程序模拟实现存的动态分区法存储管理。存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,存回收时假定不做与相邻空闲区的合并。假定系统的存共640K,初始状态为操作系统本身占用64K。在t1时间之后,有作业A、B、C、D分别请求8K、
9、16K、64K、124K的存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的存空间;在t4时间之后,作业D完成。要求编程序分别输出t1、t2、t3、t4时刻存的空闲区的状态。4.设计思想模拟存分配和回收,要设置两个链队列,一个空闲区链和一个占用区链,空闲区链节点有起始地址,大小和指向下一节点的指针等数据域,占用区链节点有起始地址,大小,作业名和指向下一节点的指针等数据域,本实验用最坏适应算法,每次作业申请存都是从空闲链队头节点分配,如果相等,就删除空闲头结点,如果小于申请的,就不分配,否则就划分存给作业,剩下的存大小,重新插入空闲链队,按从大到小,接着把作业占用的存放到占用
10、区链节点的末尾。每次作业运行完,就要回收其占用的存大小,把作业节点按从大到小插入到空闲链队中。5.源代码:struct freelinkNodeint len;int address;struct freelinkNode *next;struct busylinkNodechar name;struct busylinkNode *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(st
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1