spooling做了什么

1.将独占设备(打印机)虚拟化,变成一个逻辑上的共享设备。

怎么理解?虚拟化,通俗来讲,就是让单个资源仿似变成了多个资源。

以打印机为例,没有虚拟化之前,只能有一个进程申请到打印机资源。

有了虚拟化,多个进程可以同申请到打印机的使用权。也就是说把打印机从独占设备变成了共享设备。

2.将低速设备(字符设备)变成了高速设备。

对于字符设备,我们通常会采用忙等或者中断的方式来进行交互。这样效率比较低。

spooling使用硬盘作为中转,不再直接读写低速设备,从而提高了IO效率。

虚拟化

我们使用打印机来举例。有两种方式来使用。

1.同步的方式:就是进程需要等待打印任务执行完毕。

由于打印机这类设备是低速的独占设备,因此该进程会长时间占用打印机,从而导致其他需要打印机的进程处于忙等或者阻塞的状态。

2.异步的方式:进程不再需要等待打印任务执行完毕。进程将打印任务提交给一个专门的打印机管理进程,然后通过回调函数获取打印结果。

使用异步的方式,增加了并发度,同时也减少了阻塞唤醒或者忙等的开销。

脱机技术指的是任务可以脱离本机(cpu)执行。cpu会将任务交给一个专用的外围设备来处理。一旦任务提交以后,就不需要cpu进行干预。

假脱机没有专门的外围设备,它使用单独的系统进程模拟外围设备,因此称为假脱机。用户进程将任务提交给专门的系统进程(如打印机进程)来处理。

通过一个具体的例子,来看看虚拟化是如何实现的:

操作系统为打印机提供一个专门的进程,称为打印机守护进程,不妨称为d进程。只有d进程拥有使用打印机的权利。

操作系统维护一个打印机消息队列。想要使用打印机的进程,提交一个打印机请求,放入到该消息队列中进行排队。

进程提交了请求以后,就可以继续往下面执行其他逻辑了,可以使用回调函数得知打印执行结果。

d进程负责处理消息队列中的打印任务。当消息队列为空时,则陷入阻塞状态,直到出现新的打印任务。

我们可以看到,消息的处理速度是比较慢的,同时一次只能处理一条消息,所以我们没有必要将整个消息队列都放入内存中。

因此,我们将不用的数据,暂时放入硬盘中。内存中只保留一条消息。

关于spooling的一些理解的更多相关文章

  1. Teaching Machines to Understand Us 让机器理解我们 之三 自然语言学习及深度学习的信仰

    Language learning 自然语言学习 Facebook’s New York office is a three-minute stroll up Broadway from LeCun’ ...

  2. 3.4 目录和spooling

    文件管理部分主要讲文件目录.文件目录它是用于检索文件的.文件目录它是一种文件系统实现按0存取的一种重要手段.一个文件目录它由若干个目录项组成的.每一个目录项它记录了一个文件的相关信息.这个文件信息指明 ...

  3. 20140922 tcpip3次握手 分段 分页 spooling 位示图

    tcpip3次握手 http://www.cnblogs.com/CBDoctor/archive/2012/10/17/2727073.html   操作系统:http://blog.csdn.ne ...

  4. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  5. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  6. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  7. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  8. 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    一.前言     DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...

  9. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

随机推荐

  1. mongodb 在PHP中常见问题及解决方法

    1.$in needs an array 解决:查询用到in操作的时候,说in操作对应的不是我一个数组,或者数组索引不是以0开始的 方法:array_values重新生成一个索引为0开始的数组即可 $ ...

  2. 找大于等于一个数的最小的2^n

    最近看hashmap源码时,发现给定初始capacity计算threshold的过程很巧妙. 1 static final int tableSizeFor(int cap) { 2 int n = ...

  3. mysql.data.entityframeworkcore 已弃用

    转官网有方案: https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html General R ...

  4. 使用C#进行数据库增删改查ADO.NET(一)

    这节讲一下如何使用C#进行数据库的增删改查操作,本节以SQL Server数据库为例. .NET 平台,使用ADO.NET 作为与数据库服务器的桥梁,我们通过ADO.NET就可以使用C#语言操作数据库 ...

  5. Git 系列教程(7)- 撤销操作

    撤销操作 在任何一个阶段,你都有可能想要撤销某些操作 有些撤销操作是不可逆的 --amend 修补提交 有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了. 此时,就可以运行带有 -- ...

  6. Pytorch_Part5_迭代训练

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  7. Jenkins 基础篇 - 插件安装

    这一小节主要介绍 Jenkins 插件的安装,登录到 Jenkins 后,依次进入到[系统管理]→ [插件管理]→ [可选插件],在这里可以看到所有的 Jenkins 插件,如下图: 我们在最开始安装 ...

  8. Java中Stream流相关介绍

    什么是Stream? Stream是JDK8 API的新成员,它允许以声明性方式处理数据集合 特点 代码简洁: 函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环 多核友好 ...

  9. 15.Git

    1.Git介绍 1.1版本控制(理解) 无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况 1.2开发中存在的问题(理解) 程序员小明负责的模块就要完成了,就在即将提交发布之前的一瞬间 ...

  10. EFCore之增删改查

    1. 连接数据库 通过依赖注入配置应用程序,通过startup类的ConfigureService方法中的AddDbContext将EFCore添加到依赖注入容器 public void Config ...