📄 chapter6.htm
字号:
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”或者简称为“</SPAN>ASID<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”)。每个进程里的任何地址都在暗中被进程的</SPAN>ASID<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">扩展后产生一个唯一的待转换地址。</SPAN>ASID<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要在进程被新调度执行时装入</SPAN>CPU<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个寄存器,使得硬件可以来使用它。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射机制还令操作系统能够把用户空间的不同部分区分对待:应用程序的某些空间(一般是代码部分)被映射为只读,而其它某些部分则可以暂不映射并且对其访问能引起“陷入”(</SPAN>trapped<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">),这意味着一个胡乱运行的程序可以更早被停住。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN
style="mso-tab-count: 1"> </SPAN><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进程地址空间中的内核部分通常是被所有进程共享的,而且这一部分绝大多数内容映射为常驻的操作系统代码和数据。由于这些代码连接为在这些地址运行,不需要灵活的映射机制,大部分</SPAN>MIPS<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上运行的内核会把它们的绝大部分代码置于这块在这一体系结构里具有固定映射的地址空间中。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"> <O:P> </O:P></P>
<P class=MsoNormal><SPAN
style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt">6.1.3</SPAN><SPAN lang=ZH-CN
style="FONT-SIZE: 14pt; FONT-FAMILY: SimSun; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页映射最佳</SPAN><SPAN
style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt"><O:P> </O:P></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了映射地址人们尝试过很多特殊办法,通常使用“基地址</SPAN>/<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">范围”二元组来保证地址的正确性。然而如果以提供给程序恰好其所需大小的内存的方式来进行内存映射,尽管这很明显为应用程序提供了最优服务,却会迅速导致可用内存变为零散的具有难以使用的大小的内存碎块。所有的实际系统都对内存以页(</SPAN>page<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,一种固定大小的内存块)进行映射。页通常是</SPAN>2<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的幂次大小,</SPAN>4K<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大小得到了压倒性优势的使用频率。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN>4K<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的情况下,一个</SPAN>CPU<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地址可以简单的映射为这样:</SPAN></P>
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><IMG height=49 src=""
width=355 v:shapes="_x0000_i1026"></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">“页内地址”(图中</SPAN>Address
within page<SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部分)的几位不需要转译,因此内存管理器件只需要去处理地址高位的转译,即把通常称作“虚页号”(图中</SPAN>Virtual
page number<SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,简称</SPAN>VPN<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)的部分转译为实际物理地址的高位(即</SPAN>physical
frame number<SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,或简称</SPAN>PFN<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,没人能想得起来为啥不叫</SPAN>PPN<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"> <O:P>
</O:P></P>
<P class=MsoNormal><SPAN
style="FONT-SIZE: 14pt; mso-bidi-font-size: 12.0pt">6.1.4 </SPAN><SPAN
lang=ZH-CN
style="FONT-SIZE: 14pt; FONT-FAMILY: SimSun; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们真正想要的</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射机制必须使一个程序能断言某个地址在其自己的进程空间或地址空间内,并且能够高效的将其转换为真实的物理地址以访问内存。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个好主意是使用一个含有整个空间内所有页的入口(</SPAN>entry<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)的表(即页表),每个入口包含这个页的正确物理地址。这很明显是个相当大的数据结构,因而不得不存放于主存之中。不过这带来两个严重问题。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一,每次取出或存入数据我们都需要访问两次内存,就性能而言这显然是没什么好指望的。大概您已预见到这样一个答案:我们可以使用一个快存(</SPAN>cache<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)来存储这些入口,仅仅在我们未命中快存时才去访问常驻内存的表。由于每个快存的入口覆盖了</SPAN>4KB<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内存空间,我们似乎可以就这样得到一块未命中率出奇低而自身又相当小的快存。(现在要介绍一下,快存很稀少而且有时被称作“查找缓存”(</SPAN>lookaside
buffers<SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">),因此内存转译快存就被称作“转译查找缓存”(</SPAN>translation
lookaside buffers<SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)或简称为</SPAN>TLB<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">;这个缩写更加常用)。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第二个问题是页表的大小;对一个划分为</SPAN>4KB<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大小页面的</SPAN>32<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位应用程序的空间,将产生</SPAN>100<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">万个入口,这会占去将近</SPAN>4MB<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内存。我们有必要找些办法让这个表小一点,否则就剩不下多少内存给程序使用了。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们将在这样一个前提下讨论不同的解决方案:真实运行中的程序会在地址空间中留有巨大的地址空洞,如果我们能有一种方法,避免用物理内存来存储表中的这些空洞,情况看上去会好的多。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在我们有解决办法了,本质上,这来自于</SPAN>DEC<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN>VAX<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">小型机上所使用的内存转译系统,它给绝大多数的并发体系结构带来了深远的影响。图</SPAN>6-2<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中对其做了概括。</SPAN></P>
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><IMG height=477
src="" width=449 v:shapes="_x0000_i1027"></P>
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><B><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图</SPAN>6.2<O:P>
</O:P></B></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">硬件的处理过程大致上是这样的:</SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 63pt; TEXT-INDENT: -21pt; mso-list: l13 level1 lfo4; tab-stops: list 63.0pt"><SPAN
style="FONT-FAMILY: Wingdings">n<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个虚地址被分割为两部分,低半部分地址位(通常为</SPAN>12<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位)不经转译直接通过,因此转译结果总是落在一个页内(通常</SPAN>4KB<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大小)。</SPAN></P>
<P class=MsoNormal
style="MARGIN-LEFT: 63pt; TEXT-INDENT: -21pt; mso-list: l13 level1 lfo4; tab-stops: list 63.0pt"><SPAN
style="FONT-FAMILY: Wingdings">n<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN><SPAN lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高半部分地址位,也就是</SPAN>VPN<SPAN
lang=ZH-CN
style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,会在前面拼接上当前运行进程的</SPAN>ASID<SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -