操作系统实验报告Word文档下载推荐.docx
《操作系统实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
//进程状态
2——表示“执行”状态
1——表示“就绪”状态
0——表示“阻塞”状态
intcpu_time;
//运行需要的CPU时间(需运行的时间片个数)
}
用PCB来模拟进程;
(2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;
将处于“阻塞”状态的进程PCB挂在队列blocked中。
队列类型描述如下:
structQueueNode{
structPCB_typePCB;
StructQueueNode*next;
}
并设全程量:
structQueueNode*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>
stdlib.h>
structPCB_type
intstate;
//进程状态
//2--表示"
执行"
状态
//1--表示"
就绪"
状态
//0--表示"
阻塞"
//运行需要的CPU时间(需运行的时间片个数)
};
structQueueNode{
structQueueNode*next;
structQueueNode*ready_head=NULL,//ready队列队首指针
*ready_tail=NULL,//ready队列队尾指针
*block_head=NULL,//blocked队列队首指针
*block_tail=NULL;
intuse_cpu,unuse_cpu;
voidstart_state()//读入假设的数据,设置系统初始状态
intn,m;
inti;
structQueueNode*p,*q;
printf("
输入就绪节点个数n:
"
);
scanf("
%d"
&
n);
输入阻塞节点个数m:
m);
p=(structQueueNode*)malloc(sizeof(structQueueNode));
p->
next=NULL;
ready_head=ready_tail=p;
for(i=0;
i<
n;
i++)
{
PCB.state=1;
输入就绪进程%d的pid和cpu_time:
i+1);
%d%d"
p->
PCB.pid,&
PCB.cpu_time);
ready_tail->
next=p;
ready_tail=p;
q=(structQueueNode*)malloc(sizeof(structQueueNode));
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%5d\n"
i,p->
PCB.pid,p->
PCB.state,p->
p=p->
i++;
voiddispath()//模拟调度
intx=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
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;
voidcalculate()//计算CPU利用率
\ncpu的利用率%.2f\n"
(float)use_cpu/(use_cpu+unuse_cpu));
voidmain()
{start_state();
dispath();
6运行结果:
7实验总结:
实验帮我复习了数据结构和C语言,且巩固课本知识,知道了如何定义结构体,如何在队列中增删节点。
模拟进程调度帮我们巩固了进程三状态之间的变迁。
懂得调式的重要性。
总之,我们明白了理论联系实际。
多看书,多上机。
实验三可变分区存储管理
通过这次实验,加深对存管理的认识,进一步掌握存的分配、回收算法的思想。
阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
编写程序模拟实现存的动态分区法存储管理。
存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,存回收时假定不做与相邻空闲区的合并。
假定系统的存共640K,初始状态为操作系统本身占用64K。
在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的存空间;
在t2时间之后,作业C完成;
在t3时间之后,作业E请求50K的存空间;
在t4时间之后,作业D完成。
要求编程序分别输出t1、t2、t3、t4时刻存的空闲区的状态。
4.设计思想
模拟存分配和回收,要设置两个链队列,一个空闲区链和一个占用区链,空闲区链节点有起始地址,大小和指向下一节点的指针等数据域,占用区链节点有起始地址,大小,作业名和指向下一节点的指针等数据域,本实验用最坏适应算法,每次作业申请存都是从空闲链队头节点分配,如果相等,就删除空闲头结点,如果小于申请的,就不分配,否则就划分存给作业,剩下的存大小,重新插入空闲链队,按从大到小,接着把作业占用的存放到占用区链节点的末尾。
每次作业运行完,就要回收其占用的存大小,把作业节点按从大到小插入到空闲链队中。
5.源代码:
structfreelinkNode{
intlen;
intaddress;
structfreelinkNode*next;
structbusylinkNode{
charname;
structbusylinkNode*next;
structfreelinkNode*free_head=NULL;
//自由链队列(带头结点)队首指针
structbusylinkNode*busy_head=NULL;
//占用区队列队(带头结点)首指针
structbusylinkNode*busy_tail=NULL;
//占用区队列队尾指针
voidstart(void)/*设置系统初始状态*/
structfreelinkNode*p;
structbusylinkNode*q;
free_head=(structfreelinkNode*)malloc(sizeof(st