操作系统实验指导书.docx
- 文档编号:10252011
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:49
- 大小:188.83KB
操作系统实验指导书.docx
《操作系统实验指导书.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书.docx(49页珍藏版)》请在冰豆网上搜索。
操作系统实验指导书
《操作系统》实验大纲
一、基本情况
1、实验名称:
操作系统实验
2、专业:
计算机科学与技术
3、学时:
10
4、先修课:
高级语言程序设计/数据结构/面向对象程序设计/微机原理等
5、实验指导教材:
操作系统实验指导书(自编)
6、实验单位:
信息工程学院实验中心/计算机系
7、实验学期:
5/7
8、工具:
高级语言
二、实验目的
从课程性质上讲,操作系统是计算机学科中的一门综合性专业技术基础课,它是计算机学科的核心课程。
操作系统的研究不仅涉及到计算机硬件的研究范围,而且和计算机软件有更为密切的关系;通过对操作系统理论的学习,可深刻理解计算机软硬件如何协同工作;同时也可综合应用前面学习的相关知识,而且开发大型软件必然需要取得操作系统的支持。
在理论学习的基础上进一步进行实践,系统的巩固前面学习的知识,加深对实际操作系统工作原理、工作方式的了解,并为以后设计和实现大型应用软件和系统软件打好基础;具备基本的分析问题和解决问题的能力。
操作系统实践性很强,保证实验教学环节,才能有效提高课程的质量,因此设置了操作系统实验。
三、实验内容与要求
1、实验一进程管理
实验要求:
1要求设置PCB,进程控制原语,进程调度算法,能描述进程调度中不同进程状态之间的转换,设计一个允许n个进程并发运行的进程管理模拟系统。
该系统包括有简单的进程控制,同步及通信机构,其进程调度算法可任意选择。
每个进程用一个PCB表示,其内容可根据具体情况设置。
各进程之间应有一定的同步关系。
系统在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。
②工具:
C语言或其它高级语言
③实验时间:
3学时
2、实验二存储器管理
实验要求:
①要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。
加深对所学各种存储器管理方案的了解;要求定义实施算法的相关数据结构,实现分配、回收算法,模拟环境应尽量接近真实。
②工具:
C语言或其它高级语言
③实验时间:
3学时
3、实验三设备管理
实验要求:
①本课题实验的目的是,通过设计并运行一个简单的SPOOLing系统来模拟实际的SPOOLing输入/输出过程,以掌握这种有用的技术。
要求将SPOOLing输入/输出处理程序编成一个独立的进程模块并与其他请求输入/输出的进程并发运行。
SPOOLing进程负责把从输入设备输入的信息送到外存输入井中,或把外存输入井中的信息送到打印机等输出设备上输出。
其余进程只要求编写输入/输出部分的程序。
要求定义实施算法的相关数据结构,实现设备分配和SPOOLing算法
②工具:
C语言或其它高级语言
③实验时间:
4学时
四、参考书
[1]计算机操作系统汤子瀛哲凤屏编著西安电子科技大学出版社
[2]操作系统基础(第三版)屠祁屠立德编著清华大学出版社
[3]操作系统冯耀霖杜舜国编著西安电子科技大学出版社
实验一进程管理
一、目的
本课题实验的目的是,加深对进程概念及进程管理各个部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施。
二、题目
进程管理
三、要求及提示
1、要求设置PCB,进程控制原语,进程调度算法,能描述进程调度中不同进程状态之间的转换,设计一个允许n个进程并发运行的进程管理模拟系统。
该系统包括有简单的进程控制,同步及通信机构,其进程调度算法可任意选择。
每个进程用一个PCB表示,其内容可根据具体情况设置。
各进程之间应有一定的同步关系。
系统在运行过程中能显示或打印各进程的状态及有关参数的变化情况,以便观察诸进程的运行过程及系统的管理过程。
2、编程实现。
3、工具:
C语言或其它高级语言
4、实验时间:
3学时
四、实验报告
1、写出进程管理的思想。
2、画出算法流程图和设置的数据结构。
3、写出调试程序出现的问题及解决的方法。
4、打印实验报告及程序清单。
5、报告给出测试的结果。
五、范例
支持多个进程并发运行的简单进程管理模拟系统。
1、问题描述
本系统的同步机构采用的是信号量上的P,V操作的机制;控制机构包括阻塞和唤醒操作;时间片中断处理程序处理模拟的时间片中断;进程调度程序负责为各进程分配处理机。
系统中设计了3个并发进程。
它们之间有如下同步关系:
3个进程需要互斥使用临界资源s2,进程1和进程2又需互斥使用临界资源s1。
本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。
2、算法
系统为进程设置了5种运行状态:
e-执行态;r-高就绪态;t-低就绪态(执行进程因时间片到限而转入);w-等待态;c-完成态。
各进程的初始状态均设置为r。
系统分时执行各进程,并规定3个进程的执行概率均为33%。
通过产生随机数x来模拟时间片。
当进程process1访问随机数x时,若x≥0.33;当进程process2访问x时,若x<0.33或x≥0.66;当进程process3访问x时,若x<0.66,分别认为各进程的执行时间片到限,产生“时间片中断”而转入低就绪态t。
进程调度算法采用剥夺式最高优先数法。
各进程的优先数通过键盘输入予以静态设置。
调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。
先从r状态进程中选择,在从t状态进程中选择。
当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。
各进程在使用临界资源s1和s2时,通过调用信号量sem1和sem2上的P,V操作来实现同步,阻塞和唤醒操作负责完成从进程的执行态到等待态到就绪态的转换。
系统启动后,在完成必要的系统初始化后便执行进程调度程序。
但执行进程因“时间片中断”,或被排斥使用临界资源,或唤醒某个等待资源时,立即进行进程调度。
当3个进程都处于完成状态后,系统退出运行。
图1和图2分别示出了系统主控程序和进程调度程序的大致流程。
N
Y
图1进程管理主控程序
3、数据结构
(1)每个进程有一个进程控制块PCB,内容包括:
id进程控制数,id=0,1,2;图2进程调度程序
status进程状态,可为e,r,t,w,c;
priorty进程优先数;
Y
N
N
Y
Y
N
N
Y
Y
N
Y
nexrtwr等待链指针,只是在同一信号量上等待的下一个进程的标时数。
(2)信号量semaphore,对于临界资源s1和s2分别有sem1和sem2均为互斥信号量。
内容包括:
value信号量值,初值为1;
firstwr等待链首指针,指示该信号量上等待的下一个进程标识数。
(3)现场保留区,用数组savearea[3][4]表示,即每一个进程都有一个大小为4个单元的保留区,用来保存被“中断”时的现场信息,如通用寄存器的内容和断点地址等。
此外,系统中还用到下列主要全程变量:
exe执行进程指针,其值为进程标识数;
i用来模拟一个通用寄存器;
addr用来模拟程序计数器;
s1,s2两个公用变量,与来共享临界资源。
4、程序清单
#include
#defineTRUE1
#defineFALSE0
#defineMAXPRI100
#defineNIL-1
struct{
intid;
charstatus;
intnextwr;
intpriority;
}pcb[3];
struct{
intvalue;
intfirstwr;
}sem[2];
charsavearea[3][4],addr;
inti,s1,s2,seed,exe=NIL;
init()/*initialization*/
{intj;
for(j=0;j<3;j++)
{
pcb[j].id=j;
pcb[j].status='r';
pcb[j].nextwr=NIL;
printf("\nprocess%dpriority?
",j+1);
scanf("%d",&i);
pcb[j].priority=i;
}
sem[0].value=1;sem[0].firstwr=NIL;
sem[1].value=1;sem[1].firstwr=NIL;
for(i=1;i<3;i++)
for(j=0;j<4;j++)
savearea[i][j]='0';
}
floatrandom()
{intm;
if(seed<0)m=--seed;
elsem=seed;
seed=(25173*seed+13849)%65536;
return(m/32767.0);
}
timeint(ad)/*timesliceinterrupt*/
charad;
{
floatx;
x=random();
if((x<0.33)&&(exe==0))return(FALSE);
if((x<0.66)&&(exe==1))return(FALSE);
if((x<1.0)&&(exe==2))return(FALSE);
savearea[exe][0]=i;
savearea[exe][1]=ad;
pcb[exe].status='t';
printf("Timesilceinterrupt'\nprocess%denterinroready.\n",exe+1);
exe=NIL;
return(TRUE);
}
scheduler()
{intpd;
if((pd=find())==NIL&&exe==NIL)
return(NIL);/*quitsystem*/
if(pd!
=NIL){
if(exe==NIL){
pcb[pd].status='e';
exe=pd;
printf("process%disexecuting.\n",exe+1);
}
elseif(pcb[pd].priority { pcb[exe].status='r'; printf("process%denterintoready\n",exe+1); pcb[pd].status='e'; exe=pd; printf("process%disexecuting\n",exe+1); } } i=savearea[exe][0]; addr=savearea[exe][1]; return(exe); } find() {intj,pd=NIL,w=MAXPRI; for(j=0;j<3;j++) if(pcb[j].status=='r') if(pcb[j].priority w=pcb[j].priority;pd=j; } if(pd==NIL) for(j=0;j<3;j++) if(pcb[j].status=='t') if(pcb[j].priority w=pcb[j].priority;pd=j; } return(pd); } p(se,ad) intse; charad; {if(--sem[se].value>=0)return(FALSE); block(se); savearea[exe][0]=i; savearea[exe][1]=ad; exe=NIL; return(TRUE); } block(se) intse; { intw; printf("process%disblocked\n",exe+1); pcb[exe].status='w'; pcb[exe].nextwr=NIL; if((w=sem[se].firstwr)==NIL) sem[se].firstwr=exe; else{ while(pcb[w].nextwr! =NIL) w=pcb[w].nextwr; pcb[w].nextwr=exe; } } v(se,ad) intse; charad; { if(++sem[se].value>0)return(FALSE); wakeup(se); savearea[exe][1]=ad; savearea[exe][0]=i; return(TRUE);/*scheduler*/ } wakeup(se) intse; { intw; w=sem[se].firstwr; if(w! =NIL){ sem[se].firstwr=pcb[w].nextwr; pcb[w].status='r'; printf("process%diswakenup\n",w+1); } } process1() { if(addr=='a')gotoa1; if(addr=='b')gotob1; if(addr=='c')gotoc1; if(addr=='d')gotod1; if(addr=='e')gotoe1; if(addr=='f')gotof1; for(i=1;i<6;i++) { printf("process1callsPonthesemaphore1\n"); if(p(0,'a'))break;/*process1isblocked*/ a1: printf("process1isexecutinginthecreticalsection1\n"); if(timeint('b'))break; b1: printf("s1%d\n",++s1); printf("process1callsVonsemaphore1andquitcreticalsection1.\n"); if(v(0,'c'))break; c1: printf("process1callsPonsemaphore12.\n"); if(p(1,'d'))break; d1: printf("process1isexecutingcreticalsection2.\n"); if(timeint('e'))break; e1: printf("s2=%d\n",++s2); printf("process1callsVonsemephore2andquitcreticalsection2.\n"); if(v(1,'f'))break; f1: printf("process1cyclecount=%d\n",i); } if(i<6)return; eexit(0); } process2() { if(addr=='a')gotoa2; if(addr=='b')gotob2; if(addr=='c')gotoc2; if(addr=='d')gotod2; if(addr=='e')gotoe2; if(addr=='f')gotof2; for(i=1;i<6;++i) { printf("process2callsPonsemephore2\n"); if(p(1,'a'))break; a2: printf("process2isexecutingonthecreticalsection2\n"); if(timeint('b'))break; b2: printf("s2=%d\n",++s2); printf("process2callsVonsemephore2andquitcreticalsection2.\n"); if(v(1,'c'))break; c2: printf("process2callsPonsemaphore1.\n"); if(p(0,'d'))break; d2: printf("process2isexecutingcreticalsection1.\n"); if(timeint('e'))break; e2: printf("s1=%d\n",++s1); printf("process2callsVonsemephore1andquitcreticalsection1.\n"); if(v(0,'f'))break; f2: printf("process2cyclecount=%d\n",i); } if(i<6)return; eexit (1); } process3() { if(addr=='a')gotoa3; if(addr=='b')gotob3; if(addr=='c')gotoc3; for(i=1;i<6;++i) { printf("process3callsPonsemaphore2\n"); if(p(1,'a'))break; a3: printf("process3isexecutingonthecreticalsection\n"); if(timeint('b'))break; b3: printf("s2=%d\n",++s2); printf("process3callsVonsemaphore2andquitcreticalsection.\n"); if(v(1,'c'))break; c3: printf("process3cyclecount=%d\n"); } if(i<6)return; eexit (2); } eexit(n) intn; { pcb[n].status='c'; printf("process%discompleted! \n",n+1); exe=NIL; } main() { intk; printf("****processmanagement*******\n\n"); init(); printf("s1=%d,s2=%d\n",s1,s2); printf("process1,process2,process3areallinready1\n"); for(;;) if((k=scheduler())! =NIL) switch(k){ case0: process1(); break; case1: process2(); break; case2: process3(); break; default: printf("processidentifererror\n"); break; } elsebreak; printf("s1=%d,s2=%d\n",s1,s2); printf("\n******END*******\n"); } 5、程序运行结果 ****processmanagement**** process1priority? 1 process2priority? 2 process3priority? 3 s1=0,s2=0 process1,process2,process3areallinready! process1isexecuting. process1callsPonthesemaphore1. process1isexecutinginthecreticalsection1. s1=1 process1callsVonsemaphoreandquitcreticalsection1. process1callsPonsemaphore2. process1isexectingcreticalsection2. Timessliceinterrupt! process1enterintoready. process2isexecuting. process2callsPonscmaphore2. process2isblocked. process3isexecuting. process3callsPonsemaphore2. process3isblocked. process1isexecuting. s2=1 process1callsVonsemaphore2andquitcreticalsection2. process2iswakenup. process1cyclecount=1 . . . process3isexecutingonitscriticalsection. process3callsVonsemaphore2andquitcreticalsection process1iswakenup process3isenterintoready process1isexecuting . . . process2callsVonsemaphore2addquitcreticalsection2. process3iswakenup precess2callsPonsemaphore1. process2isexectingcreticalsection1. Timesliceinterrupt! process2enterintoready. process3isexecuting. . . . process3cyclecount=5 process3iscompleted! . . . process1cyclecount=5 process1iscompleted! process2isexecuting. process2isexecutingonthecreticalsection2. s2=15 process2callsVonsemaphore2andquitcriticalsection2. process2callsPonsemaphore1. process2isexe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书