spooling 技术工作原理

SPOOLing技术的工作原理

SPOOLing是Simultaneous Peripheral Operation On-Line (即外部设备联机并行操作)的缩写,它是关于慢速字符设备如何与计算机主机交换信息的一种技术,通常称为“假脱机技术”。

SPOOLing系统既不同于脱机方式,也不同于直接藕合方式,SPOOLing 技术实际上是一种外围设备同时联机操作技术,又称为排队转儲技术。它在输入和输出之间增加了“输入井”和“输出井”的排队转儲环节,以消除用户的“联机”等待时间。在系统输入模块收到作业输入请求信号后,输入管理模块中的读过程负责将信息从输入装置中读入输入井缓冲区。当缓冲区满时,由写过程将信息从缓冲区写到外存的输入井中,读过程和写过程反复循环,直到一个作业输入完毕。当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最后一批信息写入外存输入井并调用中断处理程序结束该次输入。然后,系统为该作业建立作业控制块,从而使输入井中的作业进入作业等待队列,等待作业调度程序选中后进入内存运行。系统在管理输入井过程中可以“不断”读入输入的作业,直到输入结束或输入井满而暂停。若系统的某台台行式打印机采用了虚拟设备技术,那么若有进程要求对它打印输出时,SPOOLing系统并不是将这台打印机直接分配给进程,而是在共享设备(磁盘或磁鼓)上的输出SPOOLing存储区中为其分配一块存储空间,进程的输出数据以文件形式此。各进程的数据输出文件形成了一个输出队列,由输出POOLing系统控制这台打印机进程,依次将队列中的输出文件实际打印输出。在SPOOLing 系统中,实际上并没有为任何进程分配,而只是在输入井和输出井中,为进程分配一存储区和建立一章I/O请求表。这样,便把独占设备改造为共享设备。

宏观上,虽然是多个进程在同时使用一台独立设备,而对每一个进程而言,它们都认为自己是独占了一个设备。当然,该设备只是逻辑上的设备。SPOOLing系统实现了将独占设备变换为若干台对应的逻辑设备的功能。

SPOOLing技术实质上是用户进程利用一共享设备的一个存储区,并不是真正占有这一设备,用户进程把要完成的任务以文件的形式存入存储区,在存储区中排队并等待SPOOLing系统调度,只有被SPOOLing系统调度并输出,此项任务才真正完成,通过这一技术可以大大提高了共享设备的使用率,节约了硬件资源。

SPOOLing技术是在通道技术和多道程序设计基础上产生的,它由主机和相应的通道共同承担作业的输入输出工作,利用磁盘作为后援存储器,实现外围设备同时联机操作。
SPOOLing系统由专门负责I/O的常驻内存的进程以及输入井、输出井组成;它将独占设备改造为共享设备,实现了虚拟设备功能。

将一台独享打印机改造为可供多个用户共享的打印机,是应用SPOOLing技术的典型实例。具体做法是:系统对于用户的打印输出,但并不真正把打印机分配给该用户进程,而是先在输出井中申请一个空闲盘块区,并将要打印的数据送入其中;然后为用户申请并填写请求打印表,将该表挂到请求打印队列上。若打印机空闲,输出程序从请求打印队首取表,将要打印的数据从输出井传送到内存缓冲区,再进行打印,直到打印队列为空。

SPOOLing技术实现设备管理时的工作特征:

1、提高了I/O速度

2、将独占设备改造为共享设备

SPOOLing 系统中,实际上并没有为任何进程分配,而只是在输入井和输出井中,为进程分配一存储区并建立一张I/O请求表。这样,便把独占设备改造为共享设备。

宏观上,虽然是多个进程在同时使用一台独立设备,而对每一个进程而言,它们都认为自己是独占了一个设备。当然,该设备只是逻辑上的设备。SPOOLing系统实现了将独占设备变换为若干台对应的逻辑设备的功能

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的Python代码模拟多用户共享打印机过程,其中使用了Spooling技术: ```python import threading import time class PrintJob: def __init__(self, user, content): self.user = user self.content = content class PrintSpooler: def __init__(self): self.print_queue = [] self.lock = threading.Lock() def add_job(self, job): self.lock.acquire() self.print_queue.append(job) self.lock.release() def get_job(self): job = None self.lock.acquire() if len(self.print_queue) > 0: job = self.print_queue.pop(0) self.lock.release() return job class Printer: def __init__(self, name): self.name = name self.printer_lock = threading.Lock() def print_job(self, job): self.printer_lock.acquire() print("[%s] print job from user %s: %s" % (self.name, job.user, job.content)) time.sleep(3) self.printer_lock.release() def user_job(user, spooler): for i in range(3): content = "This is print job %d from user %s" % (i+1, user) job = PrintJob(user, content) spooler.add_job(job) print("User %s added job %d to the print queue" % (user, i+1)) time.sleep(2) def printer_job(printer, spooler): while True: job = spooler.get_job() if job is not None: printer.print_job(job) if __name__ == '__main__': spooler = PrintSpooler() printer1 = Printer('Printer A') printer2 = Printer('Printer B') users = ['A', 'B', 'C', 'D'] threads = [] for user in users: t = threading.Thread(target=user_job, args=(user, spooler)) threads.append(t) t.start() t1 = threading.Thread(target=printer_job, args=(printer1, spooler)) t2 = threading.Thread(target=printer_job, args=(printer2, spooler)) t1.start() t2.start() for t in threads: t.join() ``` 在这个示例中,我们定义了三个类:PrintJob表示打印任务,PrintSpooler表示打印队列,Printer表示打印机。`user_job`函数模拟用户添加打印任务的过程,它将多个PrintJob对象添加到PrintSpooler的打印队列中。`printer_job`函数模拟打印机的打印过程,它不断地从PrintSpooler的打印队列中获取PrintJob对象并将其打印。最后,我们创建了多个线程来模拟多个用户同时使用共享打印机的情况,以及多个打印机同时工作的情况。 在模拟假脱机操作过程中,可以在PrintSpooler类中添加一个成员变量,用于表示打印机是否处于脱机状态。在打印任务时,如果打印机处于脱机状态,可以将任务缓存到队列中,等待打印机重新上线后再进行打印。在打印机重新上线后,可以通过一个线程循环检查打印队列中是否有缓存的任务,并将其打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值