zoukankan      html  css  js  c++  java
  • 终于搞懂了狗日的SPOOLing技术

    SPOOLing和虚拟化

    什么是虚拟化

    虚拟化就是无中生有,就是暗度陈仓(狗头保命)。仔细观察整个计算机系统的设计,到处都体现着虚拟化的技术。当然虚拟化就是操作系统设计的要求之一。我们很好理解 CPU 的虚拟化技术,也就是通过进程调度实现多道程序的功能。在“无知的我”看来计算机不止一块CPU呀,因为我可以在打 LOL 的时候和队友 YY语音聊天;也可以在钉钉上网课的同时在 B站看电影!好像我开了几个进程就有几块CPU一样但是实际上我的电脑还真就仅有一块 CPU。是不是感觉被自己的电脑欺骗了~~~当然,除了 CPU 的进程调度外还有一大堆的虚拟化技术,例如虚拟内存技术在逻辑上扩充了内存的空间,虚拟文件系统技术等等。

    说了这么些,我就是想表明别看 SPOOLing 看上去那么高大上(我都看不懂这个英文啥个意思),无非也就是个空手套白狼的家伙,无非就是虚拟化技术的一种罢了。

    SPOOLing技术

    SPOOLing 技术是用于将 IO 设备进行虚拟化的技术,这个技术可不像 CPU 的虚拟化能欺骗我们人类,它是专门用于欺骗进程的。就拿打印机举栗吧,我就买了一台打印机,但此时我打开了 word 和 pdf,想要打印 word 和 pdf 中的内容;此时计算机中有2个进程,word 进程和 pdf 进程,这两个进程都认为自己拥有一个打印机,那么是否此时我作为计算机的主人就拥有2台打印机了呢?当然不是啊,我又不是睁眼瞎,我就看到了一台打印机啊~~~这就是通过虚拟化技术欺骗了2个无知的进程。

    具体的实现

    道理我都懂,那么怎么实现欺骗进程的目的呢(也就是怎么实现SPOOLing技术呢)?

    1. SPOOLing 技术首先需要提供统一的调用接口,每一个进程都可以调用该接口,这样在进程看了自己是拥有该设备的。
    2. 需要将磁盘设备和内存作为缓冲区,磁盘设备上的缓冲区称作,而内存上的缓存区被称作缓冲区
    3. 需要一个专门的输入输出进程来实现对 I/O 设备的读写数据。

    以向 I/O 设备写数据为例子,做出概念图,如下所示:

    首先某一个进程(例如 word)调用了统一的接口,然后进入内核。内核例程负责将 word 想要打印的内容做成一个打印申请表,将这个申请表放入打印输出队列中(这个队列在输出井中)。然后由输出进程从打印队列中取打印申请表,根据表格内容将用户数据从磁盘中取出放入内存输出缓冲区,然后再输出到 I/O 设备中。输出进程会不断的查看打印输出队列,直到队列为空,则输出进程被阻塞。

    这篇随笔是我自己阅读了网上关于SPOOLing技术的相关文章后,消化理解的一些浅显的概念。如果有错误的地方请不吝指出,也欢迎大家一起探讨!

  • 相关阅读:
    There is an overlap in the region chain修复
    There is an overlap in the region chain
    region xx not deployed on any region server
    python 中的re模块,正则表达式
    TCP粘包问题解析与解决
    yield from
    Git push提交时报错Permission denied(publickey)...Please make sure you have the correct access rights and the repository exists.
    mysql 中Varchar 与char的区别
    Mysql 字符集及排序规则
    请实现一个装饰器,限制该函数被调用的频率,如10秒一次
  • 原文地址:https://www.cnblogs.com/Codroc/p/12841295.html
Copyright © 2011-2022 走看看