SPOOLING技术课程设计使用说明书版.docx
《SPOOLING技术课程设计使用说明书版.docx》由会员分享,可在线阅读,更多相关《SPOOLING技术课程设计使用说明书版.docx(14页珍藏版)》请在冰点文库上搜索。
SPOOLING技术课程设计使用说明书版
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2012年秋季学期
操作系统原理课程设计
题目:
SPOOLING技术
专业班级:
姓名:
学号:
指导教师:
成绩:
目录
目录2
摘要3
一、设计思想4
二、各模块伪码算法5
1结构5
2初始化函数5
3用户进程6
4SPOOLING进程7
5SPOOLING模拟器7
三、函数的调用关系9
1SPOOLing输出模拟系统主控流程图9
2SPOOLing输出请求服务程序图10
3SPOOLing输出进程图12
四、测试结果13
设计总结15
参考文献16
致谢17
摘要
SPOOLing技术是低速输入输出设备与主机交换的一种技术,通常也称为“假脱机真联机”,他的核心思想是以联机的方式得到脱机的效果。
低速设备经通道和设在主机内存的缓冲存储器与高速设备相联,该高速设备通常是辅存。
为了存放从低速设备上输入的信息,或者存放将要输出到低速设备上的信息(来自内存),在辅存分别开辟一固定区域,叫“输出井”(对输出),或者“输入井”(对输入)。
简单来说就是在内存中形成缓冲区,在高级设备形成输出井和输入井,传递的时候,从低速设备传入缓冲区,再传到高速设备的输入井,再从高速设备的输出井,传到缓冲区,再传到低速设备。
SPOOLing,即外围设备联机并行操作,它除了是一种速度匹配技术外、也是一种虚拟设备技术。
用一种物理设备模拟另一类物理设备,使各作业在执行期间只使用虚拟的设备,而不直接使用物理的独占设备。
这种技术可使独占的设备变成可共享的设备,使得设备的利用率和系统效率都能得到提高。
关键字:
进程控制块,进程标识符,内存空闲块,队列指针,数据结构等。
一、设计思想
本实验编制一个Spooling输出进程与另外二个要求输出的进程并发运行。
要求输出进程每运行一次只输出一项信息到输出井,待输出到一个结束标志时,表示一批信息输出完成,在输出井中形成一输出信息块,再由Spooling进程把整个信息块实际输出到打印机或CRT。
因此,进程的运行必须考虑同步问题。
采用进程的随机调度法模拟Spooling输出是合适的,因为各进程的输出应是随机的。
进程基本状态有3种,分别为可执行,等待和结束。
可执行态就是进程正在运行或等待调度的状态;等待状态又分为等待状态1,等待状态2,等待状态3。
状态变化的条件为:
1>进程执行完成时,置为“结束”态。
2>服务程序在将输出信息送输出井时,如发现输出井已满,将调用进程置为“等待状态1”。
3>SPOOLING进程在进行输出时,若输出井空,则进入“等待状态2”。
4>SPOOLING进程输出一个信息块后,应立即释放该信息快所占的输出井空间,并将正在等待输出的进程置为“可执行状态”。
5>服务程序在输出信息到输出井并形成输出请求信息快后,若SPOOLING进程处于等待态则将其置为“可执行状态”。
6>当用户进程声请请求输出块时,若没有可用请求块时,调用进程进入“等待状态3”。
二、各模块伪码算法
1结构
structPCB
{//进程控制块PCB
longID;//进程标识
intstatus;//状态(0-可运行状态;1-输出井满,等待状态1;2-等待状态2;3-结束状态)
longpo;//输出指针
longhead;//信息块首地址
longcount;//输出长度
longwait[1000];//输出缓冲
}PCB[5];
structReqBlock
{longID;//要求输出的进程
longlen;//输出长度
longhead;//输出首地址
}ReqBlock[256];
structwell
{//输出井
longnum[10000];//输出内容
longopen,closed;//队列指针
}well[4];
2初始化函数
voidinit()
{L1=10;//空闲块初值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(well,0,sizeof(well));
n=0;//输出块计数,初始为0;
}
3用户进程
用户进程请求输出一系列信息,调用输出服务进程,由输出服务进程将该信息送入输出井。
等待SPOOLING进程进行输出。
操作实现流程如图2
voidUserServer(intkx)
{a=rand()%10;
++PCB[kx].po;
PCB[kx].wait[PCB[kx].po]=a;
if(a==0)
{b=well[kx].closed+1;
for(i=1;i<=PCB[kx].po;i++)
well[kx].num[++well[kx].closed]=PCB[kx].wait[i];
PCB[kx].po=0;
PCB[kx].count++;
if(PCB[kx].count==K[kx])//进程控制块用完
PCB[kx].status=3;//进程执行完毕后应置成"结束状态"
if(PCB[3].status==2)//要求输出进程在输出信息到输出井并形成信息块后,应将Spooling进程
PCB[3].status=0;//置成"可运行状态"
if(L2[kx]==0&&PCB[kx].status==0)
PCB[kx].status=1;//如果输出井满,将进程置为"不可运行状态1"
n++;
ReqBlock[n].ID=kx;
ReqBlock[n].head=b;
ReqBlock[n].len=well[kx].closed-b+1;
printf("Process%ldproducesablock%ld!
\n",kx,n);
}
}
4SPOOLING进程
SPOOLING输出进程工作时,根据请求块记录的各进程要输出的信息将其输出。
当进程在输出井空时应置成"等待状态2"。
操作实现流程如图3
voidSpoolingServer()
{PCB[3].po++;
a=PCB[3].po;
printf("Outputblock%ld:
(ID=%ld)\n",a,ReqBlock[a].ID);
for(i=1;i<=ReqBlock[a].len;i++)
{printf("%ld",well[ReqBlock[a].ID].num[i+ReqBlock[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;
}
}
5SPOOLING模拟器
两个请求输出的用户进程的调度概率各为45%,SPOOLING输出进程为10%,这由随机数发生器产生的随机数来模拟决定,根据进程调度的概率调用相应函数。
操作实现流程如图1
voidwork()
{while(PCB[1].status!
=3||PCB[2].status!
=3||PCB[3].status!
=3)
{r=rand()%100+1;//用随机数概率模拟进程执行
if(r<=45)
k=1;
elseif(r<=90)
k=2;
else
k=3;
if(PCB[k].status!
=0)
continue;//输出未完成,继续执行
switch(k)
{case1:
UserServer
(1);break;
case2:
UserServer
(2);break;
case3:
SpoolingServer();break;}}}
三、函数的调用关系
1SPOOLing输出模拟系统主控流程图
SPOOLing输出模拟系统(work()函数)主控流程图如图1所示。
2SPOOLing输出请求服务程序图
SPOOLing输出服务程序(UserServer()函数)由请求输出的两个用户进程调用,程序流程图如图2所示。
3SPOOLing输出进程图
SPOOLing输出进程(SpoolingServer()函数)流程图如图3所示。
四、测试结果
UserServer(intkx)函数是用户函数,SpoolingServer()函数为SPOOLing输出函数,work()函数为SPOOLING模拟器。
利用函数work()创建SPOOLing输出模拟系统主控流程,对用户函数和SPOOLing输出函数合理安排分配。
在用户函数中,主要问题就是解决进程控制快的分配及根据进程控制块的利用情况判定进程应所处的状态,对进程控制块的分配本函数采用随机分配,对状态的安排,如果进程控制块用完为结束状态,如果输出进程为输出信息到输出井并形成信息块,则为可执行状态,如果输出井满,将进程置为"等待状态1",对于输出井空的状态在SPOOLing输出函数函数中实现。
在SPOOLing输出函数中,主要问题就是实现输出进程输出地信息到输出井并形成信息块后,对信息的输出。
同时实现进程等待状态2的判定。
在work()函数中,主要实现随机数概率分配实现对对用户函数和SPOOLing输出函数合理安排分配,具体实现情况见详细设计中的代码,
在完成程序进行调试中遇到了很多问题,例如进程控制块分配进入死循环,把256个控制块分配完,且分配错误,经过仔细分析问题出在进程控制块分配的随机分配上,经过分步调试分析解决了问题。
其实,本程序有很大的改进空间,首先程序可以添加允许更多用户进程,各个进程的输出概率也相应平均分配,例如三个用户,每个用户有30%的概率;其次,实现共享打印机技术,在本程序的基础上再编辑一个函数功能为用户进程申请一张空白的用户请求打印表。
为两个用户输入(0-125个)请求文件,程序运行结果如图所示:
显然程序的运行结果不是唯一的,因为进程控制块的分配时随机的,用户概率分配也是随机的。
运行结果中显然发生了进程等待情况,
设计总结
SPOOLing是SimultaneousPeripheralOperationOn-Line(即外部设备联机并行操作)的缩写,它是关于慢速字符设备如何与计算机主机交换信息的一种技术,通常称为“假脱机技术”。
实际上是一种外围设备同时联机操作技术,又称为排队转储技术。
它在输入和输出之间增加了“输入井”和“输出井”的排队转储环节。
SPOOLing系统主要包括以下三部分:
(1)输入井和输出井:
这是在磁盘上开辟出来的两个存储区域。
输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的数据。
输出井模拟脱机输入时的磁盘,用于收容用户程序的输出数据。
(2)输入缓冲区和输出缓冲区:
这是在内存中开辟的两个缓冲区。
输入缓冲区用于暂存有输入设备送来的数据,以后在传送到输出井。
输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。
(3)输入进程和输出进程:
输入进程模拟脱机输入时的外围控制机,将用户要求的数据有输入设备到输入缓冲区,再送到输入井。
当CPU需要输入设备时,直接从输入井读入内存。
输出进程模拟脱机输出时的外围控制机,把用户要求输入的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据,经过输出缓冲区送到输出设备上。
SPOOLing技术的特点:
(1)提高了I/O速度.从对低速I/O设备进行的I/O操作变为对输入井或输出井的操作,如同脱机操作一样,提高了I/O速度,缓和了CPU与低速I/O设备速度不匹配的矛盾.
(2)设备并没有分配给任何进程.在输入井或输出井中,分配给进程的是一存储区和建立一张I/O请求表.
(3)实现了虚拟设备功能.多个进程同时使用一独享设备,而对每一进程而言,都认为自己独占这一设备,不过,该设备是逻辑上的设备。
通过这两周的课程设计使我对spooling技术有了深刻的认识,知道了spooling技术的原理,知道了spooling技术的功能,了解到spooling技术对计算机系统的重要性,同时我也认识到作为一名即将毕业的计算机专业的学生,我们应该具有向科学进发的精神。
参考文献
1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.
2.王清,李光明.《计算机操作系统》.冶金工业出版社.
3.孙钟秀等.操作系统教程.高等教育出版社
4.曾明.Linux操作系统应用教程.陕西科学技术出版社.
5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.
6.孟静,操作系统教程--原理和实例分析.高等教育出版社
7.周长林,计算机操作系统教程.高等教育出版社
8.张尧学,计算机操作系统教程,清华大学出版社
9.任满杰,操作系统原理实用教程,电子工业出版社
致谢
在这两周的操作系统课程设计中,让我了解了很多有关SPOOLing技术的知识,也锻炼了我的动手解决问题的能力和对错误的排除分析能力,最重要的是让我对操作系统这门课程有了更深一步的认识。
这次课设不仅让我在知识上有所收获,而且完成的过程让我有很多心得体会,首先不管做什么事都要有充分的准备,当然这些准备是在日常积累的,也在你投入的时间,相信又投入就会有回报;其次,抓住主要问题,首当其冲的解决主要问题,其他次要问题就会迎刃而解,就如这次试验的主要问题就是利用随机概率分布与进程间的通信相结合实现假脱机操作,解决了这个问题其他问题就相对简单了。
另外,这次课设的顺利完成还要谢谢朱老师的讲解。
虽然这次课设在老师的帮助下比较完善的完成了课程实际的要求,但程序有很大的改进的空间,完善性还有待提高。