八:操作系统设备管理之缓冲、缓存与假脱机
弥合鸿沟:操作系统中的缓冲、缓存与假脱机技术深度解析
在计算机系统的世界里,存在着一个根本性的速度差异:中央处理器(CPU)的执行速度飞快,而输入/输出(I/O)设备(如硬盘、打印机、网络接口等)的速度相对缓慢得多。这种速度不匹配就像让一个百米飞人等待一个散步的老人,CPU在等待慢速的I/O操作完成时会大量空闲,极大地浪费了计算资源。
为了解决这个问题,操作系统引入了多种技术来协调CPU和I/O设备之间的速度差异,并实现系统各组件之间的有效解耦。其中,缓冲(Buffering)、缓存(Caching)和假脱机(Spooling)是三种最常用且至关重要的技术。虽然它们都涉及临时存储区域的使用,但各自的目标、机制和应用场景却有所不同。
让我们逐一深入了解这三种技术。
1. 缓冲 (Buffering)
核心思想: 利用一块内存区域作为数据传输过程中的临时中转站,以平滑数据流、匹配不同设备的速度差异,并减少物理I/O操作的次数。
工作机制:
缓冲区是一块位于主存(RAM)中的连续内存区域。当数据从一个设备(比如磁盘)读取到另一个设备(比如内存中的应用程序区域)时,或者从应用程序写入到设备时,数据不会直接一对一传输,而是先写入缓冲区,再从缓冲区读取。
- 写入操作: 应用程序将要写入的数据发送到缓冲区。当缓冲区满时,操作系统会将整个缓冲区的数据作为一个大的块一次性写入到目标设备(如磁盘)。或者,即使缓冲区未满,当应用程序执行特定操作(如关闭文件)或操作系统认为需要时,也会将缓冲区内容“刷新”到设备。这种方式将多个小的写操作聚合成一个大的写操作,减少了启动物理设备进行写操作的开销。
- 读取操作: 当应用程序请求读取数据时,操作系统会从设备(如磁盘)读取一个较大的数据块到缓冲区。应用程序后续的读取请求会首先尝试从缓冲区获取数据。只有当缓冲区中的数据被读完,或者需要的数据不在当前缓冲区中时,操作系统才会再次启动物理设备进行读取,填充缓冲区。这种方式将多个小的读操作转化为一个大的读操作,减少了物理读设备的次数。
如何提高I/O效率和实现解耦:
- 速度匹配: CPU/应用程序以其高速生产或消费数据,将数据放入或取出缓冲区;而慢速设备则按照自己的节奏从缓冲区读取或写入数据。缓冲区充当了“蓄水池”,弥合了两者之间的速度差异,避免了CPU频繁地等待慢速设备。
- 减少物理I/O操作: 通过将多个小的数据传输请求聚合成一个大的传输请求,减少了设备启动、寻道(对于磁盘)等耗时操作的频率,从而提高了整体I/O吞吐量。
- 简单解耦: 应用程序与物理设备之间通过缓冲区隔离开。应用程序只需与内存中的缓冲区交互,而无需直接与复杂的硬件接口打交道或等待其操作完成。这是一种简单的异步处理形式。
示例:
- 文件I/O: 当你在C语言中使用
fprintf
向文件写入少量文本时,这些文本通常不会立即被写入硬盘。它们会先被累积在一个内存缓冲区中(通常由标准库管理)。只有当你写入了足够多的数据填满缓冲区,或者调用了fflush
,或者程序结束关闭文件时,缓冲区的内容才会被写入磁盘。同样,当你使用fgets
从文件中读取一行时,操作系统可能会一次性从磁盘读取一个较大的数据块(比如一个扇区或簇)到缓冲区,然后fgets
从缓冲区中提取一行数据。 - 键盘输入: 你快速敲击键盘输入的字符并不会立即被应用程序处理。它们会先进入一个由操作系统维护的键盘输入缓冲区。应用程序在需要时从缓冲区中读取字符。这样即使CPU暂时忙于处理其他任务,你的击键也不会丢失。
- 网络通信: 发送网络数据时,数据通常会进入一个发送缓冲区,然后由网络接口卡(NIC)按照网络协议的要求逐步发送出去。接收网络数据时,数据会先进入一个接收缓冲区,应用程序再从缓冲区中读取。
总结: 缓冲是解决I/O速度不匹配问题最基本、最直接的技术,它通过引入临时存储区域来平滑数据传输,减少物理操作次数。
2. 缓存 (Caching)
核心思想: 存储一份原始数据(来自慢速设备)的副本在快速存储介质(通常是内存)中,以便未来再次访问相同数据时能够从快速介质中获取,从而显著减少访问时间。缓存的关键在于存储的是数据的 副本,并且侧重于存储 最常访问 或 最近访问 的数据,利用的是数据的局部性原理。
工作机制:
缓存是一块比原始数据存储介质更快、但容量通常更小的存储区域。当系统需要访问数据时,首先会检查缓存。
- 缓存命中 (Cache Hit): 如果请求的数据已经在缓存中,则直接从缓存中读取数据并提供给请求者。这个过程非常快。
- 缓存未命中 (Cache Miss): 如果请求的数据不在缓存中,系统需要从原始的慢速存储介质中读取数据。在将数据提供给请求者的同时,系统会将这份数据的一个副本存入缓存,以备将来使用。如果缓存已满,需要根据一定的替换策略(如最近最少使用LRU, 先进先出FIFO等)丢弃缓存中旧的数据块。
如何提高I/O效率和实现解耦:
- 显著加速数据访问: 对于具有较高访问局部性(即经常访问相同或附近的数据)的应用场景,缓存能将大量原本需要访问慢速设备的请求转化为访问快速内存的请求,从而极大地降低了平均数据访问延迟。
- 利用局部性原理: 缓存设计基于时间局部性(刚访问过的数据很可能很快再次被访问)和空间局部性(访问一个数据后,其附近的数据也很可能很快被访问)原理。
- 一定程度的解耦: 应用程序的读取请求首先是针对缓存层。如果命中,应用程序直接从缓存获取数据,无需等待慢速设备的响应。只有在未命中时,缓存管理机制才会去和慢速设备交互。这使得应用程序在数据命中时感觉不到慢速设备的存在。
示例:
- CPU缓存(L1, L2, L3 Cache): 这是最常见的缓存形式,位于CPU内部或紧邻CPU,速度比主存快几个数量级。CPU在执行指令和处理数据时,优先从这些缓存中获取。如果缓存未命中,才会去访问速度较慢的主存。
- 磁盘缓存(Page Cache): 操作系统在主存中维护一块区域,用来存储最近访问过的磁盘数据块(页)。当程序读文件时,操作系统会检查该文件对应的数据块是否在Page Cache中。如果在(缓存命中),直接从内存读取;如果不在(缓存未命中),则从磁盘读取到Page Cache,然后再提供给程序。写操作也可以先写入Page Cache(Write-Back Cache),然后再异步地写入磁盘。
- Web浏览器缓存: 浏览器会将你访问过的网页、图片、CSS文件等存储在你的本地硬盘上。当你再次访问同一个网站时,浏览器会检查本地缓存。如果资源没有过期,就直接从本地加载,而不是重新从网络下载,这大大加快了页面加载速度。
总结: 缓存通过存储常用数据的副本,利用局部性原理,显著加速了对数据的重复访问,是提高系统性能的关键技术。
3. 假脱机 (Spooling)
核心思想: 将多个用户的请求(通常是针对一个共享且慢速的输出设备)暂时存储在磁盘等高速存储介质上形成一个队列,然后由一个后台进程(Spooler)按照顺序将这些请求发送给实际设备。
工作机制:
Spooling,全称是 Simultaneous Peripheral Operations Online(联机同时外围操作)。它主要用于处理那些速度慢、不可共享(同一时间只能被一个用户使用)的设备,最典型的例子就是打印机。
- 提交任务: 当一个应用程序需要使用假脱机管理的设备(如打印机)时,它不会直接发送数据给设备,而是将要输出的数据(例如整个文档的打印内容)写入到磁盘上的一个特定区域,这个区域被称为假脱机区域,写入的文件称为假脱机文件或打印作业文件。
- 应用程序立即完成: 一旦应用程序成功将数据写入到假脱机文件,它就可以立即结束或继续执行其他任务,而无需等待打印机真正完成打印。
- 后台处理: 一个独立的系统进程(即假脱机程序或守护进程)持续监视假脱机区域。当它发现有新的假脱机文件时,就将其加入到设备的任务队列中。
- 按序执行: 假脱机程序按照队列的顺序,一个接一个地从假脱机文件读取数据,并将其发送给实际的慢速设备进行处理(如发送给打印机进行打印)。
如何提高I/O效率和实现解耦:
- 彻底解耦: 应用程序与慢速设备之间实现了完全解耦。应用程序只与磁盘上的假脱机区域交互,而无需关心设备的当前状态、速度或是否可用。它将耗时的设备操作“甩”给了后台的假脱机进程。
- 多用户共享: 多个用户或应用程序可以几乎同时地“使用”同一个设备。它们各自快速地将任务提交为假脱机文件,而无需等待设备空闲。假脱机程序在后台管理这些请求,确保它们按序得到服务。
- 平滑流量和速度匹配: 虽然缓冲区也做速度匹配,但假脱机更进一步,它利用了磁盘作为大容量缓冲区和队列管理器,能够处理来自多个源的大量突发请求,并将它们平滑地喂给慢速设备。
- 提高系统吞吐量: 由于应用程序不再需要等待慢速设备,CPU可以更快地切换到其他任务,提高了CPU的利用率和整个系统的吞吐量。
示例:
- 打印假脱机 (Print Spooling): 这是最经典的应用。当你点击“打印”时,你的文档内容会被写入一个打印队列文件到硬盘。Word或其他应用程序会立即返回,你可以继续编辑文档或做其他事情。操作系统的打印假脱机服务(Print Spooler)会在后台默默地将这个文件内容发送给打印机。如果多个人同时发送打印任务,它们的任务都会排队等候。
- 早期批处理系统: 在早期计算机中,输入(如打孔卡)和输出(如行式打印机)非常慢。为了提高效率,人们会将输入作业先通过脱机输入设备读到磁带或磁盘上(输入假脱机),然后计算机从磁带/磁盘读取并执行作业。作业的输出则先写到磁带/磁盘上(输出假脱机),再通过脱机输出设备打印出来。这就是假脱机概念的起源。
总结: 假脱机通过将慢速设备的请求排队到磁盘上,并由后台进程统一管理,实现了应用程序与设备的彻底解耦,并允许设备在多用户环境下被有效地共享。
三者比较与联系
- 共同点: 三者都利用了临时存储区域来处理数据,都在一定程度上缓解了CPU与慢速I/O设备的速度矛盾,并实现了不同程度的组件解耦。
- 主要区别:
- 缓冲 (Buffering): 主要用于平滑数据流、匹配速度,减少物理I/O次数。存储的是正在传输中的数据。机制相对简单。
- 缓存 (Caching): 主要用于加速对数据的重复访问,利用局部性原理存储数据 副本。需要复杂的替换策略来管理有限的缓存空间。
- 假脱机 (Spooling): 主要用于解耦应用程序与慢速共享设备,通过排队管理多个任务请求。存储的是完整的作业或请求。通常利用磁盘作为存储介质。
有时这些概念会结合使用。例如,假脱机系统在将数据发送给打印机时,可能会使用一个缓冲区来暂存数据块。磁盘缓存(Page Cache)本身就是一个缓存,但它存储的数据来自磁盘,而应用程序通过缓冲机制(例如标准的文件I/O库缓冲区)与Page Cache交互,Page Cache再与物理磁盘交互。
结论
缓冲、缓存和假脱机是现代操作系统中不可或缺的关键技术。它们并非仅仅是简单的临时存储,而是精心设计的机制,用于巧妙地管理CPU与I/O设备之间的速度差异,提高系统资源的利用率,增强系统的响应性,并实现各组件之间的有效解耦。正是这些技术的应用,使得我们能够高效地进行文件读写、流畅地进行网络通信、便捷地使用共享打印机,极大地提升了计算机系统的整体性能和用户体验。理解这些技术的工作原理,对于深入理解操作系统如何管理资源和优化性能至关重要。
相关文章:
八:操作系统设备管理之缓冲、缓存与假脱机
弥合鸿沟:操作系统中的缓冲、缓存与假脱机技术深度解析 在计算机系统的世界里,存在着一个根本性的速度差异:中央处理器(CPU)的执行速度飞快,而输入/输出(I/O)设备(如硬盘…...

Azure 虚拟机端口资源:专用 IP 和公共 IP Azure Machine Learning 计算实例BUG
## 报错无解 找不到Azure ML 计算实例关联的 NSG .env 文件和 ufw status: .env 文件中 EXPOSE_NGINX_PORT8080 是正确的,它告诉 docker-compose.yaml 将 Nginx 暴露在宿主机的 8080 端口。 sudo ufw status 显示 Status: inactive,意味着宿…...

Java核心技术-卷I-读书笔记(第十二版)
第一章 Java程序设计概述 09年sun被oracle收购->11年java7(简单改进)->14年java8(函数式编程)->2017年java9->2018年java11->2021年java17 第二章 Java编程环境 Java9后新增JShell,提供类似脚本试执…...
从C到C++语法过度1
从C到C语法过度1 文章目录 从C到C语法过度11. 字符串string2. 引用3. 类型转换3.1 新式转换 const_cast3.2 新式转换 static_cast 4. 关键字auto 1. 字符串string C语言从本质上来说,是没有字符串这种类型的,在C语言中如果要表达字符串,只能…...
AI是如何换装的?
AI换装是一种基于计算机视觉、深度学习和生成对抗网络(GAN)的技术,能够通过算法自动识别人像并更换服饰,实现虚拟换装的效果。这项技术广泛应用于电商服装试穿、虚拟偶像、影视特效、社交媒体滤镜等领域。 AI换装的核心技术 1. 图像分割与人体解析 换装的第一步是图像分…...

MATLAB遍历生成20到1000个节点的无线通信网络拓扑推理数据
功能: 遍历生成20到1000个节点的无线通信网络拓扑推理数据,包括网络拓扑和每个节点发射的电磁信号,采样率1MHz/3000,信号时长5.7s,单帧数据波形为实采 数据生成效果: 拓扑及空间位置: 节点电磁…...
python爬虫:grequests的详细使用(基于gevent和requests的异步HTTP请求库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、grequests 概述1.1 grequests 介绍1.2 注意事项1.3 替代方案比较1.4 基本组件1.5 grequests 安装二、基本用法2.1 创建请求任务2.2 发送请求并获取响应2.3 带参数的请求三、高级用法3.1 自定义回调函数3.2 设置超时…...
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
在使用PHP连接MySQL数据库时,可能会遇到连接失败和写锁问题。这类问题可能会影响应用的正常运行,本文将详细介绍排查和解决这些问题的方法。 一、PHP连接MySQL数据库失败 1. 排查连接失败的常见原因 数据库配置错误: 检查数据库主机、用户名…...

卫星接收天线G/T值怎么计算?附G/T计算excel表格链接
我们在进行无线通信链路设计时,都会涉及接收天线最重要的参数G/T。今天,咱们就来聊聊G/T值该怎么计算,计算过程中有哪些需要留意的地方,以及当你看到产品说明书中标注了G/T指标,还需要进一步了解哪些信息。 G/T的含义 …...

基于dify的营养分析工作流:3分钟生成个人营养分析报告
你去医院做体检,需要多久拿到体检报告呢?医院会为每位病人做一份多维度的健康报告吗?"人工报告需1小时/份?数据误差率高达35%?传统工具无法个性化? Dify工作流AI模型的组合拳,正在重塑健康…...
Kali Linux 安全工具解析
Kali Linux 安全工具解析 目录 Kali Linux 安全工具解析一、Kali Linux 概述1.1 核心特性1.2 系统要求 二、核心工具分类与实战应用2.1 信息收集工具2.1.1 Nmap2.1.2 Recon-ng2.1.3 theHarvester 2.2 漏洞利用工具2.2.1 Metasploit Framework2.2.2 SQLMap2.2.3 Burp Suite 2.3 …...
端午编程小游戏--艾草驱邪
刚刚过去的端午,参加了学校的一个活动,用python做了一个小游戏,当然这个小游戏还可以继续改进,可以加个bgm什么的...... 可以小玩一下 import pygame import random import math import sys import timepygame.init() pygame.mi…...

新成果:GaN基VCSEL动态物理模型开发
作为高速数据传输与光电信号处理的核心器件,垂直腔面发射激光器(VCSEL)在高速光通信、激光雷达等领域应用广泛,其动态特性直接关联器件调制速率及稳定性等关键参数。近期,天津赛米卡尔科技有限公司技术团队开发了GaN基…...
0x-4-Oracle 23 ai-sqlcl 25.1.1 独立安装-配置和优化
一、独立安装sqlcl 1. 安装 Java 环境 SQLcl 需要 Java 1.8.0_220 或更高版本, Oracle Linux9.6 上已经默认安装Oracle 23ai后Java 是11 lts版本 如果java jdk安装错误将遇上SQLcl困扰n多人的bug sql /nolog 错误:找不到或加载主类 oracle.dbto…...

Appium+python自动化(十一)- 元素定位- 下
1、 List定位 List顾名思义就是一个列表,在python里面也有list这一个说法,如果你不是很理解什么是list,这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合,那么他的个数也就成了不确定性,所以这里需要用复…...

免费批量PDF转Word工具
免费批量PDF转Word工具 工具简介 这是一款简单易用的批量PDF转Word工具,支持: 批量转换多个PDF文件保留原始格式和布局快速高效的转换速度完全免费使用 工具地址 下载链接 网盘下载地址:点击下载 提取码:8888 功能特点 ✅…...
OD 算法题 B卷【水果摊小买卖】
文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱,想做点水果买卖,给出两个数组m, n, m[i]表示第i个水果的成本价,n[i]表示第i个水果能卖出的价格;假如现在有本钱k,试问最后最多能赚多少钱࿱…...

Mac/iOS 如何解压 RAR 格式压缩包:常用工具与详细操作步骤
一、Mac 系统解压 RAR 文件之法 Mac 系统上解压 RAR 文件有多种方法,除了系统自带的一些简单功能外,还可以借助特定的软件来实现高效解压。以下将介绍几款常用工具的解压操作。 (一)解压专家解压步骤 解压专家 是一款在 Mac 和 …...
二进制安全-IDA Pro-API
idaapi 是 IDA Pro(Interactive Disassembler Professional) 反汇编工具的 Python API 接口,用于开发自动化脚本、插件和自定义分析工具。通过 idaapi,开发者可以访问 IDA Pro 的核心功能(如反汇编、符号分析、交叉引用…...

机器学习监督学习实战四:九种回归算法对波士顿房价数据进行回归预测和评估方法可视化
本项目代码在个人github链接:https://github.com/KLWU07/Machine-learning-Project-practice/tree/main 处理流程 1.导入波士顿房价数据集并进行预处理。2.使用 GradientBoostingRegressor 模型进行回归分析。3.通过交叉验证评估模型的性能,计算 MAE、…...
1. Web网络基础 - IP地址核心知识解析
深入解析IP地址与ipconfig命令:网络工程师的必备技能 在网络世界中,IP地址是设备通信的基石。本文将全面解析IP地址的核心概念,并通过ipconfig命令实战演示如何获取关键网络配置信息。 一、IP地址核心知识解析 1. IP地址的本质 定义&#x…...

微软重磅发布Magentic UI,交互式AI Agent助手实测!
微软重磅发布Magentic UI,交互式AI Agent助手实测! 何为Magentic UI? Magentic UI 是微软于5.19重磅发布的开源Agent助手,并于24日刚更新了第二个版本0.04版 从官方的介绍来看,目标是打造一款 以人为中心 的智能助手,其底层由多个不同的智能体系统驱动,能够实现网页浏览…...
c# 完成恩尼格玛加密扩展
c# 完成恩尼格玛加密扩展 恩尼格玛扩展为可见字符恩尼格玛的设备原始字符顺序转子的设置反射器的设置连接板的设置 初始数据的设置第一版 C# 代码第二版 C# 代码 总结 恩尼格玛 在之前,我们使用 python 实现了一版恩尼格玛的加密算法,但是这一版&#x…...
华为 “一底双长焦” 专利公布,引领移动影像新变革
6 月 6 日,国家知识产权局公布的一项专利发明申请吸引了众多目光,该专利发明人为华为技术有限公司,名为 “光学镜头、摄像头模组及电子设备” 。从展示的技术图来看,这一光学镜头呈现出独特的 “一底双镜头结构”,其中…...

老年生活照护实训室建设规划:照护质量评估与持续改进实训体系
随着人口老龄化程度的不断加深,老年生活照护需求日益增长,对专业照护人才的培养提出了更高要求。老年生活照护实训室建设方案作为培养高素质照护人才的重要载体,其核心在于构建科学完善的照护质量评估与持续改进实训体系。通过该体系的建设&a…...

【python深度学习】Day 48 PyTorch基本数据类型与操作
知识点: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,模型会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 作…...
Go深入学习延迟语句
1 延迟语句是什么 编程的时候,经常会需要申请一些资源,比如数据库连接、文件、锁等,这些资源需要再使用后释放掉,否则会造成内存泄露。但是编程人员经常容易忘记释放这些资源,从而造成一些事故。 Go 语言直接在语言层…...

【大模型】【推荐系统】LLM在推荐系统中的应用价值
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点B.4 两大推荐方法 C 模型结构C.1 知识蒸馏(训练过程)C.2 轻量推理(部署过程) D 实验设计E 个人总结 A 论文出处 论文题目:SLMRec:Distilling…...

uni-app学习笔记二十九--数据缓存
uni.setStorageSync(KEY,DATA) 将 data 存储在本地缓存中指定的 key 中,如果有多个key相同,下面的会覆盖掉原上面的该 key 对应的内容,这是一个同步接口。数据可以是字符串,可以是数组。 <script setup>uni.setStorageSyn…...
csharp基础....
int[][] jaggedArray new int[3][]; jaggedArray[0] new int[] { 1, 2 }; jaggedArray[1] new int[] { 3, 4, 5 }; jaggedArray[2] new int[] { 6, 7, 8, 9 }; 嵌套 反转和排序 List<int> list new List<int> { 1, 2, 3, 4, 5 }; list.Reverse(); Cons…...