为了缓和CPU的高速性与I/O设备低速性间的矛盾而引入了脱机输入、输出技术。该技术是利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上;或者相反。
事实上,当系统中引入了多道程序技术后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机的功能,把低速I/O设备上的数据传送到高速磁盘上;再用另一道程序来模拟脱机输出时外围控制机的功能,把数据从磁盘上传送到低速输出设备上。这样,便可在主机的直接控制下,实现脱机输入、输出功能。
此时的外围操作与CPU对数据的处理同时进行,我们把这种在联机情况下实现的同时外围操作称为SPOOLing,或称为假脱机操作。
通过SPOOLing技术可将一台物理I/O设备虚拟为多台逻辑I/O设备,允许多个用户共享一台物理I/O设备。
SPOOLing技术是对脱机输入、输出系统的模拟。相应地,SPOOLing系统必须建立在具有多道程序功能的操作系统上,而且还应有高速随机外存(通常是磁盘)的支持。
 
SPOOLing系统主要有以下三部分:
  • 输入井和输出井。
这是在磁盘上开辟的两个大存储空间。用高速的磁盘设备来模拟慢速的字符设备,缩短进程在内存中的驻留时间。
井是用作缓冲的存储区域:输入井是模拟脱机输入时的慢速设备,用于暂存I/O设备输入的数据;输出井是模拟脱机输出时的慢速设备,用于暂存用户程序的输出数据。
井管理程序:控制作业和井之间的数据交换(实际上是I/O重定向)
输入输出井中的数据一般以文件的形式组织管理,这些文件称之为井文件。
井文件空间被划分为等长的物理块,每块用于存放一条或多条逻辑记录。可采用两种方式存放作业的数据信息:
(1)链接方式:输入/输出信息被组织成输入/输出队列链接文件,文件的第一块位置登记在输入表/输出表中。数据可以不连续存放,文件空间利用率高。
(2)计算方式:直接计算出文件在磁盘中的位置
  • 输入缓冲区和输出缓冲区。
为了缓和CPU和磁盘之间速度不匹配的矛盾,在内存中要开辟两个缓冲区:输入缓冲区和输出缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送给输出设备。
  • 输入进程SPi和输出进程SPo
这里利用两个进程来模拟脱机I/O时的外围控制机。
预输入程序的进程SPi模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井,当CPU需要输入数据时,不必再启动输入设备,直接从输入井读入内存;
缓输出程序的进程SPo模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。
进程运行过程中只从输入井读入数据,只向输出井输出数据,使得全部I/O都基于磁盘,以加快进程周转,提高系统吞吐量。这样不仅设备利用率提高,作业的运行时间也会缩短,每个作业都感觉各自拥有所需的独占设备。
   
SPOOLing技术使用示例:
  • 使用一类物理设备来模拟另一种物理设备,如内存卡模拟磁盘、块设备模拟字符设备、输入输出重定向
  • 打印机SPOOLing守护进程
打印机是经常要用到的输出设备,属于独占设备。如果用户进程通过打开打印机的设备文件来申请和使用打印机,往往会造成该进程打开设备文件后长达数小时不用,但其他进程又无法使用打印机。
利用SPOOLing技术,可将之改造为一台可供多个用户共享的设备,从而提高设备的利用率,也方便了用户。共享打印机技术已被广泛地用于多用户系统和局域网中。当用户进程请求打印输出时,SPOOLing系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事:
1)由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中。即,打印文件前,用户进程先产生完整的待输出文件,并存放在SPOOL打印目录下。
2)输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。如果还有进程要求打印输出,系统仍可接受该请求,也同样为该进程做上述两件事。
打印机守护进程是唯一有特权使用打印机设备的进程,如果打印机空闲,启动守护进程,打印待输出文件。此时输出进程将从请求打印队列的队首取出一张请求打印表,根据表中的要求将要打印的数据从输出井传送到内存缓冲区,再由打印机进行打印。打印完后,输出进程再查看请求打印队列中是否还有等待打印的请求表。若有,又取出队列中的第一张表,并根据其中的要求进行打印,如此下去,直至请求打印队列为空,输出进程才将自己阻塞起来。仅当下次再有打印请求时,输出进程才被唤醒。
  • 网络通信SPOOLing守护进程
在网上传输文件常使用SPOOLing守护进程,发送文件之前现将其放在特定的网络SPOOLing目录下,后由网络通信守护进程将其取出并发送出去。
这种文件传送方式的用途之一是因特网电子邮件系统,用户使用类似send的程序接收所要发送的信件并将其送入固定的电子邮件SPOOL目录下等待以后发送,整个电子邮件系统在操作系统之外作为一种应用程序运行。
 

 
在多道批处理系统中,我们把对一个作业的加工处理过程抽象成作业管理的过程,
作业说明语言:一种作业控制语言,用户通过它描述对一个作业具体的加工处理方式。这种加工处理方式被抽象为作业说明书。
作业说明书:刻画具体作业的控制方式。作业说明书和代码数据一起提交给操作系统,构成作业。
系统拥有一张作业表用来登记进入系统的所有作业的JCB,包括:作业名、作业状态、预输入表位置、缓输出表位置。
预输入表、缓输出表用来登记作业各输入输出文件的情况,包括设备类、文件名、信息长度、存放位置
作业在其生命周期中处于四个状态,可通过作业表的状态项指示:输入状态(预输入)、收容状态(空闲)、执行状态(可以从输入井读数据或向输出井写数据)、完成状态(缓输出)
当一个作业建立之后,首先进入输入状态,SPOOLing系统的预输入程序将控制作业预输入相关信息进入输入井。
预输入完成后作业进入收容状态,进入后备状态的作业具备了构成进程进行运行的条件。此时要通过作业调度程序进行选择,从完成了预输入的收容状态作业中,选择作业进入执行状态运行,构成进程(前提是资源充足)。作业调度算法包括优先数、短作业、响应比、设备搭配等。
执行时通过井管理程序,直接与输入井输出井交互,完成进程的执行。
作业进程结束时,数据有可能还没有完全输入到慢速的输出设备上,缓输出程序可以控制完成状态的作业实现输出从而完成整个作业。

操作系统-I/O(3)SPOOLing技术的更多相关文章

  1. 转 SPOOLING技术——操作系统

    传送门 SPOOLING技术——操作系统 SPOOLING技术(Simultaneous Peripheral Operating On Line) 同时联机外围操作技术,它是关于慢速字符设备如何与计 ...

  2. Spooling技术

    转自https://blog.csdn.net/weixin_42229896/article/details/80736517   假脱机的概念 SPOOLing技术:利用高速共享设备(通常是磁鼓或 ...

  3. 操作系统IO之零拷贝技术

    磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝.直接 I/O.异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统 ...

  4. UDP代码编写、操作系统发展史、多道技术、进程理论与代码层面创建、进程join方法与进程对象方法

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...

  5. 3、网络并发编程--udp代码、操作系统发展史、多道技术、进程理论

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...

  6. [转].NET程序在windows操作系统上独立运行的技术要点

    发现一个不错的网站,转载一篇文章方便查看 转自 http://www.linuxdot.net/bbsfile-3354   ===================================== ...

  7. ******十三 ******、软设笔记【操作系统】-磁盘管理、虚设备与SPOOLing系统

    五.磁盘管理 1.磁盘的访问时间 *寻道时间Ts:把磁臂从当前位置移到指定磁道上所经历的时间 *选择延迟时间Tr:指定扇区移动到磁头下面所经历的时间. *传输时间Tt:数据从磁盘读出或向磁盘写入数据所 ...

  8. 转载文章——从HelloWorld学习操作系统

    转载地址:https://my.oschina.net/hosee/blog/673628?p=%7b%7bcurrentPage+1%7d%7d 本文就将系统性的串联起那些知识点,方便复习和回顾.本 ...

  9. 找工作---操作系统常考知识点总结【PB】

    1.进程是并发过程中程序的执行过程 2.进程的特征:结构特征.动态性.并发性.独立性.异步性 3.临界区指在每个进程中访问临界资源的那段代码 4,现在操作系统中申请资源的基本单位是进程,在CPU得到执 ...

随机推荐

  1. PHP操作Redis步骤详解

    一.Redis连接与认证 $redis = new Redis(); //连接参数:ip.端口.连接超时时间,连接成功返回true,否则返回false $ret = $redis->connec ...

  2. Java-旋转字符串

    描述 旋转字符串 给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转). 挑战 在数组上原地旋转,使用O(1)的额外空间 说明 原地旋转意味着你要在s本身进行修 ...

  3. JVM系列之:String.intern的性能

    目录 简介 String.intern和G1字符串去重的区别 String.intern的性能 举个例子 简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字 ...

  4. Arduino+温度、湿度传感器

    Arduino语言注解Arduino语言是建立在C/C++基础上的,其实也就是基础的C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置都函数化,不用我们去了解他的底层,让我们 ...

  5. Python File read() 方法

    概述 read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有.高佣联盟 www.cgewang.com 语法 read() 方法语法如下: fileObject.read(); 参数 ...

  6. PHP usort() 函数

    ------------恢复内容开始------------ 实例 使用用户自定义的比较函数对数组 $a 中的元素进行排序:Sort the elements of the $a array usin ...

  7. PHP acos() 函数

    实例 返回不同数的反余弦: <?phpecho(acos(0.64) . "<br>");echo(acos(-0.4) . "<br>&q ...

  8. ABC E - Active Infants 贪心 dp

    LINK:Active Infants 一个快省选的人 还在写ABC(莫名觉得丢人 不过也无所谓了. 首先考虑 随便一个排列 我们考虑一下其是不是最优的 容易发现如果最大值没有在边界上的话我们直接把它 ...

  9. Tarjan算法 学习笔记

    前排提示:先学习拓扑排序,再学习Tarjan有奇效. -------------------------- Tarjan算法一般用于有向图里强连通分量的缩点. 强连通分量:有向图里能够互相到达的点的集 ...

  10. 分析"傍富婆发财"

    视频地址https://www.bilibili.com/video/BV1pZ4y1u7jf 半佛 被富婆阿姨毒打的原因: 1.地位不对等导致工具化 资源不对等的情况下,尤其是一方极度依赖另一方资源 ...