实验二进程调度1.目的和要求通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。
2.实验内容阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。
编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。
假设初始状态为:有 n 个进程处于就绪状态,有m个进程处于阻塞状态。
采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过 t 个时间片系统释放资源,唤醒处于阻塞队列队首的进程。
程序要求如下: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挂在队列readyxx ;将处于“阻塞”状态的进程 PCB挂在队列blockedxx。
队列类型描述如下:struct QueueNode{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();模拟调度,当就绪队列的队首进程运行一个时间片后,放到就绪队列末尾,每次都是队首进程进行调度,一个进程运行结束就从就绪队列中删除,当到 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-- 表示" 阻塞"状态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() // 读入假设的数据,设置系统初始状态数)操作系统实验报告{int n,m;int i;struct QueueNode *p,*q;printf(" 输入就绪节点个数 n:");scanf("%d",&n);printf(" 输入阻塞节点个数 m:");scanf("%d",&m);p=(struct QueueNode *)malloc(sizeof(structQueueNode));p->next =NULL;ready_head=ready_tail=p;for(i=0;i<n;i++){p=(struct QueueNode *)malloc(sizeof(structp->next =NULL;QueueNode));操作系统实验报告p->PCB.state=1;printf(" 输入就绪进程%小的 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 =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(" 输入阻塞进程%小的 pid 和 cpu_time:",i+1);scanf("%d%d",&q->PCB.pid,&q->PCB.cpu_time);操作系统实验报告block_tail->next=q;block_tail=q;}printf("\n 处于就绪状态的进程有 :\n");p=ready_head->next;i=1;while(p){printf( “进程%小的pid和state 和cpu_time:%5d%5d%5d\n",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(" 开始调度 \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(”进程%c调度 \t",p->PCB.pid); use_cpu++;x++;p->PCB.cpu_time--;if(p->PCB.cpu_time){ready_tail->next=p;ready_tail=p;}else{printf(”进程%c完成 \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->next;q->next=NULL;if(block_head->next==NULL){block_tail=block_head;}ready_tail->next=q;ready_tail=q;x=0;}}}void calculate。
// 计算 CPI利用率{printf("\ncpu 的利用率%\n ",(float)use_cpu/(use_cpu+unu se_cpu));}void main(){start_state();dispath();calculate 。
;}6运行结果: 何定义结构体,如何在链接队列中增删节点。
模拟进程调度帮我们巩 固了进程三状态之间的变迁。
懂得调式的重要性。
总之,我们 xx 了 理论联系实际。
多看书,多上机。
实验三 可变分区存储管理1.目的和要求通过这次实验, 加深对内存管理的认识, 进一步掌握内存的分配、 回收算法的思想。
2.实验内容112 2 13u u u u U p p p p P c c-ccCn D Q n n 2 3禾禾禾禾币 t : d d d d d n n i i ・H i i -ppp __ 的的的 /- 12 12 3片 间 度需度度 2 3-45 sis 进进空进进片 间 成編度度成 完片 间 縞成度度度 1-3 455 is — 八入入入入入入 才磁绪状态的进程有:1 p id^D s t At e ^[] c pu_time : 翟£ 的 pidjplat ate^cpujtime : At :6 |> 进厂一 H I 片 间廣成度需度 调 2 2 3 4-5 tsis _t inc _t ime _t ine tine ine 薮 ■Lr. _TA I T A - ¥ -A ¥ Tfl > -A 雪£■ 之「玄■■阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
编写程序模拟实现内存的动态分区法存储管理。
内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。
假定系统的内存共640K初始状态为操作系统本身占用 64K。
在 t1时间之后,有作业 A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完成。
要求编程序分别输出 t1 、 t2 、 t3 、 t4 时刻内存的空闲区的状态。