操作系统试验指导书.docx
《操作系统试验指导书.docx》由会员分享,可在线阅读,更多相关《操作系统试验指导书.docx(20页珍藏版)》请在冰豆网上搜索。
操作系统试验指导书
操作系统实验指导书
李玲娟李刚编写
李玲娟审核
南京中医药大学信息技术学院
2005年10月
编者说明
软件技术是《操作系统》最重要的计算机系统软件,同时也是计算机科学与技术专业的一门核心专业基础课,其发展极为迅速。
学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。
这些原理与技巧可以说是计算机界的前辈们一代接一代不停歇的努力所留下的知识与智慧的结晶,学习和掌握它们对于激发自己的创造力和想象力是很有帮助的。
如何学习和掌握操作系统技术的原理与实际技巧呢?
除了听课和读书之外,最好的方法就是在实践中练习,通过自己模拟设计操作系统的原理实验,可以培养程序设计的方法和技巧,提高编制和理解清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。
使自身更好的掌握操作系统的基本概念、基本原理及基本功能,从而具有分析实际操作系统的基本能力,深入直观的理解操作系统使用的各类算法。
《操作系统实验指导书》是针对这门课的实验编写的,书中设计了四个重要的操作系统原理实验,包括进程调度、分区式存储管理、虚拟存储管理和文件管理。
四个实验难易层次分明,重点突出,其中实验一(进程调度)和实验二(分区式存储管理)为设计性实验,重在培养理论原理应用于实践的设计能力,而实验三(虚拟存储管理)和实验四(文件管理)为验证性实验,重在验证教材中的理论原理。
所有实验共18学时,均采用C语言作为编程语言模拟设计完成相关程序。
本书编写中,参考了西安电子科技大学、清华大学的操作系统相关图书资料。
本书由信息技术学院副院长李玲娟和应用教研室李刚两位教师编写,由李玲娟副教授审核。
南京中医药大学教务处给予了指导和大力帮助,在此表示衷心的感谢!
限于编者的水平,难免有疏漏与错误,敬请读者批评指正。
李玲娟李刚
2005年10月12日
实验一进程调度
实验性质:
设计
建议学时:
6学时
实验目的:
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
预习内容:
阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。
基本实验内容:
设计程序模拟进程的轮转法调度过程。
假设初始状态为:
有n个进程处于就绪状态,有m个进程处于阻塞状态。
采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。
程序要求如下:
1).输出系统中进程的调度次序;
2).计算CPU利用率。
实现提示:
用C语言实现提示:
1)程序中进程可用PCB表示,其类型描述如下:
structPCB_type{
charname;//进程名
intstate;//进程状态
2——表示“执行”状态
1——表示“就绪”状态
0——表示“阻塞”状态
intcpu_time;//运行需要的CPU时间(需运行的时间片个数)
}
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();//模拟调度
calculate();//计算CPU利用率
实验要求:
1)上机前认真使用C语言编写好程序,采用TurboC作为编译环境;
2)上机时独立调试程序
3)根据具体实验要求,填写好实验报告(包括思想、源程序、实例运行结果)。
测试用数据:
n=2
m=3
t=5
ready_head
blocked_head
dispath()算法流程图:
/*use_cpu中记录CPU运行时间
/*unuse_cpu中记录CPU空闲时间
否
是
是否
是
否
是
是
否
是
实验二分区式存储管理
实验性质:
设计
建议学时:
6
实验目的:
通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。
预习内容:
阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
实验内容:
设计程序模拟内存的动态分区法存储管理。
内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。
假定系统的内存共640K,初始状态为操作系统本身占用64K。
在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完成。
要求编程序分别输出t1、t2、t3、t4时刻内存的空闲区的状态。
实现提示(C语言):
1.程序中自由链队列的结点类型可描述如下:
structfreelink{
intlen,address;/*len为分区长度
/*address为分区起始地址
structfreelink*next;
}
内存占用区用链表描述,其结点类型描述如下:
structbusylink{
charname;/*作业或进程名name=’S’表示OS占用
intlen,address;
structbusylink*next;
}
并设全程量:
structfreelink*free_head=NULL;//自由链队列(带头结点)队首指针
structbusylink*busy_head=NULL,//占用区队列队(带头结点)首指针
*busy_tail=NULL;//占用区队列队尾指针
2.设计子函数:
voidstart(void);/*设置系统初始状态*/
{structfreelink*p;
structbusylink*q;
free_head=(structfreelink*)malloc(sizeof(structfreelink));
free_head->next=NULL;//创建自由链头结点
busy_head=busy_tail=(structbusylink*)malloc(sizeof(structbusylink));
busy_head->next=NULL;//创建占用链头结点
p=(structfreelink*)malloc(sizeof(structfreelink));
p->address=64;
p->len=640-64;(OS占用了64K)
p->next=NULL;
free_head->next=p;
q=(structbusylink*)malloc(sizeof(structbusylink));
q->name=’S’;/*S表示操作系统占用*/
q->len=64;q->address=0;q->next=NULL;
busy_head->next=q;busy_tail=q;
}
voidrequireMemo(charname,intrequire);/*模拟内存分配*/
voidfreeMemo(charname);/*模拟内存回收*/
voidpast(inttime);/*模拟系统过了time时间*/
voidprintlink();/*输出内存空闲情况(自由链的结点)*/
3.设计主函数:
main()
{start();
past(t1);
requireMemo(‘A’,8);requireMemo(‘B’,16);
requireMemo(‘C’,64);requireMemo(‘D’,124);
printlink();
past(t2);
freeMemo(‘C’);
printlink();
past(t3);
requireMemo(‘E’,50);
printlink();
freeMemo(‘D’);
printlink();
}
实验要求:
4)上机前认真使用C语言编写好程序,采用TurboC作为编译环境;
5)上机时独立调试程序
6)根据具体实验要求,填写好实验报告(包括思想、源程序、实例运行结果)。
requireMemo(charname,intrequire)流程图如下:
否
freeMemo(charname)流程图如下:
否
是
否
是
实验三虚拟存储管理
实验性质:
验证
建议学时:
3
实验目的:
存储管理的主要功能之一是合理的分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换方法。
预习内容:
阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
实验内容:
(1)通过随机数产生一个指令序列,共320条指令。
指令的地址按下述原则生成:
1、50%的指令是顺序执行的;
2、25%的指令是均匀分布在前地址部分;
3、25%的指令是均匀分布在后地址部分。
具体的实施方法是:
1在[0,319]的指令地址之间随机选取一起点m;
2顺序执行一条指令,即执行地址为m+1的指令;
3在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’;
4顺序执行一条指令,其地址为m’+1;
5在后地址[m’+2,319]中随机选取一条指令并执行;
6重复上述步骤,直至执行320次指令。
(2)将指令序列变换成页地址流
设:
①页面大小为1K;
②用户内存容量为4页到32页;
③用户虚存容量为32K;
在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条~第9条指令为第0页(对应的虚存地址为[0,9]);
第10条~第19条指令为第1页(对应的虚存地址为[10,19]);
.
第310条~第319条指令为第31页(对应的虚存地址为[310,319]);
按以上方式,用户指令可组成32页。
(3)计算并输出下述各种算法在不同的内存容量下的缺页率。
1先进先出的算法(FIFO);
2最近最少使用算法(LRR);
3最佳淘汰法(OPT):
先淘汰最不常用的页地址;
4最少访问页面算法(LFR);
5最近不经常使用算法(NUR)。
其中③和④为选择内容。
缺页率=(页面失效次数)/(页地址流长度)
在本实验中,页地址流的长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
(4)随机数产生办法
关于随机数产生办法,可以使用系统提供函数rand(),分别进行初始化和产生随机数。
例如:
rand();语句可初始化的一个随机数;a[0]=10*rand()/32767*319+1;
a[1]=10*rand()/32767*a[0];
语句可用来产生a[0]与a[1]中的随机数。
实验指导
1、数据类型定义
(1)页面类型
typedefstruct{intpn,pfn,counter,time;
}pl_type;
/*pn为页号,pfn为页面号,counter为一个周期内访问该页面次数,time为访问时间。
(2)页面控制结构
pfc_struct{
intpn,pfn;
structpfc_struct*next;
};
typedefstructpfc_structpfc_type;
pfc_typepfc[total_vp],*freepf_head,*busypf_head;
pfc_type*busypf_tail;
/*pfc[total_vp]定义用户进程虚页控制结构
*freepf_head为空页面头指针
*busypf_head为忙页面头指针
*busypf_tail为忙页面尾指针
2、函数定义
(1)voidinitialize();/*初始化函数,给每个相关的页面赋值
(2)voidFIFO();/*计算使用FIFO算法时的缺页率
(3)voidLRU();/*计算使用LRU算法时的缺页率
(4)voidOPT();/*计算使用OPT算法时的缺页率
(5)voidLRU();/*计算使用LFU算法时的缺页率
(6)voidNUR();/*计算使用NUR算法时的缺页率
3、变量定义
(4)inta[total_struction]:
指令流数据组
(5)intpage[total_instruction]:
每个指令所属页号
(6)intoffset[total_instruction]:
每页装入10条指令后取模运算页号偏移量
(7)inttotal_pf:
用户进程的内存页面数
(8)intdiseffect:
缺页率
2、程序流程图
3、程序框架:
#definetotal_struction320
#definetotal_vp32
typedefstruct{intpn,pfn,counter,time;
}pl_type;
pl_typep[total_vp];
pfc_struct{
intpn,pfn;
structpfc_struct*next;
};
typedefstructpfc_structpfc_type;
pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;
intdiseffect,a[total_struction];
intpage[total_struction],offset[total_struction];
voidinitialize();
{
……
}
voidFIFO();/LRU();
{
……
}
main()
{ints,i,j;
sand(getpid()*10);
s=(float)319*rand()/32767+1;
for(i=0;i{a[i]=s;a[i+1]=a[i]+1;a[I+2]=(float)a[i]*rand()/32767;a[i+3]=a[i+2]+1;
s=(float)rand()*(318-a[i+2])/32767+a[i+2]+2;}
for(i=0;i{page[i]=a[i]/10;offset[i]=a[i]%10;}
for(i=4;i<=32;i++)FIFO(i);/LRU();
}
例如:
a[0]=194a[1]=195a[2]=55a[3]=56
a[4]=73a[5]=74a[6]=30a[7]=31
a[8]=257a[9]=258a[10]=210a[11]=211
a[12]=319a[13]=320a[14]=46a[15]=47
a[16]=273a[17]=274a[18]=205a[19]=206
实验四文件管理
实验性质:
设计
建议学时:
3
实验目的:
本实验的目的是通过一个阅读和设计部分简单多用户文件系统的过程,加深理解文件系统的内部功能和内部实现。
预习内容:
阅读教材《计算机操作系统》第六章,掌握文件管理相关概念和原理。
实验内容:
为DOS系统设计一个简单的二级文件系统。
要求做到以下几点:
①可以实现下列几条命令
LOGIN用户登录
DIR列文件目录
CREATE创建文件
DELETE删除文件
OPEN打开文件
CLOSE关闭文件
READ读文件
WRITE写文件
COPY拷贝文件
②列目录时要列出文件名,物理地址,保护码和文件长度。
③源文件可以进行读写保护。
实验提示:
①首先应确定文件系统的数据结构:
主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
②用户创建的文件,可以编号存储于磁盘上。
如:
file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
实验实现程序提示(C语言):
1、程序中相关数据类型定义(本程序需要在c:
下建一个名为osfile的目录及一个名为file的子目录):
typedefstruct/*thestructureofOSFILE*/
{intfpaddr;/*filephysicaladdress*/
intflength;/*filelength*/
intfmode;/*filemode:
0-ReadOnly;1-WriteOnly;2-ReadandWrite(default);*/
charfname[MAXNAME];/*filename*/
}OSFILE;
typedefstruct/*thestructureofOSUFD*/
{charufdname[MAXNAME];/*ufdname*/
OSFILEufdfile[MAXCHILD];/*ufdownfile*/
}OSUFD;
typedefstruct/*thestructureofOSUFD'LOGIN*/
{charufdname[MAXNAME];/*ufdname*/
charufdpword[8];/*ufdpassword*/
}OSUFD_LOGIN;
typedefstruct/*fileopenmode*/
{intifopen;/*ifopen:
0-close,1-open*/
intopenmode;/*0-readonly,1-writeonly,2-readandwrite,3-initial*/
}OSUFD_OPENMODE;
实验要求:
1)上机前认真使用C语言编写好程序,采用TurboC作为编译环境;
2)上机时独立调试程序
3)根据具体实验要求,填写好实验报告(包括思想、源程序、实例运行结果)。