操作系统实验指导书.docx
- 文档编号:10390026
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:37
- 大小:37.47KB
操作系统实验指导书.docx
《操作系统实验指导书.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书.docx(37页珍藏版)》请在冰豆网上搜索。
操作系统实验指导书
操作系统原理》
实验指导书
吴微编前言1.实验总体目标
通过学生自己动手设计实验验证理论知识,使学生掌握操作系统特征和功能,掌握
不同调度算法下进程的调度、进程控制、进程调度与死锁,并必须掌握作业管理、存储器管理、设备管理和文件管理的主要原理。
加深对操作系统基本原理理解。
⒉适用专业
计算机科学与技术
⒊先修课程
C语言程序设计、计算机组成原理、数据结构
⒋实验课时分配
实验项目
学时
实验一单处理器系统的进程调度
2
实验二设计一个有N个进程共行的进程调度程序。
4
实验三批处理系统中作业调度
2
实验四银行家算法
4
实验五LRU页面置换调度算法
4
实验六独占设备的分配和回收模拟
4
⒌实验环境
有40台中等配置的计算机组成的小型局域网的实验室环境。
计算机的具体要求:
⒈Pentium133Hz以上的CPU;⒉建议至少256MB的内存;⒊建议硬盘至少2GB,并有1GB空闲空间。
4.安装Windows操作系统及C语言编译程序。
⒍实验总体要求
培养计算机专业的学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。
通过操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。
使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
⒎本实验的重点、难点及教案方法建议重点:
理解进程调度中PCB的设计,以实现对进程的调度。
难点:
进程调度程序的设计,设备管理程序的设计。
教案方法建议:
力争在本指导书的帮助下,独立设计程序以加深理解。
实验一、
单处理器系统的进程调度
5
实验二
设计一个有N个进程共行的进程调度程序。
10
实验三
批处理系统中作业调度
15
实验四
银行家算法
18
实验五
LRU页面置换调度算法
25
实验六
独占设备的分配和回收模拟
29
实验一单处理器系统的进程调度、实验目的
模拟单处理器系统的进程调度,采用动态优先权的进程调度算法作为进程设计算
法,以加深对进程的概念及进程调度算法的理解.
二、实验类型<含验证型、设计型或综合型)
设计型
三、实验仪器
一台安装Windows操作系统及C语言编译程序的pc机。
四、实验原理
五、实验方法与步骤
<一)内容:
<1)用C语言实现对N个进程使用动态优先权算法的进程调度。
<2)描述用来标识进程的进程控制块PCB结构。
进程标识数ID
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高<人为
指定或随机数)。
进程已占用的CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME,当进程运行完毕ALLTIME是为0。
进程的阻塞时间STARTBLOC,K表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIM,E表示已阻塞的进程再等待BLOCKTIME个
时间片后将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
<3)手工输入建立几个进程,建立一个就绪队列,按优先数由高到低排列。
<4)进行进程调度<5)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,
以便进行检查。
重复以上过程,直到所要进程都完成为止。
<二)参考程序:
#include"stdio.h"
#definerunning1/*
用running表示进程处于运行态*/
#defineaready2/*
用aready表示进程处于就绪态*/
#defineblocking3/*
用blocking表示进程处于等待态*/
#definen10/*
假定系统允许进程个数为10*/
struct
{
intname
。
/*进程标识符*/
intstatus
。
/*进程状态*/
intax,bx,cx,dx
。
/*进程现场信息,通用寄存器内容*/
intpc。
/*进程现场信息,程序计数器内容*/
intpsw
。
/*进程现场信息,程序状态字寄存器内容*/
intnext
。
/*下一个进程控制块的位置*/
}pcbarea[n]
。
/*定义模拟进程控制块区域的数组*/
intPSW,AX,BX,CX,DX,PC,TIME。
/*模拟寄存器*/
intrun
。
/*定义指向正在运行进程的进程控制块的指针*/
struct
{
inthead
。
inttail
。
}ready。
/*定义指向就绪队列的头指针head和尾指针tail*/
intblock
。
/*定义指向等待队列的指针*/
intpfree
。
/*定义指向空闲进程控制块队列的指针*/
sheduling(>
/*进程调度函数*/
{
inti。
if(ready.head==-1>/*空闲进程控制块队列为空,退出*/{
printf("
无就绪进程\n">。
return
}
i=ready.head
。
/*就绪队列头指针赋给i*/
。
/*就绪队列头指针后移*/
ready.tail*/
ready.head=pcbarea[ready.head].nextif(ready.head==-1>ready.tail=-1。
/*就绪队列为空,修正尾指针
pcbarea[i].status=running。
/*修改进程控制块状态*/
TIME=sometime。
/*设置相对时钟寄存器*/
/*恢复该进程现场信息:
*/
AX=pcbarea[run].ax。
BX=pcbarea[run].bx。
CX=pcbarea[run].cx。
DX=pcbarea[run].dx。
PC=pcbarea[run].pc。
PSW=pcbarea[run].psw。
/*修改指向运行进程的指针*/
run=i。
}/*进程调度函数结束*/
create(intx>
/*创建进程*/
{
inti。
if(pfree==-1>/*空闲进程控制块队列为空*/
{
printf("无空闲进程控制块,进程创建失败\n">。
return。
}
i=pfree。
/*取空闲进程控制块队列的第一个*/
pfree=pcbarea[pfree].next。
/*pfree后移*/
/*填写该进程控制块内容:
*/pcbarea[i].name=x。
pcbarea[i].status=aready。
pcbarea[i].ax=x。
pcbarea[i].bx=x。
pcbarea[i].cx=x。
pcbarea[i].dx=x。
pcbarea[i].pc=x。
pcbarea[i].psw=x。
if(ready.head!
=-1>
{
/*就绪队列不空时,挂入就绪队列方式*/pcbarea[ready.tail].next=i。
ready.tail=i。
pcbarea[ready.tail].next=-1。
}
else
{
/*就绪队列空时,挂入就绪队列方式:
*/ready.head=i。
ready.tail=i。
pcbarea[ready.tail].next=-1。
}
}/*进程创建函数结束*/
main(>
{
/*系统初始化*/intnum,i,j。
run=ready.head=ready.tail=block=-1。
pfree=0。
for(j=0。
j j++> pcbarea[j].next=j+1。 pcbarea[n-1].next=-1。 10个进 printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建scanf("%d",&num>。 while(num>0> { create(num>。 scanf("%d",&num>。 } sheduling(>。 if(run! =-1> { printf("进程名进程状态寄存器内容: axbxcxdxpcpsw: \n">。 printf("%4d%10d%3d%3d%3d%3d%3d%3d\n",pcbarea[run].name,pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx, pcbarea[run].cx, pcbarea[run].dx,pcbarea[run].pc,pcbarea[run].psw>。 } }/*main(>结束*/ 六、注意事项 因为程序长而且有难度,所以在设计实验时,要细心,多次调试。 七、思考题 实验二设计一个有N个进程共行的进程调度程序。 一、实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。 二、实验类型<含验证型、设计型或综合型) 设计型 三、实验仪器 一台安装Windows操作系统及C语言编译程序的pc机 四、实验原理 五、实验方法与步骤 <一)内容: 进程调度算法: 采用最高优先数优先的调度算法<即把处理机分配给优先数最高的 进程)和先来先服务算。 每个进程有一个进程控制块 进程控制块可以包含如下信息: 进程 名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定<也可以由随机数产生)。 进程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪W 就绪进程获得CPU后都只能运行一个时间片。 用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就 是进程还需要继续运行,此时应将进程的优先数减1<即降低一级),然后把它插入就绪 队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便 进行检查。 重复以上过程,直到所要进程都完成为止。 <二)参考程序: #include #include #include #definegetpch(type>(type*>malloc(sizeof(type>> #defineNULL0 structPCB{/*定义进程控制块PCB*/ charname[10]。 charstate。 intsuper。 intntime。 intrtime。 structPCB*link。 }*ready=NULL,*p。 typedefstructPCB。 sort(>/*建立对进程进行优先级排列函数*/ { PCB*first,*second。 intinsert=0。 插入队首*/ */ if((ready==NULL>||((p->super>>(ready->super>>>/*优先级最大者{ p->link=ready。 ready=p。 } else/*进程比较优先级,插入适当的位置中*/ {first=ready。 second=first->link。 while(second! =NULL> { if((p->super>>(second->super>>/*若插入进程比当前进程优先数大{/*插入到当前进程前面*/p->link=second。 first->link=p。 second=NULL。 insert=1。 } else/*插入进程优先数最低,则插入到队尾*/ {first=first->link。 second=second->link。 } }if(insert==0>first->link=p。 } } input(>/*建立进程控制块函数*/ {inti,num。 //clrscr(>。 /*清屏*/printf("\n请输入进程号? ">。 scanf("%d",&num>。 for(i=0。 i i++> { printf("\n进程号No.%d: \n",i>。 p=getpch(PCB>。 printf("\n输入进程名: ">。 scanf("%s",p->name>。 printf("\n输入进程优先数: ">。 scanf("%d",&p->super>。 printf("\n输入进程运行时间: ">。 scanf("%d",&p->ntime>。 printf("\n">。 p->rtime=0。 p->state='w'。 p->link=NULL。 sort(>。 /*调用sort函数*/ } } intspace(> { intl=0。 PCB*pr=ready。 while(pr! =NULL> {l++。 pr=pr->link。 } return(l>。 } disp(PCB*pr>/*建立进程显示函数,用于显示当前进程*/ { printf("\nqname\tstate\tsuper\tndtime\truntime\n">。 printf("|%s\t",pr->name>。 printf("|%c\t",pr->state>。 printf("|%d\t",pr->super>。 printf("|%d\t",pr->ntime>。 printf("|%d\t",pr->rtime>。 printf("\n">。 } check(>/*建立进程查看函数*/ { PCB*pr。 printf("\n****当前正在运行的进程是: %s",p->name>。 /*显示当前运行进程*/disp(p>。 pr=ready。 printf("\n****当前就绪队列状态为: \n">。 /*显示就绪队列状态*/ while(pr! =NULL> {disp(pr>。 pr=pr->link。 } }destroy(>/*建立进程撤消函数(进程运行结束,撤消进程>*/ { printf("\n进程[%s]已完成.\n",p->name>。 free(p>。 } running(>/*建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime>++。 if(p->rtime==p->ntime>destroy(>。 /*调用destroy函数*/else { (p->super>--。 p->state='w'。 sort(>。 /*调用sort函数*/ } }main(>/*主函数*/ { intlen,h=0。 charch。 input(>。 len=space(>。 while((len! =0>&&(ready! =NULL>> {ch=getchar(>。 h++。 printf("\nTheexecutenumber: %d\n",h>。 p=ready。 ready=p->link。 p->link=NULL。 p->state='R'。 check(>。 running(>。 printf("\n按任一键继续">。 ch=getchar(>。 } printf("\n\n进程已经完成.\n">。 ch=getchar(>。 } 六、注意事项 因为程序长而且有难度,所以在设计实验时,要细心,多次调试。 七、思考题 实验三批处理系统中作业调度 一、实验目的 模拟批处理系统中的作业调度,以加深对作业调度的概念的理解. 二、实验类型<含验证型、设计型或综合型) 设计型 三、实验仪器 一台安装Windows操作系统及C语言编译程序的pc机 四、实验原理 五、实验方法与步骤 #include #include {charname[4]intlengthintprinterinttapeintruntimeintwaittimestructjcb*next typedefstructjcb 。 /*作业名*/ 。 /*作业长度,所需主存大小*/ 。 /*作业执行所需打印机的数量*/ /*作业执行所需磁带机的数量*/ 。 /*作业估计的执行时间*/ */ 。 /*作业在输入井中的等待时间*/。 /*指向下一个作业控制块的指针 }JCB。 /*作业控制块类型定义*/ JCB*head。 /*作业队列头指针定义*/inttape,printer。 longmemory。 shedule(>/*作业调度函数*/floatxk,k。 JCB*p,*q,*s,*t。 do { p=head。 s=NULL。 q=NULL。 k=0。 while(p! =NULL> { if(p->length<=memory&&p->tape<=tape&&p->printer<=printer> { /*系统可用资源是否满足作业需求*/xk=(float>(p->waittime>/p->runtime。 p的响应 if(q==NULL||xk>k>/*满足条件的第一个作业或者作业q的响应比小于作业 { k=xk。 /*记录响应比*/ q=p。 t=s。 }/*if*/ }/*if*/ s=p。 p=p->next。 /*指针p后移*/ }/*while*/ if(q! =NULL> { if(t==NULL>/*是作业队列的第一个*/ head=head->next。 else t->next=q->next。 /*为作业q分配资源: 分配主存空间;分配磁带机。 分配打印机。 */memory=memory-q->length。 tape=tape-q->tape。 printer=printer-q->printer。 printf("选中作业的作业名: %s\n",q->name>。 } }while(q! =NULL>。 }/*作业调度函数结束*/ main(> inti。 charname[4]。 intsize,tcount,pcount,wtime,rtime。 JCB*p。 /*系统数据初始化*/ memory=65536。 tape=4。 printer=2。 head=NULL。 printf("输入作业相关数据(以作业大小为负数停止输入>: \n">。 /*输入数据,建立作业队列*/ printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间 scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime>while(size! =-1> { /*创建JCB*/ p=(JCB*>malloc(sizeof(JCB>>。 /*填写该作业相关内容*/ //strcpy(p->name,name>。 p->length=size。 p->printer=pcount。 p->tape=tcount。 p->runtime=rtime。 p->waittime=wtime。 /*挂入作业队列队首: */ p->next=head。 head=p。 /*输入一个作业数据*/ printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间 scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime>。 }/*while*/ shedule(>。 /*进行作业调度*/ }/*main(>结束*/ 六、注意事项 因为程序长而且有难度,所以在设计实验时,要细心,多次调试。 七、思考题 实验四银行家算法一、实验目的银行家算法是死锁避免常采取的算法,是一种通过探测来决定是否资源分配的安全算法。 通过对该算法的模拟体会对设备安全分配的策略。 二、实验类型<含验证型、设计型或综合型) 设计型 三、实验仪器 一台安装Windows操作系统及C语言编译程序的pc机 四、实验原理 五、实验方法与步骤 #include"string.h" #include"iostream.h" #defineM5//总进程数 #defineN3//总资源数 #defineFALSE0 #defineTRUE1 //M个进程对N类资源最大资源需求量 intMAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}。 //系统可用资源数 intAVAILABLE[N]={10,5,7}。 //M个进程已经得到N类资源的资源量 int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}。 //M个进程还需要N类资源的资源量 int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}。 intRequest[N]={0,0,0}。 voidmain(> { inti=0,j=0。 charflag='Y'。 voidshowdata(>。 voidchangdata(int>。 voidrstordata(int>。 intchkerr(int>。 showdata(>。 while(flag=='Y'||fl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书