4+SPOOLing技术.doc_第1页
4+SPOOLing技术.doc_第2页
4+SPOOLing技术.doc_第3页
4+SPOOLing技术.doc_第4页
4+SPOOLing技术.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SPOOLing技术一、 实验内容SPOOLing假脱机输入/输出技术广泛应用于各种计算机的I/O。该技术通过采用预输入和缓输出的方法,使用共享设备的一部分空间来模拟独占设备,以提高独占设备的利用率。为了理解该技术,设计一个SPOOLing假脱机输出的模拟程序。二、 实验目的由于系统配备的设备数量远远小于系统中并发运行的进程数目,为了使并发进程能更好地共享系统设备,操作系统提供了SPOOLing技术,通过设计一个SPOOLing假脱机输出的模拟程序,使学生更好地理解和掌握该技术。三、 实验题目SPOOLing假脱机输入输出技术模拟1. 设计一个实现SPOOLing技术的进程要求设计一个SPOOLing输出进程和两个请求输出的用户进程,以及一个SPOOLing输出服务程序。当请求输出的用户进程希望输出一系列信息时,调用输出服务程序,由它将该信息送入输出井。待遇到一个输出结束标志时,表示进程该次的输出文件输出结束。之后,申请一个输出请求块(用来记录请求输出的用户进程的名字、信息在输出井中的位置、要输出信息的长度等),等待SPOOLing进程进行输出。2. 设计进程调度算法进程调度采用随机算法,这与进程输出信息的随机性相一致。两个请求输出的用户进程的调度概率各为45%,SPOOLing输出进程为10%,这由随机数发生的随机数来模拟决定。3. 进程状态进程基本状态有3种,分别为可执行、等待和结束。可执行状态就是进程正在或等待调度的状态;等待状态又分为等待状态1、等待状态2、等待状态3。状态变化的条件为:(1) 进程执行完成时,置为“结束”态;(2) 服务程序在将输出信息送输出井时,如发现输出井已满,将调用进程置为“等待状态1”;(3) SPOOLing进程在进行输出时,若输出井空,则进入“等待状态2”;(4) SPOOLing进程输出一个信息块后,应立即释放该信息块所占的输出井空间,并将正在等待输出的进程置为“可执行状态”;(5) 服务程序在输出信息到输出井并形成输出请求信息块后,若SPOOLing进程处于等待态,则将其置为“可执行状态”;(6) 当用户进程申请请求输出块时,若没有可用请求块时,调用进程进入“等待状态3”。4. 数据结构(1) 进程控制块PCBstruct pcbint id;/* 进程标识数*/int status;/* 进程状态*/int count;/* 要输出的文件数*/int x;/* 进程输出时的临时变量*/PCB3;status=其中,0为可执行状态;1为等待状态12为等待状态23为等待状态34为结束状态。(2) 请求输出块reqblockstructint reqname;/* 请求进程名*/int length;/* 本次输出信息长度*/int addr;/* 信息在输出井的首地址*/reqblock10;(3) 输出井BUFFERSPOOLing系统为每个请求输出的进程在输出井中分别开辟一个区。本实验可设计一个二维数组(int buffer2100)作为输出井。每个进程在输出井最多可占用100个位置。5. 编程说明为两个请求输出的用户进程设计两个输出井。每个输出井可存放100个信息,即buffer2100。为此,设计两个计数器,使用数组C12,分别表示两个用户进程可使用的输出井的空间。其初值C10,C11都为100。用C222二维指针数组表示输出井使用情况。C200代表buffer0的第一个可用空缓冲指针,C201 代表buffer0的第一个满缓冲指针;C210代表buffer1的第一个可用空缓冲指针,C211 代表buffer1的第一个满缓冲指针。每个用户进程请求输出文件的个数由用户从键盘输入而定。当用户进程将其所有文件数出完毕时,终止运行。为简单起见,用户进程简单地设计成:每运行一次,随机数输出数字09之间的一个数,且用0作为文件结束的标志。当输出值为0时,就形成一个请求信息块,填入请求输出信息块reqblock结构中。这个输出请求块结构也有一个计数器C3,表示当前系统剩余的请求输出信息块的个数,初值为10。另外,再设两个指针Ptr1和Ptr2表示请求输出块使用情况。Ptr1是要输出的第一个请求输出块指针,初值为0;Ptr2是空闲请求输出块指针,初值0。两个指针按模10 进行变化,即把请求输出块结构数组看成是一个环形数组。根据Ptr1和Ptr2的变化,确定请求输出块的使用情况。主程序包括调度程序。调度程序中包括一个随机数函数,以该函数值为依据,按照如图1所示框图调用3个进程。完成对各数据结构的初始化。6. 程序框图(1) SPOOLing输出模拟系统主控流程图如图1所示。结束返回X0.45,且进程1为执行状态开始对各进程的PCB、输出请求块、输出井初始化生成(01)随机数X判断的X值及进程的状态执行请求输出用户进程(R=1)执行请求输出用户进程(R=2)执行SPOOLing进程(R=3)0.45X0.9,且进程2为执行状态X 0.9,且SOOPLing进程为执行状态进程都结束了吗?YN图1 SPOOLing输出模拟系统主控流程图(2) SPOOLing输出服务程序由请求输出的两个用户进程调用,程序流程图如图2所示。转进程调度开始调用进程PCBi的随机输出量送PCB i .x输出井满(C10=0)吗请求输出的进程等待(1送PCB i .status)进程的输出信息PCB i .x 送buffer i C2 i 0 转进程调度C1 i = C1 i -1修改空缓冲区指针C2 i 0 = C2 i 0 +1调用进程的一个文件,输出结束了吗?(PCB i .x=0)还有空闲请求块吗?将文件在输出井的位置和长度信息填入空闲请求块,将进程名i填入请求块请求输出的进程等待, 3送PCB i .status转进程调度修改空闲请求块指针空闲请求块数减1SPOOLing进程是等待态吗?唤醒SPOOLing进程进程所有输出文件全部输出完?进程i 运行结束 YYYYYNNNNN图2 输出请求服务的程序框图(3) SPOOLing输出进程流程图如图3所示。SPOOLing进程结束按该请求输出信息块reqblock 的指针ptr1将输出井中的一个文件内容输出开始请求输出块空吗?有等待输出井空的进程吗?释放相应输出井,即修改相应的输出井计数:按请求输出块中进程号修改C1和C2数组两个请求输出的进程结束了吗?释放请求输出块,修改请求信息块reqblock 的指针 ptr1=ptr1+1, C3=C3+1有等待请求输出块的进程吗?唤醒相应进程转进程调度唤醒相应进程转进程调度SPOOLing进程等待返回返回YYYYNNNN图3 SPOOLing输出进程流程图四、 参考程序#include stdio.h#include stdlib.h#include time.h struct pcbint id;/* 进程标识数*/int status;/* 进程状态*/int firstaddr;/*信息块首地址*/int length;/* 本次输出信息长度*/int outbufword;/*输出缓冲字*/*PCB3;/*进程状态status的可能取值* 0为可执行状态;* 1为等待状态1,即输出井满等待* 2为等待状态2,即输出井空等待* 3为等待状态3,即请求块用完时等待* 4为结束状态*/FILE *f;struct req/*请求输出块*/int reqname;/* 请求进程名*/int length;/* 本次输出信息长度*/int addr;/* 信息在输出井的首地址*/reqblock10;int buffer2100, C3=10;/*buffer为输出井*/int l1=1, l2=1;int head=0, tail=0;/*输出井的头尾指针*/int t1, t2;void request(int i)/*i为请求输出的进程标识1或2*/int j,length=0, m;struct req *run;if(i=1)t1-;elset2-;run=reqblocktail%10;run-reqname=i;run-length=0;if(tail=0)run-addr=0;elseint index=(tail-1)%10;run-addr=reqblockindex.addr+reqblockindex.length;for(m=0;m100;m+)if(bufferi-1m=0)run-addr=m;break;while(1)j=rand()%10;if(j=0)run-length=length;break;bufferi-1(run-addr+length)=j;length+;PCBi-1-length+=length;length=0;if(PCB2-status=2)PCB2-status=0;tail+;void spooling()int i,j;struct req *run;run=reqblockhead%10;printf(%d ,run-reqname);fprintf(f,%d ,run-reqname);for(i=0; irun-length; i+)printf(%d ,bufferrun-reqname-1run-addr+i);fprintf(f,%d ,bufferrun-reqname-1run-addr+i);printf(n);fprintf(f,n);head+;for(j=0; j2; j+)if(PCBj-status=1)PCBj-status=0;int main()int i, n;f=fopen(result.txt,w);for(i=0; i2; i+)for(n=0; n100; n+)bufferin=0;for(i=0; i3; i+)struct pcb *tmpPcb=(struct pcb *)malloc(sizeof(struct pcb);tmpPcb-id=i;tmpPcb-status=0;tmpPcb-firstaddr=0;tmpPcb-length=0;tmpPcb-outbufword=1;PCBi=tmpPcb;printf(How many work do p1 want to do?);fprintf(f,How many work do p1 want to do?);scanf(%d,t1);fprintf(f,%dn,t1);printf(How many work do p2 want to do?);fprintf(f,How many work do p2 want to do?);scanf(%d,t2);fprintf(f,%dn,t2);sr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论