操作系统实验Spooling技术.docx
- 文档编号:10481611
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:10
- 大小:316.44KB
操作系统实验Spooling技术.docx
《操作系统实验Spooling技术.docx》由会员分享,可在线阅读,更多相关《操作系统实验Spooling技术.docx(10页珍藏版)》请在冰豆网上搜索。
操作系统实验Spooling技术
学号P1514032专业计算机科学与技术姓名
实验日期2017.12.21教师签字成绩
实验报告
【实验名称】Spooling系统模拟
【实验目的】
体会操作系统中spooling假脱机输入输出的过程,以及缓冲区,输入井,输出井,输出缓冲区间的关系,井管理程序的作用。
【实验原理】
Spooling技术实质上是利用一个共享设备的一个存储区,并不是真正占有这一设备,用户进程把要完成的任务以及文件的形式存入存储区,在存储区中排队并等待SPOOLING系统调度,只有被SPOOLING系统调度并输入,此项任务才真正完成,通过SPOOLING技术可以使独占设备成为共享设备,由此大大提高了设备的使用率,节约了硬件资源。
Spooling系统主要有以下三部分组成:
(1)输入井和输出井。
这是在磁盘上开辟的两个大存储空间。
输入井是模拟脱机输入时的磁盘设备,用于暂存I∕O设备输入的数据;输出井是模拟脱机输出时磁盘,用于暂存用户程序的输出数据。
(2)输入缓冲区和输出缓冲区。
为了缓和CPU和磁盘之间速度不匹配的矛盾,在内存中要开辟两个缓冲区:
输入缓冲区和输出缓冲区。
输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。
输出缓冲区用于暂存从输出井送来的数据,以后在传送给输出设备。
(3)输入进程SPi和输出进程SP0。
这里利用两个进程来模拟脱机I∕O时的外围控制机。
其中,进程SPi模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井,当CPU需要输入数据时,直接从输入井读入内存;进程SP0模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上
【实验内容】
数据结构:
#defineN1000//设置缓冲区最大为100
intbuffer_num;//缓冲区实际大小
intinput_nums[N];//设置输入数组
intinput_num;//io设备输入大小
doubletime=0;//需求时间
intread_time;//每个字符读取到缓冲区的时间
intread_time2;//缓冲区输入到#管理
主要函数:
voidinit()//初始化缓冲区,初始化输入
voidset_time()//设置时间
voidinput_process()//Spooling模拟
voidoutput_runtime()//输出时间函数
流程图:
实验源代码:
#include
#include
#defineN1000//设置缓冲区最大为100
intbuffer_num;//缓冲区实际大小
intwell[N];
intpos=0;
intinput_nums[N];
intinput_num;//io设备输入大小
doubletime=0;
intread_time;
intread_time2;
voidset_time()//设置时间
{
printf("输入读取一个字符的时间\n");
scanf("%d",&read_time);
printf("输入缓冲区到#管理的时间\n");
scanf("%d",&read_time2);
}
voidinit()//初始化缓冲区,初始化输入
{
printf("输入缓冲区大小\n");
scanf("%d",&buffer_num);
printf("输入io设备要输入的数字量\n");
scanf("%d",&input_num);
for(inti=1;i<=input_num;i++)
input_nums[i]=i;
}
voidinput_process()//输入进程
{
inti,j=0;
printf("缓冲区的内容为:
\n");
if(input_num<=buffer_num)
{
j=0;
for(i=0;i { Sleep(read_time*20);//模拟I/O到缓冲区的时间 printf("%d\t",input_nums[i]); j++; } printf("缓冲区未满,缓冲区将数据写入输入#"); for(intk=0;k<6;k++) { Sleep(read_time2*20);//模拟缓冲区到输入#时间 printf("."); } printf("\n"); Sleep(read_time2*20);//模拟缓冲区到输入#时间 time+=read_time*j+(j*1.0/buffer_num)*read_time2; return; } for(i=0;i { Sleep(read_time*20); j++; printf("%d\t",input_nums[i]);//输出到屏幕 if(j==buffer_num) { j=0; printf("缓冲区满,缓冲区将数据写入输入#"); for(intk=0;k<6;k++) { Sleep(read_time2*20); printf("."); } printf("\n"); time+=read_time*buffer_num+read_time2; printf("当前时间为%.2f\n\n",time); printf("缓冲区的内容为: \n"); } } if(j! =buffer_num) { printf("\n\n"); time+=read_time*j+(j*1.0/buffer_num)*read_time2; } } voidoutput_runtime()//输出时间函数 { printf("所用的时间为%.2f\n",time); } intmain() { intchoose; printf("\n\n************************Spooling系统模拟程序***********************\n"); init();//初始化 set_time();//设置时间 input_process();//模拟输入 output_runtime();//输出运行时间 } 实验截图: 分三种情况: 当要I/O要输入的字符数小于等于缓冲区时,如图,设置缓冲区数量为8,I/O中字符数为4,此时缓冲区不会满,所用的时间为(4*4)+(4/8)*6=19,验证正确。 二、当要I/O要输入的字符数恰好等于等于缓冲区的整数倍时。 如图,设置缓冲区数量为4,I/O中字符数为52,此时会有13个满缓冲区,输出每一步缓冲区到#的当前时间,所用的总时间为(4*52)+13*8=312,验证正确。 三、当要I/O要输入的字符数恰好等于等于缓冲区的整数倍并有余数时时。 如图,设置缓冲区数量为4,I/O中字符数为54,此时会有13个满缓冲区,和一个半缓冲区输出每一步缓冲区到#的当前时间,所用的总时间为(4*54)+13*8+4/8*8=324,验证正确。 【小结或讨论】 1、Spooling技术实质上是利用一个共享设备的一个存储区,并不是真正占有这一设备,用户进程把要完成的任务以及文件的形式存入存储区,在存储区中排队并等待SPOOLING系统调度,只有被SPOOLING系统调度并输入,此项任务才真正完成,通过SPOOLING技术可以使独占设备成为共享设备,由此大大提高了设备的使用率,节约了硬件资源。 2、在编写实验的过程中,分成了三种情况即输入量小于缓冲区数量,输入量等于缓冲区数量的整倍数,输入量等于缓冲区数量的整倍数加余数,需要注意的是,读取结束时,当缓冲区未满时,所需要的时间并不是整个缓冲区移植到#管理的时间,而是n/num*time,其中n为缓冲区中的数据量,num为缓冲区大小,time为缓冲区到#的时间。 3、在对Spooling技术的理解中,由于I/O的速度远远小于内存到硬盘的速度,所以并不能实现缓冲区一边向#管理即硬盘输出,一边I/O向缓冲区输入。 如果能实现这个操作,那么缓冲区也就没作用了,不如直接I/O直接写入内存再写入硬盘, 4、通过这次实验,我明白了假脱机系统的流程,也明白了为了缓和CPU的高速性和IO设备的低速性的矛盾,操作系统是如何进行处理的。 缓冲区的技术在计算机中很多地方都有应用,提高了计算机的速度。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 Spooling 技术