假脱机技术(SPOOLing)

假脱机技术(SPOOLing):是操作系统中采用的一项将独占设备改造成共享设备的技术。

背景

在没有现代计算机技术的早期,外部设备(如打印机、磁带机等)通常较为缓慢,且经常是同步操作。例如,在打印机操作时,CPU必须等待打印机完成当前任务才能继续执行其他操作。为了避免外设操作成为计算机系统瓶颈,早期采用了脱机输入输出(Offline I/O)的方式:通过专门的外围控制机,将低速设备的数据先传输到高速磁盘上。CPU可以从磁盘直接读取数据,或者在需要输出时将数据写入磁盘,再由外围设备从磁盘中读取数据。这种操作方式将外围设备与CPU的计算任务解耦,避免了I/O操作的阻塞。

组成

  1. 输入井和输出井

输入井和输出井是SPOOLing技术中的两个关键存储区域,通常存在于磁盘中,作用是模拟脱机输入输出过程中的磁盘存储。

输入井:用于存储从输入设备(如键盘、扫描仪、传感器等)接收到的数据。数据在进入输入井之前,会通过输入缓冲区暂存。输入井中的数据一般按文件形式存储,每个文件存储着某个进程的输入数据。当CPU需要处理输入数据时,系统会从输入井读取数据。
输出井:用于存储从用户程序生成的输出数据,这些数据通常来自内存。输出井中的数据将在稍后通过输出缓冲区传输到输出设备(如打印机、显示器等)。输出井使得用户程序可以异步地生成输出数据,并在外设空闲时进行输出。

井文件:输入井和输出井中的数据通常被组织成文件,每个文件对应一个进程的输入或输出数据。这些井文件通过文件系统进行管理,并可以形成输入或输出队列,用于按顺序处理多个进程的I/O任务。

  1. 输入缓冲区和输出缓冲区

输入缓冲区和输出缓冲区用于缓解CPU和磁盘之间的速度差异,确保I/O操作能够高效且不阻塞。

输入缓冲区:当输入设备传送数据时,数据首先存储在输入缓冲区中。输入缓冲区充当内存与输入井之间的桥梁。缓冲区内的数据随后会被写入输入井,待CPU需要时再从井中读取。
​​​​​​​输出缓冲区:与输入缓冲区相似,输出缓冲区暂存从输出井中取出的数据,等待传输到输出设备。缓冲区的作用是将内存中的输出数据暂存,避免直接与设备进行频繁的交互,缓解设备和内存间的速度不匹配问题。

  1. 输入进程和输出进程

输入进程和输出进程是处理SPOOLing任务的关键进程,它们负责管理输入和输出操作的执行。

输入进程(预输入进程):输入进程模拟脱机输入操作,负责将来自输入设备的数据读取并传送到输入缓冲区,然后将数据存储到输入井。输入进程确保数据能够在CPU需要时从输入井中读取。
​​​​​​​输出进程(缓输出进程):输出进程模拟脱机输出操作,负责将内存中的数据写入输出井。当输出设备空闲时,输出进程将数据从输出井通过输出缓冲区发送到外设,完成输出任务。

这两个进程的主要任务是将I/O操作从CPU和外设之间解耦,使得计算和外设操作能够并行进行,避免I/O操作阻塞CPU。

  1. 井管理程序

井管理程序负责协调作业与输入输出设备之间的数据交换。它的功能包括:

控制输入输出操作:井管理程序根据作业的要求启动输入或输出操作。当作业需要从输入设备读取数据时,井管理程序会将数据从输入设备传送到输入缓冲区,再将其存储到输入井。当作业需要输出数据时,井管理程序会将数据从内存传送到输出井,并在外设空闲时将其输出。
管理输入输出队列:井管理程序还负责管理输入井和输出井的任务队列。它根据任务的优先级或顺序处理队列中的数据,以确保外设的高效利用。
​​​​​​​调度I/O任务:井管理程序决定何时从井中读取或写入数据,确保在合适的时间将数据交给输入输出设备处理,优化设备的使用效率。

工作过程

1、为进程申请磁盘输出井缓冲区

每个进程的打印请求并不直接发送到打印机,而是首先被送到磁盘上的输出井。这个缓冲区并不是一个临时内存区域,而是存储在磁盘上的一个区域,属于持久存储的一部分。

  • 当一个进程请求打印时,假脱机管理进程会在磁盘输出井中为该进程申请一个空闲缓冲区。然后,将用户的打印数据(例如打印文档)存放到这个缓冲区中,确保数据暂时存储在磁盘上,而不是直接与打印机进行交互。

这种做法确保了CPU和外设(打印机)之间的速度不匹配问题得以缓解。用户进程的打印任务不再等待打印机,而是先存储在磁盘缓冲区中。

2、创建并挂起打印请求表

与此同时,假脱机管理进程会为每个请求打印的进程创建一个打印请求表,并将相关的请求信息填充到表中。打印请求表的主要内容包括:

  • 存储位置:指示打印数据存放的位置(例如磁盘上的缓冲区)。

  • 请求信息:包括打印的具体要求、优先级等。

然后,打印请求表被挂到假脱机文件队列中,等待后续处理。文件队列中的请求按一定的顺序排队,待打印机空闲时,依次取出并处理。

3、当打印机空闲时处理打印任务

当打印机空闲时,输出进程会从假脱机文件队列的队头取出一个打印请求表,然后根据表中的信息开始执行打印操作。

  • 输出进程会根据打印请求表中的要求,先从磁盘输出井中将对应的打印数据取出,并将其传输到输出缓冲区

  • 接着,数据从输出缓冲区传输到打印机,完成打印。

你可能感兴趣的:(linux,数据结构)