设备管理(spooling技术)操作系统实验报告一、实验目的假脱机(技术是广泛用于各种系统的一种行之有效的输入输出手段,这种技术使用比较简单的方法,缓和了处理机与低速输入输出设备速度不匹配的矛盾,提高设备的利用率。为了更好地掌握这种技术,本 言编写一个程序来模拟假脱机输入输出过程。二、实验要求及实验环境 可将 Spooling 输入输出程序编制成一个独立的进程与其它要求输入输出的进程并发工作。Spooling 进程负责从卡片机或光电读带机等设备读入信息送到磁盘或磁鼓的输入井中,或是把磁盘、磁鼓输出井的信息块送到打印机或 CRT 等设备输出。其余进程只要求编写输入输出部分的程序,可不考虑其它操作。 本 Spooling 输出进程与另外二个要求输出的进程并发运行。要求输出进程每运行一次只输出一项信息到输出井,待输出到一个结束标志时,表示一批信息输出完成,在输出井中形成一输出信息块,再由 Spooling 进程把整个信息块实际输出到打印机或CRT。因此,进程的运行必须考虑同步问题。采用进程的随机调度法模拟 Spooling输出是合适的,因为各进程的输出应是随机的。 (1)进程调度采用随机调度法,二个要求输出进程的调度概率各为45%,Spooling 进程为 10%。 (2)可为进程设置三种工作状态:可运行状态,不可运行状态和结束状态。为了区分要求输出进程和Spooling 进程处于不可运行状态的不同原因,又把不可运行状态分成不可运行状态 1 和2。分别叙述如下: ①进程执行完毕后应置成“ 。 ②要求输出进程在输出信息时,如发现输出井已满,应置成可运行状态1”。 ③Spooling 进程在输出井空时应置成“ 2”。 ④Spooling 进程输出一个信息块后,应释放该信息块所占的输出井位置,并将正在等待输出的进程置成“ 。 ⑤要求输出进程在输出信息到输出井并形成信息块后,应将Spooling进程置成“ 。 三、设计思想(程序的流程图及各程序模块之间的调用关系) 若图片无法显示请联系QQ3710167,设备管理(流程图)(spooling技术)操作系统实验报告免费,转发请注明源于www.lwfree.cn.逻辑设计 ①进程控制块(PCB) 对于输出进程和 spooling 进程两种不同的进程,采用相同的结构处理,包括进程标识,进程状态,输出缓冲,输出指针,信息块首地址,输出长度等内容。需要支持在不同状态之间的转换,输出缓冲晴空等操作。 ②输出请求块 包括要求输出的进程标识,输出长度,输出首地址等内容。 130
设备管理(流程图)(spooling技术)操作系统实验报告
③输出井使用队列结构模拟。需要支持队列重整,取队首元素,删除队首元素,在队尾插入等操作,需要使用 两个指针协助操作。 3、物理设计 ①进程控制块(PCB) struct info_PCB { long ID;//进程标识 long status;//状态 long po;//输出指针 long head;//信息块首地址 long count;//输出长度 long wait[1000];//输出缓冲 }PCB[4]; ②输出请求块 struct info_block { long ID;//要求输出的进程 long len;//输出长度 long head;//输出首地址 }block[128]; ③输出井输出内容 列指针四、测试结果 实际运行的结果如下: Input the times of user1's output file:4 Input the times of user2's 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 130
编写一个Spooling程序来模拟假脱机输入输出过程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 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 #include struct info_PCB { long ID;//进程标识 long status;//状态 long po;//输出指针 long head;//信息块首地址 long count;//输出长度 long len;//输出长度 long head;//输出首地址 }block[128]; struct info_wall { long num[10000];//输出内容 long open,closed;//队列指针 }wall[3]; long K[3],L1,L2[3]; long n; void input()//输入函数 { printf("Input the times of user1's output file:"); scanf("%ld",&K[1]); printf("Input the times of user2's output file:"); scanf("%ld",&K[2]); } void init()//初始化函数 { 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)); n=0; } void work()//模拟进程调?{ long r; long k; long a,b; long i,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; else k=3; } if (PCB[k].status!=0) continue; switch (k) { case 1: case 2: //输出进程k a=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; PCB[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 %ld produces a block %ld!\n",k,n); } break; case 3: //Spooling 进程 PCB[3].po++; a=PCB[3].po; for (i=1;i<=block[a].len;i++)
编写一个Spooling程序来模拟假脱机输入输出过程{ 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"。 { PCB[3].status=3; } } break; } } } int main() { srand(time(NULL)); input(); init(); work(); return 0; }