您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 计算机操作系统实验-设备管理
1哈尔滨工业大学计算机科学与技术学院实验报告课程名称:操作系统课程类型:必修实验项目名称:设备管理(spooling技术)实验题目:编写一个Spooling程序来模拟假脱机输入输出过程班级:实验学院一班学号:6040310110姓名:张元竞设计成绩报告成绩指导老师2一、实验目的假脱机(Spooling)技术是广泛用于各种系统的一种行之有效的输入输出手段,这种技术使用比较简单的方法,缓和了处理机与低速输入输出设备速度不匹配的矛盾,提高设备的利用率。为了更好地掌握这种技术,本实习要求学生独立地用高级语言编写一个Spooling程序来模拟假脱机输入输出过程。二、实验要求及实验环境可将Spooling输入输出程序编制成一个独立的进程与其它要求输入输出的进程并发工作。Spooling进程负责从卡片机或光电读带机等设备读入信息送到磁盘或磁鼓的输入井中,或是把磁盘、磁鼓输出井的信息块送到打印机或CRT等设备输出。其余进程只要求编写输入输出部分的程序,可不考虑其它操作。本实验编制一个Spooling输出进程与另外二个要求输出的进程并发运行。要求输出进程每运行一次只输出一项信息到输出井,待输出到一个结束标志时,表示一批信息输出完成,在输出井中形成一输出信息块,再由Spooling进程把整个信息块实际输出到打印机或CRT。因此,进程的运行必须考虑同步问题。采用进程的随机调度法模拟Spooling输出是合适的,因为各进程的输出应是随机的。(1)进程调度采用随机调度法,二个要求输出进程的调度概率各为45%,Spooling进程为10%。(2)可为进程设置三种工作状态:可运行状态,不可运行状态3和结束状态。为了区分要求输出进程和Spooling进程处于不可运行状态的不同原因,又把不可运行状态分成不可运行状态1和2。分别叙述如下:①进程执行完毕后应置成“结束状态”。②要求输出进程在输出信息时,如发现输出井已满,应置成“不可运行状态1”。③Spooling进程在输出井空时应置成“不可运行状态2”。④Spooling进程输出一个信息块后,应释放该信息块所占的输出井位置,并将正在等待输出的进程置成“可运行状态”。⑤要求输出进程在输出信息到输出井并形成信息块后,应将Spooling进程置成“可运行状态”。三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.流程图4图假脱机输出系统框图5图请求输出进程程序框图6图Spooling进程程序框图2.逻辑设计①进程控制块(PCB)对于输出进程和spooling进程两种不同的进程,采用相同的结构处理,包括进程标识,进程状态,输出缓冲,输出指针,信息块首地址,输出长度等内容。需要支持在不同状态之间的转换,输出缓冲晴空等操作。②输出请求块包括要求输出的进程标识,输出长度,输出首地址等内容。7③输出井使用队列结构模拟。需要支持队列重整,取队首元素,删除队首元素,在队尾插入等操作,需要使用closed,open两个指针协助操作。3、物理设计①进程控制块(PCB)structinfo_PCB{longID;//进程标识longstatus;//状态longpo;//输出指针longhead;//信息块首地址longcount;//输出长度longwait[1000];//输出缓冲}PCB[4];②输出请求块structinfo_block{longID;//要求输出的进程longlen;//输出长度longhead;//输出首地址}block[128];③输出井structinfo_wall{longnum[10000];//输出内容longopen,closed;//队列指针}wall[3];四、测试结果实际运行的结果如下:Inputthetimesofuser1'soutputfile:4Inputthetimesofuser2'soutputfile:7Process2producesablock1!Process1producesablock2!Outputblock1:(ID=2)11489371832862808Process2producesablock3!Process2producesablock4!Outputblock2:(ID=1)2459598549480Outputblock3:(ID=2)762830Process2producesablock5!Process2producesablock6!Outputblock4:(ID=2)60Process1producesablock7!Process1producesablock8!Outputblock5:(ID=2)651940Outputblock6:(ID=2)940Outputblock7:(ID=1)287554292111570Process2producesablock9!Process2producesablock10!Outputblock8:(ID=1)0Process1producesablock11!Outputblock9:(ID=2)5491144632612570Outputblock10:(ID=2)34240Outputblock11:(ID=1)2189781549345581314869460五、系统不足与经验体会系统的不足包括健壮性尚不够好,界面比较简单,对于模拟过程,输出信息不够详细,对某些规模的的初始化需要修改程序。经验体会:注意数据达到上限时的情况,对于进程调度,要注意避免没有任何一个进程处于等待状态的情况出现。六、附录:源代码(带注释)#includecstdio#includecstring#includecstdlib9#includectimestructinfo_PCB{longID;//进程标识longstatus;//状态longpo;//输出指针longhead;//信息块首地址longcount;//输出长度longwait[1000];//输出缓冲}PCB[4];structinfo_block{longID;//要求输出的进程longlen;//输出长度longhead;//输出首地址}block[128];structinfo_wall{longnum[10000];//输出内容longopen,closed;//队列指针}wall[3];longK[3],L1,L2[3];longn;voidinput()//输入函数{printf(Inputthetimesofuser1'soutputfile:);scanf(%ld,&K[1]);printf(Inputthetimesofuser2'soutputfile:);scanf(%ld,&K[2]);}voidinit()//初始化函数{L1=10;L2[1]=L2[2]=100;memset(PCB,0,sizeof(PCB));PCB[1].ID=1;PCB[2].ID=2;PCB[3].ID=3;PCB[3].status=2;memset(wall,0,sizeof(wall));10n=0;}voidwork()//模拟进程调度{longr;longk;longa,b;longi,j;while(PCB[1].status!=3||PCB[2].status!=3||PCB[3].status!=3){r=rand()%100+1;//用随机数模拟进程执行概率if(r=45){k=1;}else{if(r=90)k=2;elsek=3;}if(PCB[k].status!=0)continue;switch(k){case1:case2://输出进程ka=rand()%10;++PCB[k].po;PCB[k].wait[PCB[k].po]=a;if(a==0){b=wall[k].closed+1;for(i=1;i=PCB[k].po;i++){wall[k].num[++wall[k].closed]=PCB[k].wait[i];}PCB[k].po=0;11PCB[k].count++;if(PCB[k].count==K[k])//进程执行完毕后应置成结束状态。{PCB[k].status=3;}if(PCB[3].status==2)//要求输出进程在输出信息到输出井并形成信息块后,应将Spooling进程置成可运行状态。{PCB[3].status=0;}if(L2[k]==0&&PCB[k].status==0)//如果输出井满,将进程置为不可运行状态1{PCB[k].status=1;}n++;block[n].ID=k;block[n].head=b;block[n].len=wall[k].closed-b+1;printf(Process%ldproducesablock%ld!\n,k,n);}break;case3://Spooling进程PCB[3].po++;a=PCB[3].po;printf(Outputblock%ld:(ID=%ld)\n,a,block[a].ID);for(i=1;i=block[a].len;i++){printf(%ld,wall[block[a].ID].num[i+block[a].head-1]);}printf(\n);if(PCB[3].po==n){PCB[3].status=2;//Spooling进程在输出井空时应置成不可运行状态2。if(PCB[1].status==3&&PCB[2].status==3){PCB[3].status=3;}}break;12}}}intmain(){srand(time(NULL));input();init();work();return0;}
本文标题:计算机操作系统实验-设备管理
链接地址:https://www.777doc.com/doc-6521963 .html