操作系统复习(八)
存贮管理的方式
操作系统的存储管理(内存管理)方法,核心目的是高效、安全地分配内存,并解决“多道程序如何共存”的问题。其演进主要分为连续分配、非连续分配和虚拟存储三大类别。
以下是各类方法的详细梳理:
一、连续分配方式(物理地址必须连续)
这是早期的分配方式,要求进程在内存中占据一片连续的空间。
- 单一连续分配:内存仅分给用户区(一个程序)和系统区。极简,无碎片,但内存利用率极低,仅适用于单任务系统。
- 固定分区分配:将用户内存划分为若干个固定大小的分区,每个分区装入一个程序。实现简单、开销小,但存在内部碎片(分区内未被用完的空间),且分区数量固定,并发度受限。
- 动态分区分配(可变分区):根据进程实际需求动态划分内存。无内部碎片,但会产生外部碎片(内存中无法利用的小空闲区)。为了解决碎片,需引入紧凑(拼接)技术,但会消耗大量CPU时间。常用分配算法有:首次适应(FF)、最佳适应(BF,会产生很多微小碎片)、最坏适应(WF)和邻近适应(NF)。
二、非连续分配方式(物理地址可以不连续)
允许进程的各个部分分散装入内存中不相邻的物理块,大幅提高内存利用率,是现代OS的基础。
- 分页存储管理:
- 核心:将进程逻辑空间和物理内存都划分为等大的页(Page)和页框(Frame)。通过页表将逻辑页号映射到物理块号。
- 特点:无外部碎片,仅有少量内部碎片(最后一页未满),地址转换依赖MMU(内存管理单元)。但页表本身可能占用较大内存(需用多级页表或快表TLB加速)。
- 分段存储管理:
- 核心:按照程序的自然逻辑结构(如代码段、数据段、堆栈段)划分,每段长度可变。地址由段号 + 段内地址组成,通过段表映射。
- 特点:方便共享和保护(按段设置权限),符合编程视角。但物理空间仍是连续的,会产生外部碎片,且段表查找开销较大。
- 段页式存储管理:
- 核心:结合分段和分页。用户程序先按逻辑分段,每段内部再分页。地址需经过“段表 (\rightarrow) 页表 (\rightarrow) 物理地址”的两次查找。
- 特点:兼具分段的逻辑性和分页的物理离散性(无外部碎片),但硬件支持复杂,查表开销最大。
三、虚拟存储管理(基于非连续 + 交换技术)
它打破了“程序必须全部装入内存才能运行”的限制,利用局部性原理,仅将当前需要的部分装入内存,实现了“小内存运行大程序”。
- 请求分页/分段管理:在基本分页/分段基础上增加了缺页/缺段中断功能和页面置换机制。
- 核心工作流程:当访问的页面不在内存时,系统产生缺页中断,从磁盘调入;若内存已满,则调用页面置换算法换出旧页。
- 关键算法:
- 最佳置换(OPT):理想标杆,无法实现。
- 先进先出(FIFO):简单但性能差,存在Belady异常(分配页框多反而缺页多)。
- 最近最久未使用(LRU):硬件支持,性能较好,但实现开销大。
- 时钟置换(CLOCK/NRU):折中方案,用访问位和修改位循环扫描,被广泛使用。
总结对比
| 管理方式 | 地址连续性 | 碎片问题 | 是否支持虚拟 | 主要缺点 |
|---|---|---|---|---|
| 连续分配 | 物理连续 | 有内/外部碎片 | 否 | 利用率低,紧凑开销大 |
| 纯分页 | 物理离散 | 仅有内部碎片 | 否(需全装入) | 页表大,缺乏逻辑保护 |
| 纯分段 | 物理连续(段内) | 有外部碎片 | 否(需全装入) | 碎片问题仍存在 |
| 段页式 | 物理离散 | 仅有内部碎片 | 否(需全装入) | 硬件开销最大,两次查表 |
| 请求分页/分段 | 物理离散 | 仅有内部碎片 | 是(核心) | 需处理缺页中断和置换开销 |
当前主流的通用操作系统(如 Linux、Windows)在底层物理内存管理上采用请求分页,而用户视角的模块管理借鉴分段思想(即段页式逻辑),配合复杂的页面置换算法来达到最佳性能。
RADI
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)的核心思想是:将多个独立的物理磁盘组合成一个逻辑磁盘,从而在性能、容量和可靠性三者之间取得不同的平衡。
它的本质是用“空间换安全”或“数量换速度”。以下是核心级别解析:
1. 基础三要素
- 条带化(Striping):将数据切割成小块,分散写入多块磁盘。提升速度(多盘并行读写),但无冗余。
- 镜像(Mirroring):数据在写入主盘的同时,完整复制一份到备份盘。提升可靠性(坏一块盘没事),但容量利用率仅50%。
- 校验(Parity):利用异或(XOR)算法,将校验码写入专用盘或分散在各盘中。当某块盘损坏时,可通过其他盘和校验码逆向计算恢复数据。兼顾容量和可靠性,但写入速度较慢。
2. 常用RAID级别详解
| 级别 | 实现方式 | 优点 | 缺点 | 最低盘数 | 核心用途 |
|---|---|---|---|---|---|
| RAID 0 | 条带化(数据均匀切分并同时读写) | 读写速度最快(理论提升N倍),容量100%利用 | 无任何容错,坏一块盘数据全毁 | 2块 | 追求极致性能的非关键数据(如游戏盘、视频剪辑缓存) |
| RAID 1 | 镜像(主盘和镜像盘完全一致) | 读取速度提升,容错性极强(允许坏N-1块盘) | 成本极高,容量利用率仅50%,写入速度无提升 | 2块 | 系统盘或对数据安全性要求极高的关键配置 |
| RAID 5 | 条带化 + 分布式校验(校验码轮流存储在各盘中) | 兼顾读写性能、容量与安全。容量 = (N-1)盘,允许坏1块盘 | 坏盘后重建时间极长(大数据量下很危险),写入有“写惩罚” | 3块 | 最主流的通用业务存储(如文件服务器、Web应用) |
| RAID 6 | 条带化 + 双校验(存储两份不同的校验码) | 极高容错,允许同时坏2块盘 | 写入速度慢(双校验计算量大),空间利用率更低(N-2)盘 | 4块 | 对数据安全极其苛刻的场景(如银行日志、数据库归档) |
| RAID 10 (1+0) | 先镜像(RAID 1),再条带(RAID 0) | 兼具高性能与高冗余,同时拥有RAID 0的速度和RAID 1的容错 | 成本最高,容量利用率仅50%,盘数必须为偶数 | 4块 | 顶级应用(金融交易、高并发数据库、核心企业级业务) |
3. 关键专业术语补充
- 写惩罚(Write Penalty):RAID 5/6 在写入小数据时,必须先读出旧数据、旧校验,再计算新校验,最后再写入数据+校验。这个过程涉及4次磁盘读写(读旧数据、旧校验、写新数据、新校验),导致写入速度严重下降。
- 重建风险(Rebuild Risk):RAID 5坏一块盘后,系统需用剩余盘全盘扫描计算并重建。此过程磁盘压力极大,若恰好在重建时另一块盘也坏了(或遇到不可恢复的静默错误),将直接导致整个阵列崩溃。
4. 现状:软件RAID vs 硬件RAID
- 硬件RAID:独立RAID卡+专用缓存,不占用CPU,性能稳定,带电池保护,是企业服务器标配。
- 软件RAID:操作系统层面实现(如Linux的
mdadm、Windows存储空间)。成本低、灵活,但消耗CPU资源。如今随着CPU性能过剩,软件RAID在云原生和普通服务器中越来越普及。
重要误区纠正
很多人误以为做了RAID就等于“备份”,这是错的。RAID只防“物理坏盘”,不防“逻辑灾难”(如误删文件、病毒加密、软件Bug覆盖数据)。因此,RAID + 定期离线备份才是数据安全的黄金法则。
SPOOLing系统
一、什么是SPOOLing系统?只是打印机的吗?
SPOOLing是Simultaneous Peripheral Operation On Line(联机外围设备同时操作)的缩写,通常译为“假脱机”。
它不仅仅是用于打印机的,但打印机是它最经典、最广为人知的应用场景。
- 核心思想:利用高速磁盘作为中间缓冲池(称为“输入井/输出井”),将一台独占设备(如打印机、读卡器)改造为逻辑上的共享设备。多个进程可以同时“使用”打印机,但实际上它们只是飞速地把数据写入磁盘的“输出井”,然后由系统后台进程(守护进程)按顺序慢慢从磁盘读取并送往打印机。
- 广泛应用:除了打印假脱机(Print Spooler),还包括电子邮件队列、网络数据包缓冲,以及大型机上的输入数据预读取等。
二、哪些程序执行时要访问“缓输出表”?
在SPOOLing系统中,“缓输出表”是一张核心管理表,专门用来记录输出井中各作业的状态、位置和属性(如作业ID、数据在磁盘上的存放地址、输出状态等)。
访问这张表的主要是两类程序:
1. 用户进程(或“输出请求生成模块”)
- 何时访问:当应用程序(如Word、记事本)执行打印操作时。
- 做什么:进程在系统调用的驱动下,先将打印数据高速写入磁盘的输出井。写入完成后,它需要访问“缓输出表”,在该表中登记或新增一条记录,注明“我的数据在磁盘的X位置,当前状态为‘待输出’”。
- 作用:完成逻辑上的“输出”动作,释放CPU,进程不再被阻塞。
2. 缓输出程序(即“输出守护进程 / Spooling输出进程”)
- 何时访问:系统后台周期性运行,或在CPU空闲时触发。
- 做什么:它定时扫描或查询“缓输出表”,查找表中状态为“待输出”的记录。
- 后续动作:找到待输出的作业后,它根据表中记录的磁盘地址,从输出井读取数据,并实际发送给物理打印机。打印完成后,它会再次访问缓输出表,将该条目的状态更新为“已完成”,或将该记录从表中删除,释放磁盘空间。
总结:
访问“缓输出表”的是发出打印请求的用户进程(用来写表登记作业)和负责物理打印的后台守护进程(用来查表调度作业并更新状态)。