操作系统实验指导书版Word格式.docx
- 文档编号:18144526
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:16
- 大小:20.88KB
操作系统实验指导书版Word格式.docx
《操作系统实验指导书版Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书版Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
*mutex++;
if(*mutex<
=0)
//唤醒等待中的进程程序实现
//生产者程序
voidproducer()
P(&
empty);
//若此时存储区空,则可以生产,否则程序挂起等待
//生产一个产品操作
printf(“生产一个产品”);
显示目前产品的个数;
V(&
full);
//通知消费者进程,可以取产品
//消费者程序
voidconsumer(){
//若此时存储区不空,则可以取产品,否则消费者程序挂起等待
//取走一个产品操作
printf(“消费一个产品”);
显示目前剩余产品的个数;
//通知生产者进程可以生产
//主函数
voidmain()
//分别调用生产者,消费者程序,顺序不限,因为已经完成信号量的同步,若发生同步问题就会等待
producer();
consumer();
………………
实验三死锁的检测和解除(2学时)
掌握死锁的概念,深入理解死锁的避免算法。
(1)编程实现银行家算法
(2)编程实现安全性算法
能够根据给定的资源分配情况,及某进程提出的资源请求,通过算法得出是否能进行分配。
如能分配,需得出相应的安全序列。
(1)安全性算法函数:
①根据安全性算法进行计算。
②如果处于安全状态,需在屏幕上打印输出如下内容:
ΧΧ时刻系统处于安全状态,安全序列为{............}。
否则,输出:
ΧΧ时刻系统处于不安全状态。
③返回主函数。
(2)银行家算法函数:
①根据银行家算法进行计算。
在计算过程中,需要调用安全性算法函数。
②如果可以分配,需在屏幕上打印输出如下内容:
可以满足进程ΧΧ的资源分配请求Request[i]={......}。
分配后的资源分配表为:
.........
不能满足进程ΧΧ的资源请求Request[i]={......}。
(3)主函数:
假定已知T0时刻的资源分配情况,即已知可利用资源向量Available分配矩阵Allocation、最大需求矩阵Max,判断目前是否处于安全状态。
如果处于安全状态,某进程进行资源申请,用银行家算法检测能否分配;
否则,提示
目前系统处于不安全状态,不能再进行资源申请。
①进行变量定义,包括:
●二维数组:
Allocation、Max、Need。
●一维数组:
Available、Work、Finish、Request[i]。
●其余变量定义根据需要指定。
②Allocation、Max、Available的值可以从键盘输入,也可在定义时直接给定。
Need值需要通过计算获得。
Request[i]的值需要从键盘接收。
③进行T0时刻安全性检测,调用安全性算法函数。
④如果需要进行资源申请,循环调用进行银行家算法函数,直至用户要求结束或不能满足进程的资源请求为止。
实验四页面置换算法的实现(2学时)
熟练掌握有关的存储管理算法,巩固有关存储器管理的教学内容。
(1)编程实现最优置换算法(OPT)算法
(2)编程实现先进先出(FIFO)算法
(3)编程实现最近最久未使用(LRU)算法或简单CLOCK置换算法
任选以上两种算法进行实现。
能够根据给定的引用串及物理块数,在屏幕上输出该算法对应的置换图,及其缺页次数和缺页率。
参考实验步骤如下:
①现定义数据结构和全局变量。
#include<
stdio.h>
conio.h>
#defineM4
#defineN17
#defineMyprintfprintf("
|---+---+---+---+---+---+---+---+---|\n"
)/*表格控制*/
typedefstructpage
{intnum;
/*记录页面号*/
inttime;
/*记录调入内存时间*/
}Page;
/*页面逻辑结构,结构为方便算法实现设计*/
Pageb[M];
/*内存单元数*/
intc[M][N];
/*暂保存内存当前的状态:
缓冲区*/
intqueue[100];
/*记录调入队列*/
intK;
/*调入队列计数变量*/
②初始化内存单元、缓冲区
voidInit(Page*b,intc[M][N])
{inti,j;
for(i=0;
i<
N;
i++)
{b[i].num=-1;
b[i].time=N-i-1;
}
M;
for(j=0;
j<
j++)
c[i][j]=-1;
③取得在内存中停留最久的页面,默认状态下为最早调入的页面
intGetMax(Page*b)
{inti;
intmax=-1;
inttag=0;
for(i=0;
{if(b[i].time>
max)
{max=b[i].time;
tag=i;
}}
returntag;
④判断页面是否已在内存中
intEquation(intfold,Page*b)
if(fold==b[i].num)returni;
return-1;
}
⑤LRU算法
voidLru(intfold,Page*b)
intval;
val=Equation(fold,b);
if(val>
{b[val].time=0;
for(i=0;
if(i!
=val)b[i].time++;
}
else
{queue[++K]=fold;
/*记录调入页面*/
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
}}
FIFO与OPT的算法描述省略。
⑥主程序
inta[N]={1,0,1,0,2,4,1,0,0,8,7,5,4,3,2,3,4};
inti,j;
start:
K=-1;
Init(b,c);
{Lru(a[i],b);
c[0][i]=a[i];
/*记录当前的内存单元中的页面*/
c[j][i]=b[j].num;
/*结果输出*/
printf("
内存状态为:
\n"
);
Myprintf;
for(j=0;
printf("
|%2d"
a[j]);
|\n"
{for(j=0;
if(c[i][j]==-1)printf("
|%2c"
32);
else
printf("
c[i][j]);
\n调入队列为:
"
K+1;
%3d"
queue[i]);
\n缺页次数为:
%6d\n缺页率:
%16.6f"
K+1,(float)(K+1)/N);
\nAreyoucontinuing!
\ty?
if(getche()=='
y'
)gotostart;
5、说明:
该代码仅供参考,照抄者实验成绩全部记为0分。
认真完成实验,并按照要求认真填写实验报告
实验五动态分区分配方式的模拟(2学时)
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区分配管理方式及其实现过程的理解。
2、实验任务及要求:
(1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链(表)来管理:
在进行内存分配时,系统优先使用空闲区低端的空间。
(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
●作业1申请130KB;
●作业2申请60KB;
●作业3申请100KB;
●作业2释放60KB;
●作业4申请200KB;
●作业3释放100KB;
●作业1释放130KB;
●作业5申请140KB;
●作业6申请60KB;
●作业7申请50KB;
●作业6释放60KB;
请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,
要求每次分配和回后显示出空闲内存分区链的情况(共有多个空闲分区,每个空闲分区的大小分别为多大)。
//********动态分区分配方式的模拟*********
iostream.h>
stdlib.h>
#defineFree0//空闲状态
#defineBusy1//已用状态
#defineOK1//完成
#defineERROR0//出错
#defineMAX_length640//最大内存空间为640KB
typedefintStatus;
typedefstructfreearea//定义一个空闲区说明表结构
{intID;
//分区号
longsize;
//分区大小
longaddress;
//分区地址
intstate;
//状态
}ElemType;
//----------线性表的双向链表存储结构------------
typedefstructDuLNode//doublelinkedlist
{ElemTypedata;
structDuLNode*prior;
//前趋指针
structDuLNode*next;
//后继指针
}DuLNode,*DuLinkList;
DuLinkListblock_first;
//头结点
DuLinkListblock_last;
//尾结点
Statusalloc(int);
//内存分配
Statusfree(int);
//内存回收
StatusFirst_fit(int,int);
//首次适应算法
StatusBest_fit(int,int);
//最佳适应算法
voidshow();
//查看分配
StatusInitblock();
//开创空间表
StatusInitblock()//开创带头结点的内存空间链表
{
block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->
prior=NULL;
next=block_last;
block_last->
prior=block_first;
next=NULL;
data.address=0;
data.size=MAX_length;
data.ID=0;
data.state=Free;
returnOK;
//-----------------------分配主存-------------------------
Statusalloc(intch)
intID,request;
cout<
<
请输入作业(分区号):
;
cin>
>
ID;
请输入需要分配的主存大小(单位:
KB):
request;
if(request<
0||request==0)
{
cout<
分配大小不合适,请重试!
endl;
returnERROR;
}
if(ch==2)//选择最佳适应算法
{if(Best_fit(ID,request)==OK)cout<
分配成功!
elsecout<
内存不足,分配失败!
returnOK;
else//默认首次适应算法
{if(First_fit(ID,request)==OK)cout<
//------------------首次适应算法-----------------------
StatusFirst_fit(intID,intrequest)//传入作业名及申请量
//为申请作业开辟新空间且初始化
DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));
temp->
data.ID=ID;
data.size=request;
data.state=Busy;
DuLNode*p=block_first->
next;
while(p)
if(p->
data.state==Free&
&
p->
data.size==request)
{//有大小恰好合适的空闲块
p->
returnOK;
break;
}
data.size>
request)
{//有空闲块能满足需求且有剩余"
temp->
prior=p->
prior;
next=p;
data.address=p->
data.address;
prior->
next=temp;
prior=temp;
data.address=temp->
data.address+temp->
data.size;
data.size-=request;
p=p->
returnERROR;
//--------------------最佳适应算法------------------------
StatusBest_fit(intID,intrequest)//传入作业名及申请量
……
//-----------------------主存回收--------------------
Statusfree(intID)
DuLNode*p=block_first;
{if(p->
data.ID==ID)
{
data.ID=Free;
if(p->
data.state==Free)//与前面的空闲块相连
{p->
data.size+=p->
p->
next=p->
next->
}
data.state==Free)//与后面的空闲块相连
{
prior=p;
break;
//---------------显示主存分配情况------------------
voidshow()
{cout<
+++++++++++++++++++++++++++++++++++++++\n"
+++主存分配情况+++\n"
{cout<
分区号:
data.ID==Free)cout<
Free"
p->
data.ID<
起始地址:
data.address<
分区大小:
data.size<
KB"
状态:
data.state==Free)cout<
空闲"
已分配"
——————————————"
//-----------------------主函数---------------------------
voidmain()
intch;
//算法选择标记
动态分区分配方式的模拟\n"
************************************\n"
**1)首次适应算法2)最佳适应算法**\n"
请选择分配算法:
ch;
Initblock();
//开创空间表
intchoice;
//操作选择标记
while
(1)
********************************************\n"
**1:
分配内存2:
回收内存**\n"
**3:
查看分配0:
退出**\n"
请输入您的操作:
cin>
choice;
if(choice==1)alloc(ch);
//分配内存
elseif(choice==2)//内存回收
intID;
cout<
请输入您要释放的分区号:
cin>
free(ID);
elseif(choice==3)show();
//显示主存
elseif(choice==0)break;
//退出
else//输入操作有误
{cout<
输入有误,请重试!
continue;
4、说明:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书