Skip to content

Commit c434e44

Browse files
authored
Merge pull request #202 from OSLearning365/main
补充示意图
2 parents 97f52a6 + e51fcf9 commit c434e44

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+198
-2
lines changed

source/chapter4/2address-space.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010

1111
为了发挥上述硬件机制的能力,操作系统也需要升级自己的能力,更好地管理物理内存和虚拟内存,并给应用程序提供统一的虚拟内存访问接口。计算机科学家观察到这些不同硬件中的共同之处,即 CPU 访问数据和指令的内存地址是虚地址,通过硬件机制(比如 MMU +页表查询)进行地址转换,找到对应的物理地址。为此,计算机科学家提出了 **地址空间(Address Space)** 抽象,并在内核中建立虚实地址空间的映射机制,给应用程序提供一个基于地址空间的安全虚拟内存环境,让应用程序简单灵活地使用内存。
1212

13+
.. image:: address-general.png
14+
:align: center
15+
:scale: 45 %
16+
:name: Address General
17+
:alt: 地址空间示意图
18+
1319
本节将结合操作系统的发展历程回顾来介绍地址空间抽象的实现策略是如何变化的。
1420

1521
虚拟地址与地址空间

source/chapter4/7more-as.rst

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@
8484

8585
覆盖技术是指一个应用程序在执行过程中,其若干程序段分时共享同一块内存空间。覆盖技术的大致思路是编写一个应用程序,把它分为若干个功能上相对独立的程序段(函数集合),按照其逻辑执行结构,这些程序段不会同时执行。未执行的程序段先保存在存储设备上,当有关程序段的前一部分执行结束后,把后续程序段和数据调入内存,覆盖前面的程序段和数据。
8686

87+
.. image:: overlay-tech.png
88+
:align: center
89+
:scale: 45 %
90+
:name: Overlay Technology
91+
:alt: 覆盖技术示意图
92+
8793
覆盖技术需要程序员在编写应用程序时,来手动控制和管理何时进行覆盖,不同程序段的覆盖顺序,以及覆盖的具体空间位置。这虽然减少了应用程序在执行过程中对内存空间的需求,当对应用程序开发者的编程水平提出了很高的要求,而且通用性比较差。
8894

8995
内存交换
@@ -97,6 +103,12 @@
97103

98104
我们目前的操作系统还没实现这种技术,但不妨碍我们思考一下这种技术面临的问题和大致解决方法。在我们之前设计实现的批处理操作系统中,每次执行新应用时,需要把刚执行完毕的老应用所占内存空间给释放了,再把新应用的代码和数据换入到内存中。这是一种比较原始的应用之间交换地址空间(Swap Address Space)的方法。这种交换技术的方法也可进一步扩展用到多任务操作系统中,即把不常用或暂停的任务在内存中的代码和数据换出(Swap Out)存储设备上去。
99105

106+
.. image:: swap-tech.png
107+
:align: center
108+
:scale: 32 %
109+
:name: Swap Technology
110+
:alt: 交换技术示意图
111+
100112
首先是交换的时机,即何时需要发生交换?当一个任务在创建或执行过程中,如果内存不够用了,操作系统就需要执行内存交换操作。
101113

102114
第二个需要考虑的是交换的对象,即交换哪个任务?如果是一个刚创建的任务,在创建过程中内存不够用了,我们可以基于某种选择策略(如选择占用内存最多的那个任务)选择一个任务,把它所占用的内存换出到存储设备中,形成更多的空闲空间,直到被创建任务有足够的空间开始执行。如果是一个正在执行的当前任务动态需要更多的内存空间,操作系统有两种选择,一个选择与刚才的处理方式类似,找一个其他任务,并把其所占空间换出到存储设备中,从而满足当前任务的需要。另一个选择是把当前任务给暂停了(甚至有可能把它所占空间换出到存储设备上),然后让其他任务继续执行,并在执行完毕后,空出所占用的内存,并切换到下一个新任务执行,如果新任务在存储设备上,还需把新任务的代码和数据换入到内存中来;如果空闲内存能够满足被暂停的任务的内存分配需求,则唤醒该任务继续执行。
@@ -219,13 +231,25 @@ FIFO置换策略
219231

220232
FIFO置换策略虽然在实现上简单,但它对页访问的局部性感知不够,及时某页被多次访问,也可能由于它较早进入内存而被置换出去。
221233

234+
.. image:: fifo-strategy.png
235+
:align: center
236+
:scale: 45 %
237+
:name: FIFO-swap-technology
238+
:alt: FIFO置换策略示意图
239+
222240
LRU置换策略
223241
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
224242

225243
LRU(Least Recently Used,最近使用最少)置换策略是一种基于历史来预测未来的置换策略,其基本思路是:操作系统替换的是最近最少使用的虚拟页。“最近”是一个时间维度的量,表示过去的一段时间。精确地说,过去的这段时间是从程序开始执行到当前程序产生“Page Fault”异常的时间片段。虚拟页被访问的近期性(Recency)表示页被访问到目前产生异常这段时间的长短。这段时间越长,页被访问的近期性越弱,最弱即最近使用最少;反之,近期性就强。
226244

227245
访存的近期性是一种历史信息,也是程序局部性的一种体现,因为越近被访问过的页,也许在不久的将来再次被访问的可能性也就越大。所以LRU置换策略是一种以历史来预测未来的启发式方法。在一般情况下,对于具有访存局部性的应用程序,LRU置换策略的效果接近最优置换策略的效果。
228246

247+
.. image:: lru-strategy.png
248+
:align: center
249+
:scale: 37 %
250+
:name: LRU-swap-technology
251+
:alt: LRU置换策略示意图
252+
229253
为了实现LRU置换策略,操作系统需要记录应用程序执行过程中的访存历史信息,这在实际实现上是一个挑战。LRU置换策略需要记录应用访问的每页的最后一次被访问的时间。这样,当一个页必须被替换时,该策略就选择最长时间没有被使用的页。
230254
这里的难点是如何准确记录访存的时间信息。我们可以想象一下,通过扩展硬件和软件功能的软硬结合的方式来记录:
231255

@@ -260,6 +284,11 @@ Clock置换策略
260284

261285
这种近似LRU策略类似时钟旋转的过程,所以也称为Clock(时钟,也称 Second-Chance 二次机会 )置换策略。虽然Clock置换策略不如LRU置换策略的效果好,但它比不考虑历史访问的方法要好,且在一般情况下,与LRU策略的结果对比相差不大。
262286

287+
.. image:: clock-strategy.png
288+
:align: center
289+
:scale: 32 %
290+
:name: Clock-swap-technology
291+
:alt: CLOCK置换策略示意图
263292

264293
时钟置换策略的一个小改进,是进一步额外关注内存中的页的修改情况。这样做的原因是:如果页已被修改(modified,也称 dirty),称为脏页,则在释放它之前须将它的更新内容写回交换区,这又增加了一次甚至多次缓慢的I/O写回操作。但如果它没有被修改(clean),就称为干净页,可以直接释放它,没有额外的I/O写回操作。因此,操作系统更倾向于先处理干净页,而不是脏页。
265294

@@ -280,6 +309,12 @@ Clock置换策略
280309

281310
所以,工作集置换策略的目标就是动态调整工作集的内容和大小,一个任务占用的页面数接近其工作集大小,减少缺页异常次数。
282311

312+
.. image:: workingset-strategy.png
313+
:align: center
314+
:scale: 40 %
315+
:name: Workingset-swap-technology
316+
:alt: 工作集置换策略示意图
317+
283318
实现工作集置换策略的基本思路是,操作系统能及时跟踪任务执行中位于工作集中页面,然后在发生缺页异常或过了一段时间间隔时,淘汰一个不在工作集中的页面,如果缺页异常就换入位于交换区中的页。
284319

285320
实现工作集置换策略的调整是及时获取工作集信息。有了工作集的定义并不意味着存在一种工程上可接受的有效方法,能够在程序运行期间及时准确地计算出工作集。
@@ -305,6 +340,12 @@ Clock置换策略
305340

306341
要得到缺页率的精确值比较困难,主要是访存次数难以精确统计。我们可以采用一种近似的方法来表示缺页率。从上次缺页异常时间Tlast 到现在缺页异常时间Tcurrent 的时间间隔作为缺页率的当前指标。并用一个经验值Ts表示适中的缺页率。
307342

343+
.. image:: page-fault-rate-strategy.png
344+
:align: center
345+
:scale: 28 %
346+
:name: PageFaultRate-swap-technology
347+
:alt: 缺页率置换策略示意图
348+
308349
这样,缺页率置换策略的基本思路就是:在任务访存出现缺页时,首先计算从上次缺页异常时间Tlast 到现在缺页异常时间Tcurrent 的时间间隔。然后判断,如果 Tcurrent – Tlast > Ts, 则置换出在 [Tlast , Tcurrent ] 时间内没有被引用的页,并增加缺失页到工作集中;如果 Tcurrent – Tlast ≤ Ts, 则只增加缺失页到工作集中。
309350

310351
在上述思路描述中,
331 KB
Loading

source/chapter4/clock-strategy.png

394 KB
Loading

source/chapter4/fifo-strategy.png

114 KB
Loading

source/chapter4/lru-strategy.png

193 KB
Loading

source/chapter4/overlay-tech.png

179 KB
Loading
227 KB
Loading

source/chapter4/swap-tech.png

1.08 MB
Loading
283 KB
Loading

0 commit comments

Comments
 (0)