2022年操作系统实验设备管理spooling .pdf
-
资源ID:27185194
资源大小:53.39KB
全文页数:7页
- 资源格式: PDF
下载积分:4.3金币
快捷下载
![游客一键下载](/images/hot.gif)
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
2022年操作系统实验设备管理spooling .pdf
1 实验五设备管理 (spooling 技术) 实验题目:编写一个 Spooling 程序来模拟假脱机输入输出过程2 一、实验目的假脱机( Spooling )技术是广泛用于各种系统的一种行之有效的输入输出手段,这种技术使用比较简单的方法,缓和了处理机与低速输入输出设备速度不匹配的矛盾,提高设备的利用率。为了更好地掌握这种技术,本实习要求学生独立地用高级语言编写一个 Spooling 程序来模拟假脱机输入输出过程。二、实验要求及实验环境可将Spooling 输入输出程序编制成一个独立的进程与其它要求输入输出的进程并发工作。 Spooling 进程负责从卡片机或光电读带机等设备读入信息送到磁盘或磁鼓的输入井中,或是把磁盘、磁鼓输出井的信息块送到打印机或CRT 等设备输出。其余进程只要求编写输入输出部分的程序,可不考虑其它操作。本实验编制一个 Spooling 输出进程与另外二个要求输出的进程并发运行。要求输出进程每运行一次只输出一项信息到输出井,待输出到一个结束标志时,表示一批信息输出完成,在输出井中形成一输出信息块,再由Spooling 进程把整个信息块实际输出到打印机或CRT。因此,进程的运行必须考虑同步问题。采用进程的随机调度法模拟Spooling 输出是合适的,因为各进程的输出应是随机的。(1)进程调度采用随机调度法,二个要求输出进程的调度概率各为45%,Spooling 进程为 10%。(2)可为进程设置三种工作状态:可运行状态,不可运行状态和结束状态。为了区分要求输出进程和 Spooling 进程处于不可运行状态的不同原因,又把不可名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 2 运行状态分成不可运行状态1 和2。分别叙述如下:进程执行完毕后应置成“结束状态”。要求输出进程在输出信息时,如发现输出井已满, 应置成“不可运行状态 1”。Spooling 进程在输出井空时应置成“不可运行状态2”。Spooling 进程输出一个信息块后,应释放该信息块所占的输出井位置,并将正在等待输出的进程置成“可运行状态”。要求输出进程在输出信息到输出井并形成信息块后,应将Spooling 进程置成“可运行状态”。三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1流程图4 图 假脱机输出系统框图5 图 请求输出进程程序框图6 图 Spooling 进程程序框图2逻辑设计进程控制块( PCB)对于输出进程和 spooling 进程两种不同的进程,采用相同的结构处理,包括进程标识,进程状态,输出缓冲,输出指针,信息块首地址,输出长度等内容。需要支持在不同状态之间的转换,输出缓冲晴空等操作。输出请求块包括要求输出的进程标识,输出长度,输出首地址等内容。7 输出井使用队列结构模拟。需要支持队列重整,取队首元素,删除队首元素,在队尾插入等操作,需要使用closed,open 两个指针协助操作。3、物理设计名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - 3 进程控制块( PCB)struct info_PCB long ID;/ 进程标识long status;/状态long po;/ 输出指针long head;/信息块首地址long count;/ 输出长度long wait1000;/ 输出缓冲PCB4; 输出请求块struct info_block long ID;/ 要求输出的进程long len;/ 输出长度long head;/输出首地址block128; 输出井struct info_wall long num10000;/输出内容long open,closed;/队列指针wall3; 四、测试结果实际运行的结果如下:Input the times of user1s output file:4 Input the times of user2s output file:7 Process 2 produces a block 1! Process 1 produces a block 2! Output block 1: (ID=2) 1 1 4 8 9 3 7 1 8 3 2 8 6 2 8 0 8 Process 2 produces a block 3! Process 2 produces a block 4! Output block 2: (ID=1) 2 4 5 9 5 9 8 5 4 9 4 8 0 Output block 3: (ID=2) 7 6 2 8 3 0 Process 2 produces a block 5! Process 2 produces a block 6! Output block 4: (ID=2) 6 0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 4 Process 1 produces a block 7! Process 1 produces a block 8! Output block 5: (ID=2) 6 5 1 9 4 0 Output block 6: (ID=2) 9 4 0 Output block 7: (ID=1) 2 8 7 5 5 4 2 9 2 1 1 1 5 7 0 Process 2 produces a block 9! Process 2 produces a block 10! Output block 8: (ID=1) 0 Process 1 produces a block 11! Output block 9: (ID=2) 5 4 9 1 1 4 4 6 3 2 6 1 2 5 7 0 Output block 10: (ID=2) 3 4 2 4 0 Output block 11: (ID=1) 2 1 8 9 7 8 1 5 4 9 3 4 5 5 8 1 3 1 4 8 6 9 4 6 0 五、系统不足与经验体会系统的不足包括健壮性尚不够好,界面比较简单,对于模拟过程,输出信息不够详细,对某些规模的的初始化需要修改程序。经验体会:注意数据达到上限时的情况,对于进程调度,要注意避免没有任何一个进程处于等待状态的情况出现。六、附录:源代码(带注释)#include #include #include 9 #include struct info_PCB long ID;/ 进程标识long status;/状态long po;/ 输出指针long head;/信息块首地址long count;/ 输出长度long wait1000;/ 输出缓冲PCB4; struct info_block 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - 5 long ID;/ 要求输出的进程long len;/ 输出长度long head;/输出首地址block128; struct info_wall long num10000;/ 输出内容long open,closed;/队列指针wall3; long K3,L1,L23; long n; void input()/ 输入函数 printf(Input the times of user1s output file:); scanf(%ld,&K1); printf(Input the times of user2s output file:); scanf(%ld,&K2); void init()/ 初始化函数 L1=10; L21=L22=100; memset(PCB,0,sizeof(PCB); PCB1.ID=1; PCB2.ID=2; PCB3.ID=3; PCB3.status=2; memset(wall,0,sizeof(wall); 10 n=0; void work()/ 模拟进程调度 long r; long k; long a,b; long i,j; while (PCB1.status!=3 | PCB2.status!=3 | PCB3.status!=3) r=rand()%100+1;/ 用随机数模拟进程执行概率if (r=45) k=1; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - 6 if (r=90) k=2; else k=3; if (PCBk.status!=0) continue; switch (k) case 1: case 2: /输出进程 k a=rand()%10; +PCBk.po; PCBk.waitPCBk.po=a; if (a=0) b=wallk.closed+1; for (i=1;i=PCBk.po;i+) wallk.num+wallk.closed=PCBk.waiti; PCBk.po=0; 11 PCBk.count+; if (PCBk.count=Kk) /进程执行完毕后应置成结束状态 。 PCBk.status=3; if (PCB3.status=2) /要求输出进程在输出信息到输出井并形成信息块后,应将Spooling 进程置成 可运行状态 。 PCB3.status=0; if (L2k=0 & PCBk.status=0) /如果输出井满,将进程置为不可运行状态 1 PCBk.status=1; n+; blockn.ID=k; blockn.head=b; blockn.len=wallk.closed-b+1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - 7 printf(Process %ld produces a block %ld!n,k,n); break; case 3: /Spooling 进程PCB3.po+; a=PCB3.po; printf(Output block %ld: (ID=%ld)n,a,blocka.ID); for (i=1;i=blocka.len;i+) printf(%ld ,wallblocka.ID.numi+blocka.head-1); printf(n); if (PCB3.po=n) PCB3.status=2; /Spooling 进程在输出井空时应置成不可运行状态2。if (PCB1.status=3 & PCB2.status=3) PCB3.status=3; break; 12 int main() srand(time(NULL); input(); init(); work(); return 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -