<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>操作系统 on WishBottle</title><link>/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</link><description>Recent content in 操作系统 on WishBottle</description><generator>Hugo -- 0.156.0</generator><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/index.xml" rel="self" type="application/rss+xml"/><item><title>操作系统笔记：内存 (下)</title><link>/posts/%E5%86%85%E5%AD%983/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><guid>/posts/%E5%86%85%E5%AD%983/</guid><description>&lt;blockquote&gt;
&lt;p&gt;说明：本文为个人学习笔记，内容参考王道《操作系统》网课与配套讲义，按个人理解整理总结，仅用于学习交流，如有疏漏欢迎指正。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="内存空间的扩充"&gt;内存空间的扩充&lt;/h1&gt;
&lt;h2 id="覆盖"&gt;覆盖&lt;/h2&gt;
&lt;p&gt;为了解决程序大小超过物理内存总和的问题, 引入了覆盖技术&lt;/p&gt;
&lt;h3 id="思想"&gt;思想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将程序分为多个段(多个模块)&lt;/li&gt;
&lt;li&gt;常用的段常驻内存, 不常用的段在需要时调入内存&lt;/li&gt;
&lt;li&gt;内存中分为一个&amp;quot;固定区&amp;quot;, 和若干个&amp;quot;覆盖区&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;区域类型&lt;/th&gt;
&lt;th style="text-align: left"&gt;存放内容&lt;/th&gt;
&lt;th style="text-align: left"&gt;调度规则&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;固定区&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;程序中需要常驻的核心段&lt;/td&gt;
&lt;td style="text-align: left"&gt;调入后&lt;strong&gt;永久驻留&lt;/strong&gt;，仅在程序运行结束时才调出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;&lt;strong&gt;覆盖区&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left"&gt;不常用、非核心的功能段&lt;/td&gt;
&lt;td style="text-align: left"&gt;按需动态调度：&lt;strong&gt;用时调入，不用时调出&lt;/strong&gt;，可被其他段覆盖&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="例子"&gt;例子&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="/posts/%E5%86%85%E5%AD%983/Pasted%20image%2020260405142225.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注:&lt;/strong&gt; 在计算机里，&lt;strong&gt;“透明”= 用户完全不用管，系统自动帮你做好&lt;/strong&gt;。反过来，&lt;strong&gt;“不透明”= 用户必须手动操心、手动配置，系统不会自动帮你做&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="为什么这叫-不透明"&gt;为什么这叫 “不透明”？&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;现代虚拟内存（分页 / 分段）：&lt;strong&gt;程序员完全不用管内存&lt;/strong&gt;，写代码时默认 “内存无限大”，系统自动帮你换入换出，这就是透明。&lt;/li&gt;
&lt;li&gt;覆盖技术：&lt;strong&gt;程序员必须深度参与内存管理&lt;/strong&gt;，从拆分段、设计覆盖区、声明结构，到保证调用逻辑，全要手动搞定，系统只负责执行你写的规则，不会帮你做任何决策。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="交换"&gt;交换&lt;/h2&gt;
&lt;h3 id="思想-1"&gt;思想&lt;/h3&gt;
&lt;p&gt;内存空间紧张时，系统将内存中某些进程暂时换出外存，把外存中某些已具备运行条件的进程换入内存（进程在内存与磁盘间动态调度）&lt;/p&gt;
&lt;p&gt;在进程因为内存紧张被调出的时候, 进程的PCB需要留在内存(进入挂起队列), 即常驻内存, 这是因为在PCB中可以记录进程被调出到外存的具体位置&lt;br&gt;
暂时换出外存等待的进程状态为挂起状态&lt;/p&gt;
&lt;h3 id="问题"&gt;问题&lt;/h3&gt;
&lt;h4 id="1-应该在外存的什么位置保存被换出的进程"&gt;1) 应该在外存的什么位置保存被换出的进程?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在支持对换功能的操作系统中，磁盘空间会被划分为&lt;strong&gt;文件区&lt;/strong&gt;和&lt;strong&gt;对换区&lt;/strong&gt;两个独立部分，二者的管理逻辑完全围绕各自的核心目标设计。&lt;/li&gt;
&lt;li&gt;文件区主要用于存放各类持久化的用户文件与程序数据，核心追求是存储空间的利用率，因此采用离散分配的方式来减少空间浪费、提升存储效率&lt;/li&gt;
&lt;li&gt;而对换区仅占用磁盘的一小部分空间，专门用于临时存放被换出内存的进程数据，由于对换的 I/O 速度直接影响系统的整体运行效率，所以对换区的管理以换入换出速度为核心目标，通常采用连续分配的方式来减少磁盘寻道时间、提升读写效率，最终实现对换区的 I/O 速度远快于文件区，保障进程调度的高效性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-什么时候应该交换"&gt;2) 什么时候应该交换&lt;/h4&gt;
&lt;p&gt;交换通常发生在许多进程运行且内存吃紧时进行, 而系统负荷降低就暂停&lt;/p&gt;
&lt;h4 id="3-应该换出哪些进程"&gt;3) 应该换出哪些进程&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;可优先换出阻塞进程&lt;/li&gt;
&lt;li&gt;换出优先级低的进程&lt;/li&gt;
&lt;li&gt;为了防止优先级低的进程在被调入内存后很快又被换出, 有的系统还会考虑进程在内存的驻留时间(PCB常驻内存, 并不会被换出外存)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="虚拟存储技术"&gt;虚拟存储技术&lt;/h2&gt;
&lt;h3 id="传统存储管理方式的特征和缺点"&gt;传统存储管理方式的特征和缺点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一次性: 作业必须一次性全部装入内存后才能开始运行, 这会造成两个问题 :
&lt;ul&gt;
&lt;li&gt;作业很大时, 不能全部装入内存, 导致大作业无法运行&lt;/li&gt;
&lt;li&gt;当大量作业要求运行时, 由于内存无法容纳所有作业, 因此只有少量作业能运行, 导致多道程序并发度下降&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;驻留性: 一旦有作业被装入内存, 就会一直驻留在内存中, 直至作业运行结束. 事实上, 在一个时间段内, 只需要访问作业的一小部分数据即可正常运行, 这就会到时了内存中驻留大量的, 暂时用不到的数据, 造成内存资源浪费&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="虚拟内存的定义和特征"&gt;虚拟内存的定义和特征&lt;/h3&gt;
&lt;h4 id="定义"&gt;定义&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;程序装入时，仅将很快会用到的部分装入内存，暂时用不到的部分留在外存，程序即可开始执行。&lt;/li&gt;
&lt;li&gt;程序执行中，若访问的信息不在内存，由操作系统将所需信息从外存调入内存，再继续执行。&lt;/li&gt;
&lt;li&gt;若内存空间不足，由操作系统将内存中暂时用不到的信息换出到外存。&lt;/li&gt;
&lt;li&gt;在操作系统管理下，用户看来有一个比实际内存大得多的内存，这就是&lt;strong&gt;虚拟内存&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="特征"&gt;特征&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多次性&lt;/strong&gt;：无需在作业运行时一次性全部装入内存，允许被分成多次调入内存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对换性&lt;/strong&gt;：在作业运行时无需一直常驻内存，允许在作业运行过程中，将作业换入、换出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟性&lt;/strong&gt;：从逻辑上扩充了内存的容量，使用户看到的内存容量远大于实际的容量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="如何实现虚拟内存技术"&gt;如何实现虚拟内存技术&lt;/h3&gt;
&lt;p&gt;虚拟内存技术，允许一个作业分多次调入内存。如果采用连续分配方式，会不方便实现。因此，虚拟内存的实现需要建立在离散分配的内存管理方式基础上。&lt;/p&gt;</description></item><item><title>操作系统笔记：内存 (中)</title><link>/posts/%E5%86%85%E5%AD%982/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>/posts/%E5%86%85%E5%AD%982/</guid><description>&lt;blockquote&gt;
&lt;p&gt;说明：本文为个人学习笔记，内容参考王道《操作系统》网课与配套讲义，按个人理解整理总结，仅用于学习交流，如有疏漏欢迎指正。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="摘要"&gt;摘要&lt;/h2&gt;
&lt;p&gt;本文整理操作系统内存管理中三类经典机制与考点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本分页存储管理&lt;/strong&gt;：页表、地址变换、TLB、两级页表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基本分段存储管理&lt;/strong&gt;：段表、越界检查、分段与分页对比&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;段页式管理方式&lt;/strong&gt;：分段 + 分页结合后的地址转换&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="一基本分页存储管理"&gt;一、基本分页存储管理&lt;/h1&gt;
&lt;h2 id="1-概念"&gt;1. 概念&lt;/h2&gt;
&lt;p&gt;将内存空间分为一个个大小相等的分区，每个分区称为一个 &lt;strong&gt;“页框”&lt;/strong&gt;（页框 = 页帧 = 内存块 = 物理块 = 物理页面）。&lt;/p&gt;
&lt;p&gt;将进程的逻辑地址空间也分为与页框大小相等的一个个部分，每个部分称为 &lt;strong&gt;“页”/“页面”&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个页面有一个编号，称为 &lt;strong&gt;页号&lt;/strong&gt;（从 0 开始）&lt;/li&gt;
&lt;li&gt;操作系统以页框为单位为进程分配内存&lt;/li&gt;
&lt;li&gt;进程的各页面与内存页框存在映射关系&lt;/li&gt;
&lt;li&gt;各页面&lt;strong&gt;不必连续存放&lt;/strong&gt;，可装入不相邻页框中（离散分配）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了知道进程的每个页面在内存中存放的位置，操作系统要为每个进程建立一张页表（通常存放在 PCB 中）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个进程对应一个页表&lt;/li&gt;
&lt;li&gt;进程的每个页面对应一个页表项&lt;/li&gt;
&lt;li&gt;每个页表项由 “页号” 和 “块号” 组成（逻辑概念）&lt;/li&gt;
&lt;li&gt;页表记录页号与内存块号（页框号）的映射关系&lt;/li&gt;
&lt;li&gt;每个页表项的长度是一样的&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="11-每个页表项占多少字节"&gt;1.1 每个页表项占多少字节？&lt;/h3&gt;
&lt;p&gt;页表项逻辑上分为页号和块号，但通常只有 &lt;strong&gt;块号（以及控制位）&lt;/strong&gt; 真正占存储空间；页号可以隐含（类比数组下标）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：页表记录的是 &lt;strong&gt;内存块号&lt;/strong&gt;，而不是内存块的起始地址。&lt;br&gt;
&lt;code&gt;j&lt;/code&gt; 号内存块的起始地址 = &lt;code&gt;j × 内存块大小&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="2-地址转换"&gt;2. 地址转换&lt;/h2&gt;
&lt;h3 id="21-连续存储对比理解"&gt;2.1 连续存储（对比理解）&lt;/h3&gt;
&lt;p&gt;当进程在内存中连续存储时，重定位寄存器记录进程在内存中的起始位置，则：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;物理地址 = 逻辑地址 + 起始位置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="22-分页存储下的地址转换"&gt;2.2 分页存储下的地址转换&lt;/h3&gt;
&lt;p&gt;当使用分页存储时，若要访问逻辑地址 &lt;code&gt;A&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确定逻辑地址 &lt;code&gt;A&lt;/code&gt; 对应的 &lt;strong&gt;页号 &lt;code&gt;P&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;查页表找到 &lt;code&gt;P&lt;/code&gt; 号页面在内存中的起始位置（通过页框号计算）&lt;/li&gt;
&lt;li&gt;确定逻辑地址 &lt;code&gt;A&lt;/code&gt; 的 &lt;strong&gt;页内偏移量 &lt;code&gt;W&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此：&lt;/p&gt;</description></item><item><title>操作系统笔记：内存 (上)</title><link>/posts/%E5%86%85%E5%AD%981/</link><pubDate>Mon, 30 Mar 2026 00:00:00 -0700</pubDate><guid>/posts/%E5%86%85%E5%AD%981/</guid><description>&lt;blockquote&gt;
&lt;p&gt;说明：本文为个人学习笔记，内容参考王道《操作系统》网课与配套讲义，按个人理解整理总结，仅用于学习交流，如有疏漏欢迎指正。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="摘要"&gt;摘要&lt;/h2&gt;
&lt;p&gt;本文梳理操作系统内存管理中的几个核心概念：内存的作用、地址转换（装入与重定位）、链接方式、内存保护与连续分配策略，并对常见动态分区分配算法进行对比，理解碎片与紧凑的必要性。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="内存的作用"&gt;内存的作用&lt;/h2&gt;
&lt;p&gt;程序在执行前需要先装入内存，CPU 才能对其进行处理。内存的核心作用之一是&lt;strong&gt;缓和 CPU 与硬盘之间的速度矛盾&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;硬盘/外存先把即将使用的数据读取到内存；&lt;/li&gt;
&lt;li&gt;CPU 需要数据时直接访问内存，而不必反复访问硬盘；&lt;/li&gt;
&lt;li&gt;从而显著提升整体执行效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="地址转换装入与重定位"&gt;地址转换（装入与重定位）&lt;/h2&gt;
&lt;h3 id="1绝对装入absolute-loading"&gt;1）绝对装入（Absolute Loading）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;特点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;程序装入内存之前就确定装入位置，在编译阶段就把逻辑地址直接转换为最终物理地址。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;前提：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必须提前知道装入模块从哪个物理地址开始装入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;灵活性极差：装入位置变化会导致地址全部失效。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2静态重定位static-relocation"&gt;2）静态重定位（Static Relocation）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;特点：&lt;strong&gt;重定位过程在&lt;/strong&gt;装入时&lt;/strong&gt;完成。&lt;/p&gt;
&lt;p&gt;例：若装入起始物理地址为 &lt;code&gt;100&lt;/code&gt;，则所有与地址相关的值统一加上 &lt;code&gt;100&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;限制：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作业装入内存时一次性分配其所需全部空间；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行期间不可移动&lt;/strong&gt;（无法在内存中动态搬迁）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="3动态重定位dynamic-relocation现代-os-常用"&gt;3）动态重定位（Dynamic Relocation，现代 OS 常用）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;特点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编译/链接阶段仍使用&lt;strong&gt;逻辑地址&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;装入内存后&lt;strong&gt;不立即&lt;/strong&gt;把逻辑地址改写成物理地址；&lt;/li&gt;
&lt;li&gt;运行时由硬件机制完成转换。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关键硬件支持：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;重定位寄存器（Relocation Register）&lt;/strong&gt;：存放装入模块的起始物理地址（基址）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;地址转换：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU 执行时：&lt;code&gt;物理地址 = 逻辑地址 + 重定位寄存器(基址)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;优势：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;允许程序在内存中发生移动（更灵活，也更利于多道程序和内存紧凑）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="从写程序到程序运行以-c-语言为例"&gt;从写程序到程序运行（以 C 语言为例）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;编写源代码：生成 &lt;code&gt;*.c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;编译：生成目标模块 &lt;code&gt;*.o&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;链接：把多个目标模块 + 库函数链接成装入模块（可执行文件）&lt;code&gt;*.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;装入：把装入模块装入内存，此时确定其对应的实际物理地址范围&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="链接方式"&gt;链接方式&lt;/h2&gt;
&lt;h3 id="1静态链接"&gt;1）静态链接&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;在运行前&lt;/strong&gt;，把各目标模块及其所需库函数连接成一个完整可执行文件，之后不再拆分。&lt;/p&gt;
&lt;h3 id="2装入时动态链接"&gt;2）装入时动态链接&lt;/h3&gt;
&lt;p&gt;边装入边链接：装入模块进内存时再完成链接。&lt;/p&gt;
&lt;h3 id="3运行时动态链接"&gt;3）运行时动态链接&lt;/h3&gt;
&lt;p&gt;程序执行过程中，&lt;strong&gt;需要某个目标模块时才链接&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;便于修改、更新；&lt;/li&gt;
&lt;li&gt;便于实现对目标模块的共享（多个进程可共享同一模块）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="内存保护"&gt;内存保护&lt;/h2&gt;
&lt;h3 id="1设置上下限寄存器limit-registers"&gt;1）设置上下限寄存器（Limit Registers）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;上下限寄存器存放进程的地址范围（通常是物理地址上下界）。&lt;/li&gt;
&lt;li&gt;进程访问某地址时，CPU 检查是否越界，越界则触发异常。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2重定位寄存器--界地址寄存器"&gt;2）重定位寄存器 + 界地址寄存器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;重定位寄存器（基址）&lt;/strong&gt;：起始物理地址&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;界地址寄存器（界限/长度）&lt;/strong&gt;：进程最大逻辑地址（或逻辑地址范围大小）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;检查逻辑地址是否小于 &lt;code&gt; 界地址&lt;/code&gt;，通过后再做 &lt;code&gt;逻辑地址 + 基址&lt;/code&gt; 得到物理地址。&lt;/p&gt;</description></item><item><title>操作系统笔记：进程</title><link>/posts/%E8%BF%9B%E7%A8%8B/</link><pubDate>Tue, 24 Mar 2026 00:00:00 -0700</pubDate><guid>/posts/%E8%BF%9B%E7%A8%8B/</guid><description>&lt;blockquote&gt;
&lt;p&gt;说明：本文为个人学习笔记，内容参考王道《操作系统》网课与配套讲义，按个人理解整理总结，仅用于学习交流，如有疏漏欢迎指正。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="摘要"&gt;摘要&lt;/h2&gt;
&lt;p&gt;本文梳理操作系统中&lt;strong&gt;进程&lt;/strong&gt;的核心知识：进程的概念与特征、PCB 与组成结构、三态/五态模型、进程控制原语（创建、终止、阻塞与唤醒）以及进程通信方式（共享存储、消息传递、管道）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-进程的概念和特征"&gt;1. 进程的概念和特征&lt;/h2&gt;
&lt;h3 id="11-概念常见表述"&gt;1.1 概念（常见表述）&lt;/h3&gt;
&lt;p&gt;进程的典型定义：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进程是一个正在执行程序的实例。&lt;/li&gt;
&lt;li&gt;进程是程序及其数据从磁盘加载到内存后，在 CPU 上执行的过程。&lt;/li&gt;
&lt;li&gt;进程是一个具有独立功能的程序在一个数据集合上运行的过程。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="12-特征四个基本特征"&gt;1.2 特征（四个基本特征）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;动态性&lt;/strong&gt;：有产生、运行、消亡的过程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发性&lt;/strong&gt;：多个进程在一段时间内并发推进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立性&lt;/strong&gt;：进程是资源分配与调度的基本单位。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步性&lt;/strong&gt;：推进速度不可预知，需要同步机制保证正确性。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-进程的组成"&gt;2. 进程的组成&lt;/h2&gt;
&lt;p&gt;进程由三部分组成，其中最核心是 &lt;strong&gt;PCB（进程控制块）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PCB（Process Control Block）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;程序段&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据段&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;记忆点：&lt;strong&gt;PCB 是进程存在与管理的关键依据&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="3-进程的状态与转换"&gt;3. 进程的状态与转换&lt;/h2&gt;
&lt;p&gt;五种状态（前三种为基本状态）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;运行态（Running）&lt;/strong&gt;：占用 CPU，正在执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;就绪态（Ready）&lt;/strong&gt;：具备运行条件，仅缺 CPU，等待调度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阻塞态（Blocked/Waiting）&lt;/strong&gt;：等待事件/资源（除 CPU 外），暂停推进。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建态（New）&lt;/strong&gt;：正在创建，尚未进入就绪队列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;终止态（Terminated）&lt;/strong&gt;：正在结束并从系统消失。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="就绪态-vs-阻塞态"&gt;就绪态 vs 阻塞态&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;就绪态&lt;/strong&gt;：只缺 &lt;strong&gt;CPU&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阻塞态&lt;/strong&gt;：缺 &lt;strong&gt;事件/资源&lt;/strong&gt;（I/O、信号、锁、数据等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="31-三态模型"&gt;3.1 三态模型&lt;/h3&gt;
&lt;p&gt;&lt;img alt="三态模型" loading="lazy" src="/posts/%E8%BF%9B%E7%A8%8B/3.png"&gt;&lt;/p&gt;
&lt;h3 id="32-五态模型"&gt;3.2 五态模型&lt;/h3&gt;
&lt;p&gt;&lt;img alt="五态模型" loading="lazy" src="/posts/%E8%BF%9B%E7%A8%8B/5.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4-进程控制原语"&gt;4. 进程控制（原语）&lt;/h2&gt;
&lt;p&gt;操作系统中，进程控制常通过&lt;strong&gt;原语&lt;/strong&gt;实现。&lt;/p&gt;
&lt;p&gt;原语特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;执行期间不可中断&lt;/strong&gt;（原子性）&lt;/li&gt;
&lt;li&gt;通常在&lt;strong&gt;内核态&lt;/strong&gt;完成&lt;/li&gt;
&lt;li&gt;保证进程控制操作一致、正确&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="41-进程的创建create"&gt;4.1 进程的创建（Create）&lt;/h3&gt;
&lt;p&gt;父子进程关系：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建者为&lt;strong&gt;父进程&lt;/strong&gt;，被创建者为&lt;strong&gt;子进程&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;子进程可继承父进程部分资源；结束时资源归还父进程/系统&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建原语典型步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;分配 &lt;strong&gt;PID&lt;/strong&gt;，申请空白 &lt;strong&gt;PCB&lt;/strong&gt;（PCB 有限，失败则创建失败）。&lt;/li&gt;
&lt;li&gt;分配资源（内存、文件、I/O 设备、CPU 时间等）。&lt;/li&gt;
&lt;li&gt;初始化 PCB（标志信息、CPU 状态等），设置优先级等调度信息。&lt;/li&gt;
&lt;li&gt;插入&lt;strong&gt;就绪队列&lt;/strong&gt;，等待调度运行。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="42-进程的终止exit--terminate"&gt;4.2 进程的终止（Exit / Terminate）&lt;/h3&gt;
&lt;p&gt;终止原因：&lt;/p&gt;</description></item></channel></rss>