操作系统实验指导书.docx
《操作系统实验指导书.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书.docx(33页珍藏版)》请在冰豆网上搜索。
操作系统实验指导书
《操作系统原理》
实验指导书
吴微编
前言
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。
▪进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
▪进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后将转换成就绪状态。
▪进程状态STATE。
▪队列指针NEXT,用来将PCB排成队列。
<3)手工输入建立几个进程,建立一个就绪队列,按优先数由高到低排列。
<4)进行进程调度
<5)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
<二)参考程序:
#include"stdio.h"
#definerunning1/*用running表示进程处于运行态*/
#defineaready2/*用aready表示进程处于就绪态*/
#defineblocking3/*用blocking表示进程处于等待态*/
#definesometime5/*用sometime表示时间片大小*/
#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.head=pcbarea[ready.head].next。
/*就绪队列头指针后移*/
if(ready.head==-1>ready.tail=-1。
/*就绪队列为空,修正尾指针ready.tail*/
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。
jj++>
pcbarea[j].next=j+1。
pcbarea[n-1].next=-1。
printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程>:
\n">。
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(>/*建立对进程