操作系统实验指导书版.docx
- 文档编号:5173230
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:16
- 大小:20.88KB
操作系统实验指导书版.docx
《操作系统实验指导书版.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书版.docx(16页珍藏版)》请在冰豆网上搜索。
操作系统实验指导书版
本课实验从下列中自选四个完成
实验一Linux操作系统的使用(2学时)
1、实验目的:
了解Linux的桌面环境及常用命令、学会在Linux环境下进行C语言程序编程与调试。
2、实验任务:
(1)熟悉Linux常用命令及操作。
(2)熟悉Vi编辑器的使用。
(3)体会Linux下C语言编程调试方式。
3、实验要求:
(1)记录各命令的运行结果写入实验报告中。
(2)体会Linux中的命令接口方式,习惯用键盘来操纵系统。
(3)自己查阅资料,进一步了解GDB的调试方法,将实验过程中遇到的问题及其解决方法写入实验报告。
4、设计思路和采取的方案:
参考《计算机操作系统原理实验指导书》第14页,第2章。
(后续实验也可参考本书)
实验二进程同步(2学时)
1、实验目的:
加强对进程概念的理解,尤其是进程的同步与互斥机制。
2、实验任务:
编程实现生产者-消费者问题的模拟。
建议用C或C++语言编写源代码。
3、实验要求:
(1)生产者消费者对缓冲区进行互斥操作。
(2)缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。
(3)生产者消费者各循环操作10次。
4、设计思路和采取的方案:
(1)以下整个程序以伪代码形式给出,给出的是框架,起到模拟效果。
(2)利用P,V操作使得在同一时刻,生产者和消费者只能有一个对存储区操作(即临界区)。
(3)如果两者同时对存储区操作,即同时取和生产的话,必定会有一个等待,当另一个完成操作后自己才会被唤醒。
(4)生产者在存储区满时不能再生产,进入等待,消费者同理
(5)完成同步互斥效果
/*----以下为代码部分-----*/
//定义全局变量
intempty=n;//该信号量表示缓冲池中空缓冲区的数量
intfull=0;//该信号量表示缓冲池中满空缓冲区的数量
//P操作
voidP(int&mutex)
{
*mutex--;
if(*mutex<0)
{
//当前进程挂起的程序实现
}
}
//V操作
voidV(int&mutex)
{
*mutex++;
if(*mutex<=0)
{
//唤醒等待中的进程程序实现
}
}
//生产者程序
voidproducer()
{
P(&empty);//若此时存储区空,则可以生产,否则程序挂起等待
//生产一个产品操作
printf(“生产一个产品”);
显示目前产品的个数;
V(&full);//通知消费者进程,可以取产品
}
//消费者程序
voidconsumer(){
P(&full);//若此时存储区不空,则可以取产品,否则消费者程序挂起等待
//取走一个产品操作
printf(“消费一个产品”);
显示目前剩余产品的个数;
V(&empty);//通知生产者进程可以生产
}
//主函数
voidmain()
{
//分别调用生产者,消费者程序,顺序不限,因为已经完成信号量的同步,若发生同步问题就会等待
producer();
consumer();
consumer();
producer();
………………
}
实验三死锁的检测和解除(2学时)
1、实验目的:
掌握死锁的概念,深入理解死锁的避免算法。
2、实验任务:
(1)编程实现银行家算法
(2)编程实现安全性算法
3、实验要求:
能够根据给定的资源分配情况,及某进程提出的资源请求,通过算法得出是否能进行分配。
如能分配,需得出相应的安全序列。
4、设计思路和采取的方案:
(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、实验目的:
熟练掌握有关的存储管理算法,巩固有关存储器管理的教学内容。
2、实验任务:
(1)编程实现最优置换算法(OPT)算法
(2)编程实现先进先出(FIFO)算法
(3)编程实现最近最久未使用(LRU)算法或简单CLOCK置换算法
3、实验要求:
任选以上两种算法进行实现。
能够根据给定的引用串及物理块数,在屏幕上输出该算法对应的置换图,及其缺页次数和缺页率。
4、设计思路和采取的方案:
参考实验步骤如下:
①现定义数据结构和全局变量。
#include
#include
#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 {b[i].num=-1; b[i].time=N-i-1;} for(i=0;i for(j=0;j c[i][j]=-1; } ③取得在内存中停留最久的页面,默认状态下为最早调入的页面 intGetMax(Page*b) {inti; intmax=-1; inttag=0; for(i=0;i {if(b[i].time>max) {max=b[i].time; tag=i;}} returntag; } ④判断页面是否已在内存中 intEquation(intfold,Page*b) {inti; for(i=0;i if(fold==b[i].num)returni; return-1; } ⑤LRU算法 voidLru(intfold,Page*b) {inti; intval; val=Equation(fold,b); if(val>=0) {b[val].time=0; for(i=0;i if(i! =val)b[i].time++; } else {queue[++K]=fold;/*记录调入页面*/ val=GetMax(b); b[val].num=fold; b[val].time=0; for(i=0;i if(i! =val)b[i].time++; }} FIFO与OPT的算法描述省略。 ⑥主程序 voidmain() { 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); for(i=0;i {Lru(a[i],b); c[0][i]=a[i]; /*记录当前的内存单元中的页面*/ for(j=0;j c[j][i]=b[j].num; } /*结果输出*/ printf("内存状态为: \n"); Myprintf; for(j=0;j printf("|%2d",a[j]); printf("|\n"); Myprintf; for(i=0;i {for(j=0;j if(c[i][j]==-1)printf("|%2c",32); else printf("|%2d",c[i][j]); printf("|\n"); } Myprintf; printf("\n调入队列为: "); for(i=0;i printf("%3d",queue[i]); printf("\n缺页次数为: %6d\n缺页率: %16.6f",K+1,(float)(K+1)/N); printf("\nAreyoucontinuing! \ty? "); if(getche()=='y')gotostart; } 5、说明: 该代码仅供参考,照抄者实验成绩全部记为0分。 认真完成实验,并按照要求认真填写实验报告 实验五动态分区分配方式的模拟(2学时) 1、实验目的: 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区分配管理方式及其实现过程的理解。 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; 请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收, 3、实验要求: 要求每次分配和回后显示出空闲内存分区链的情况(共有多个空闲分区,每个空闲分区的大小分别为多大)。 4、设计思路和采取的方案: //********动态分区分配方式的模拟********* #include #include #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; block_first->next=block_last; block_last->prior=block_first; block_last->next=NULL; block_last->data.address=0; block_last->data.size=MAX_length; block_last->data.ID=0; block_last->data.state=Free; returnOK; } //-----------------------分配主存------------------------- Statusalloc(intch) { intID,request; cout<<"请输入作业(分区号): "; cin>>ID; cout<<"请输入需要分配的主存大小(单位: KB): "; cin>>request; if(request<0||request==0) { cout<<"分配大小不合适,请重试! "< returnERROR; } if(ch==2)//选择最佳适应算法 {if(Best_fit(ID,request)==OK)cout<<"分配成功! "< elsecout<<"内存不足,分配失败! "< returnOK; } else//默认首次适应算法 {if(First_fit(ID,request)==OK)cout<<"分配成功! "< elsecout<<"内存不足,分配失败! "< returnOK; } } //------------------首次适应算法----------------------- StatusFirst_fit(intID,intrequest)//传入作业名及申请量 { //为申请作业开辟新空间且初始化 DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID; temp->data.size=request; temp->data.state=Busy; DuLNode*p=block_first->next; while(p) { if(p->data.state==Free&&p->data.size==request) {//有大小恰好合适的空闲块 p->data.state=Busy; p->data.ID=ID; returnOK; break; } if(p->data.state==Free&&p->data.size>request) {//有空闲块能满足需求且有剩余" temp->prior=p->prior; temp->next=p; temp->data.address=p->data.address; p->prior->next=temp; p->prior=temp; p->data.address=temp->data.address+temp->data.size; p->data.size-=request; returnOK; break; } p=p->next; } returnERROR; } //--------------------最佳适应算法------------------------ StatusBest_fit(intID,intrequest)//传入作业名及申请量 { …… …… …… } //-----------------------主存回收-------------------- Statusfree(intID) { DuLNode*p=block_first; while(p) {if(p->data.ID==ID) { p->data.state=Free; p->data.ID=Free; if(p->prior->data.state==Free)//与前面的空闲块相连 {p->prior->data.size+=p->data.size; p->prior->next=p->next; p->next->prior=p->prior; } if(p->next->data.state==Free)//与后面的空闲块相连 { p->data.size+=p->next->data.size; p->next->next->prior=p; p->next=p->next->next; } break; } p=p->next; } returnOK; } //---------------显示主存分配情况------------------ voidshow() {cout<<"+++++++++++++++++++++++++++++++++++++++\n"; cout<<"+++主存分配情况+++\n"; cout<<"+++++++++++++++++++++++++++++++++++++++\n"; DuLNode*p=block_first->next; while(p) {cout<<"分区号: "; if(p->data.ID==Free)cout<<"Free"< elsecout< cout<<"起始地址: "< cout<<"分区大小: "< cout<<"状态: "; if(p->data.state==Free)cout<<"空闲"< elsecout<<"已分配"< cout<<"——————————————"< p=p->next; } } //-----------------------主函数--------------------------- voidmain() { intch;//算法选择标记 cout<<"动态分区分配方式的模拟\n"; cout<<"************************************\n"; cout<<"**1)首次适应算法2)最佳适应算法**\n"; cout<<"************************************\n"; cout<<"请选择分配算法: "; cin>>ch; Initblock();//开创空间表 intchoice;//操作选择标记 while (1) { cout<<"********************************************\n"; cout<<"**1: 分配内存2: 回收内存**\n"; cout<<"**3: 查看分配0: 退出**\n"; cout<<"********************************************\n"; cout<<"请输入您的操作: "; cin>>choice; if(choice==1)alloc(ch);//分配内存 elseif(choice==2)//内存回收 { intID; cout<<"请输入您要释放的分区号: "; cin>>ID; free(ID); } elseif(choice==3)show();//显示主存 elseif(choice==0)break;//退出 else//输入操作有误 {cout<<"输入有误,请重试! "< continue; } } } 4、说明: 该代码仅供参考,照抄者实验成绩全部记为0分。 认真完成实验,并按照要求认真填写实验报告
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书