1、操作系统课程设计报告书 课 程 设 计 报 告( 2011-2012年度第二学期)课程名称: 操作系统实验 课设题目: SPOOLING假脱机输入输出技术模拟 院 系: 控制与计算机工程学院 班 级: 软件1002 姓 名: 王怡 指导教师: 贾静平 设计周数: 一周 成 绩: 2012年6月27 日 需求分析SPOOLING技术实质上是用户进程利用一个共享设备的一个存储区,并不是真正占有这一设备,用户进程把要完成的任务以文件的形式存入存储区,在存储区中排队并等待SPOOLING系统调度,只有被SPOOLING系统调度并输出,此项任务才真正完成,通过SPOOLING技术可以使独占设备成为共享设
2、备,由此大大提高了设备的使用率,节约了硬件资源。 整体功能及设计1.整体功能SPOOLING系统由专门负责I/O的常驻内存的进程以及输入井、输出井组成;它将独占设备改造为共享设备,实现了虚拟设备功能。将一台独享打印机改造为可供多个用户共享的打印机,是应用SPOOLING技术的典型实例。具体做法是:系统对于用户的打印输出,但并不真正把打印机分配给该用户进程,而是先在输出井中申请一个空闲盘块区,并将要打印的数据送入其中;然后为用户申请并填写请求打印表,将该表挂到请求打印队列上。若打印机空闲,输出程序从请求打印队首取表,将要打印的数据从输出井传送到内存缓冲区,再进行打印,直到打印队列为空。2.设计思
3、想本次课程设计采用进程的随机调度法模拟Spooling,一共有2个用户进程和一个SPOOLING进程。其中有45%的概率调度用户进程1,45%的概率调度用户进程2,10%的概率调度SPOOLING进程。进程基本状态有3种,分别为可执行,等待和结束。可执行态就是进程正在运行或等待调度的状态;等待状态又分为等待状态1,等待状态2,等待状态3。状态变化的条件为:1进程执行完成时,置为“结束”态。2服务程序在将输出信息送输出井时,如发现输出井已满,将调用进程置为“等待状态1”。3SPOOLING进程在进行输出时,若输出井空,则进入“等待状态2”。4SPOOLING进程输出一个信息块后,应立即释放该信息
4、块所占的输出井空间,并将正在等待输出的进程置为“可执行状态”。5服务程序在输出信息到输出井并形成输出请求信息块后,若SPOOLING进程处于等待态则将其置为“可执行状态”。6当用户进程申请请求输出块时,若没有可用请求块时,调用进程进入“等待状态3”。3程序框图(1)SP00LING输出模拟系统主控流程图如图1所示。图1 SP00LING输出模拟系统主控流程图(2)SP00LING输出服务程序由请求输出的两个用户进程调用,程序流程图如图2所示。图2 输出请求服务的程序框图(3)SPOOLING输出进程流程图如图3所示。 图3 SP00LING输出进程流程图 编程实现在本次课程设计中,程序的主要功
5、能的实现一共使用了3个类。 PCB类:Class CPcbpublic: int m_id; /进程标识id int m_status; /进程状态 int m_count; /要输出的文件个数 int m_x; /进程在输出时的临时变量 Repblock类:Class CRepblockpublic: int m_reqname; /请求进程id int m_length; /本次输出长度 int m_addr; /信息在输出井的首地址 SPLDlg对话框类:Class CSPLDlgPublic:CPcb pcb3; /三个进程,其中pcb0、pcb1为用户进程,pcb2为输出进程 CRe
6、qBlock req10; /用户请求输出块 int buffer2100; /用户输出井 int c12; /用户输出井剩余大小 int c222; /输出井使用情况 int c3; /请求输出块剩余大小 int ptr1; /请求输出块使用情况 int ptr2; void init(); /初始化个数据块 void print(); /打印请求数据块内容 void DispatchUser(int id); / 输出请求服务的程序 void DispatchSpooling(); /SP00LING输出进程 核心函数:void CSPLDlg:DispatchUser(int id) i
7、nt x=1; int count=0; if(pcbid.m_status=0) while(pcbid.m_count0) x=rand()%10; while (x) if(c1id0)/第一个输出井不满 bufferidc2id1=x; c2id1=(c2id1+)%100; c1id-; count+; x=rand()%10; else pcbid.m_status=1;/等待 return; pcbid.m_count-; if(c30)/请求控制块不为满 reqptr2.m_reqname=id;/第一个进程 reqptr2.m_length=count; reqptr2.m_
8、addr=c2id0;/输出井的起始位置 c3-; ptr2=(ptr2+)%10; c2id0=c2id1; if(pcb2.m_status=2) pcb2.m_status=0; return; return; else pcbid.m_status=3; return; Spooling进程调度函数:void CSPLDlg:DispatchSpooling() if (pcb2.m_status=0) if (c3!=10) if(reqptr1.m_length0) print(); if(pcb0.m_status=1|pcb1.m_status=1) if (pcb0.m_st
9、atus=1) pcb0.m_status=0; else if(pcb1.m_status=1) pcb1.m_status=0; return; else ptr1=(ptr1+)%10; c3+; if (pcb0.m_status=3|pcb1.m_status = 3) if(pcb0.m_status=3) pcb0.m_status = 0; else if(pcb1.m_status=3) pcb1.m_status = 0; return; else if (pcb0.m_count=0&pcb0.m_count=0) pcb2.m_status=4; return; else pcb2.m_status=2; 使用说明图4 主界面如图4所示:输入完第一个和第二个进程打印的文件个数后打击打印按钮,即可显示文件的打印顺序。 结果分析 图5 结果分析图 图6 结果分析图当用户输出第一个用户进程和第二个用户进程的文件数量分别为3和2时,程序随机调度进程并为每一个文件产生内容,从图5的打印序列可以看出,程序首先调度用户进程2,直到用户进程2的三个文件都送到输出井。然后调用用户进程1,将用户进程1的三个文件送入输入井。Spooling进程可能在两个用户进程间调用,也可能在进程1调用完之后调用。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1