第8章 内存Word格式.docx

上传人:b****5 文档编号:15766125 上传时间:2022-11-16 格式:DOCX 页数:36 大小:205.35KB
下载 相关 举报
第8章 内存Word格式.docx_第1页
第1页 / 共36页
第8章 内存Word格式.docx_第2页
第2页 / 共36页
第8章 内存Word格式.docx_第3页
第3页 / 共36页
第8章 内存Word格式.docx_第4页
第4页 / 共36页
第8章 内存Word格式.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

第8章 内存Word格式.docx

《第8章 内存Word格式.docx》由会员分享,可在线阅读,更多相关《第8章 内存Word格式.docx(36页珍藏版)》请在冰豆网上搜索。

第8章 内存Word格式.docx

)最大的差距体现在最后两个:

RAM和磁盘上,它们又分别可被称作主存和辅存。

额外附加的存储器空间总是十分诱人的,即使它们也很慢。

如果在RAM被用完时,通过暂时把不用的代码和数据转移到磁盘上以腾出更多空间的方法来使用磁盘代替RAM的话,那将是很好的一件事情。

正如读者可能已经知道的,Linux恰好能够做到这一点,这被称之为虚拟内存(virtualmemory)。

虚拟内存是一种对RAM和磁盘(或称之为:

主存和辅存)进行无缝混合访问的技术。

所有这些(虚拟)内存对于应用程序来说就好像它真的存在一样。

当然我们知道它并非真的内存,这正是为什么它被称为是“虚拟的”,但是多亏了内核使得应用程序无法分辨出它们的区别。

对于应用程序来说,就好像真的有很大数量的RAM,只不过有时候比较慢而已。

术语“虚拟内存”还有另外一层意思,从严格意义来讲是与前述的第一种意思没有关系的。

这里的虚拟内存指的是对进程驻留地址进行欺骗的方法。

每个进程都会有这样一种错觉,认为它的地址是从0开始并由此连续向上发展的。

很明显,这一点同时对所有进程都成立是不可能的,但是在生成代码的时候这个假定(fiction)却能够带来很大方便,这是由于进程不必知道它们是否真正从0地址开始驻留,而且它们也不必去关心此事。

这两种意思也不必相关,因为一个操作系统从理论上可以给每个进程分配一个独有的逻辑地址空间而不用混合使用主存和辅存。

然而在所有我已经知道的系统中(对这两种虚拟内存的实现方式)要么都采纳要么都不采纳,这一点可能会在开始时令人感到困惑。

为了避免这种意义上的分歧,有人倾向于术语“虚拟内存”代表逻辑地址空间(logical-address-space)的意义,同时使用“分页(paging)”或“交换”表示磁盘作为内存使用(disk-as-memory)的含义。

尽管这种严格的区分具有充足的理由,但是我更喜欢普通的用法。

除非上下文要求,否则我很少花费精力对它们进行区分。

HardDisk

10GB

9ms

RAM

96MB

70ns

On-chip

(L2)cache

256K

20ns

(L1)cache

16K

9ns

Registers

32bytes

图8-1具有速度和容量的存储级别

交换和分页

早期的虚拟内存(VM)系统仅能够把整个应用程序代码和数据,即完整的进程从磁盘上移出或移入磁盘。

这种技术被称为交换(swapping),因为它是把一个进程同另一个进程进行了对调。

出于这个原因,磁盘上为VM所保留的区域通常被称为交换空间(swapspace),或简称为交换区(swap),尽管如我们所见,现代的系统已不再使用这种最初意义上的交换技术。

与此类似,读者通常会见到的术语是交换设备(swapdevice)和交换分区(swappartition),它是磁盘分区的同义词,但是被专门作为交换空间使用,以及术语交换文件(swapfile),这是一个用于交换的规则的、有固定长度的文件。

交换是很有用的,当然要比根本没有VM好的多,但是它也有一定局限性。

首先,交换需要把整个进程同时调入内存,所以当运行一个需要比系统所有RAM还要大的存储空间的进程时,交换便于事无补了,即使磁盘有大量空间可供补充。

其次,交换可能会很低效。

交换就必须把整个进程同时调出,这就意味着为了2K的空间你不得不把一个8MB的进程整个调出。

同样的道理,即使仅仅需要执行被调进的应用程序代码的一小部分,你也必须把整个进程同时调进。

分页(paging)是把系统的内存划分成很小的块,即页面,每个页面可以独立的从磁盘调入或调出磁盘。

分页与交换技术相似,但它使用更加细小的粒度(granularity)。

分页比交换有更多的登记(book-keeping)开销,这是因为页面数远比进程数要多,然而通过分页可以获得更多的灵活性。

而且分页也更快一些,原因之一就是不再需要把整个进程调进调出,而只需要交换必要的页面就足够了。

要记住前述的1000倍的速度差异,所以我们应该尽可能避免磁盘的I/O操作。

传统上特定平台上页面的大小是固定的,比如x86平台为4K,这可以简化分页操作。

不过,大多数CPU为可变大小的页面提供硬件支持,通常能够达到4M或者更大。

可变大小页面可以使分页操作执行更快和更有效,不过要以复杂性为代价。

标准发行的Linux内核不支持可变大小页面,所以我们仍然假定页面大小是4K。

(已经有支持Cyrix可变大小页面机制的补丁程序,但它们不是本书中官方发行版本的部分。

而且据闻由此获得的性能增益也并不非常显著。

因为分页可以完成交换所能完成的所有工作,而且更加有效,所以类似于Linux一样的现代操作系统已不再使用交换,严格的说是只使用分页技术。

但是术语“交换”已得到了广泛使用,以至于实际应用中术语“交换”和“分页”已经几乎可以通用;

由于内核使用分页技术,所以本书就遵从这种用法。

Linux能够交换到一个专用磁盘分区、或一个文件,或是分区和文件的不同组合。

Linux甚至允许在系统运行时增加和移去交换空间,当你暂时需要额外大量的交换空间,或者假如你发现需要额外交换空间而又不想重启系统的时候,这就会很有用了。

另外,与一些Unix的风格(flavors)不同,Linux即使没有任何交换空间也能运行得很好。

地址空间

地址空间(addressspace)是一段表示内存位置的地址范围。

地址空间有三种:

●物理地址空间

●线性地址空间

●逻辑地址空间,也被称为虚拟地址空间

(需要指出的是,I/O地址能够被看作是第四种地址空间,但是本书中对其不作讨论。

物理地址是一个系统中可用的真实的硬件地址。

假如一个系统有64M内存,它的合法地址范围是从0到0x4000000(以十六进制表示)。

每个地址都对应于所安装的SIMMs中的一组晶体管,而且对应于处理器地址总线上的一组特定信号。

分页可以在一个进程的生存期里,把它或它的片段移入或者移出不同的物理内存区域(或不同物理地址)。

这正是进程被分配一个逻辑地址空间的原因之一。

就任何特定的进程来说,从0开始扩展到十六进制地址0xc0000000共3GB的地址空间是绰绰有余的。

即使每个进程有相同的逻辑地址空间,相应进程的物理地址也都是不同的,因此它们不会彼此重叠。

从内核的角度看来,逻辑和物理地址都被划分成页面。

因此,就像我们所说的逻辑和物理地址一样,可以称它们为逻辑和物理页面:

每个合法的逻辑地址恰好处于一个逻辑页面中,物理地址也是这样的。

与之相反,线性地址通常不被认为是分页的。

CPU(实际是下文中的MMU)会以一种体系结构特有的方式把进程使用的逻辑地址转换成线性地址。

在x86平台上,这种转换是简单地把虚拟地址与另一地址,即进程的段基址相加;

因为每个任务的基址都被设置为0,所以在这种体系结构中,逻辑地址和线性地址是相同的。

得到的线性地址接着被转换成物理地址并与系统的RAM直接作用。

内存管理单元

在逻辑地址和物理地址之间相互转换的工作是由内核和硬件内存管理单元(MMU—memorymanagementunit)共同完成的。

MMU是被集成进现代的CPU里的,它们都是同一块CPU芯片内的一个部分,但是把MMU当作一个独立的部分仍然非常有益。

内核告诉MMU如何为每个进程把某逻辑页面映射到某特定物理页面,而MMU在进程提出内存请求时完成实际的转换工作。

当地址转换无法完成时,比如,由于给定的逻辑地址不合法或者由于逻辑页面没有对应的物理页面的时候,MMU就给内核发出信号。

这种情况称为页面错误(pagefault),本章后面会对此进行详细论述。

MMU也负责增强内存保护,比如当一个应用程序试图在它的内存中对一个已标明是只读的页面进行写操作时,MMU就会通知OS。

MMU的主要好处在于速度。

缺少MMU时为了获得同样的效果,OS将不得不使用软件为每个进程的每一次内存引用进行校验,这种校验同时包括数据和指令在内,而这可能还包括要用为进程创建其生存所需的虚拟机。

(Java所进行的一些工作与此类似。

)这样做的结果将使系统慢得令人无法忍受。

但是一个以这种内存访问合法性检查方式集成在计算机硬件里的MMU却根本不会使系统变慢。

在MMU建立起一个进程以后,内核就只是偶尔参与工作,例如在发生页面错误时,而这与全部内存引用数量相比是非常少的。

除此而外,MMU还可以协助保护内存自身。

没有MMU,内核可能不能够防止一个进程非法侵入它自己的内存空间或者是其它进程的内存空间。

但是如何避免内核也会作同样的操作呢?

在Intel’s80486或更新的芯片上(不是80386),MMU的内存保护特性也适用于内核进程。

页目录和页表

在x86体系结构上,把线性地址(或者逻辑地址——记住在Linux上,这二者具有相同的值)解析(resolving)到物理地址分为两个步骤,整个过程如图8-2所示。

提供给进程的线性地址被分为三个部分:

一个页目录索引,一个页表索引和一个偏移量。

页目录(pagedirectory)是一个指向页表的指针数组,页表(pagetable)是一个指向页面的指针数组,因此地址解析就是一个跟踪指针链的过程。

一个页目录使你能够确定一个页表,继而得到一个页面,然后页面中的偏移量(offset)能够指出该页面里的一个地址。

为了进行更详细因而也会更准确的描述:

给定页目录索引中的页目录项保存着贮存在物理内存上的一个页表地址;

给定页表索引中的页表项保存着物理内存上相应物理页面的基地址;

然后线性地址的偏移量加到这个物理地址上形成最终物理页面内的目的地址。

其它CPU使用三级转换方法,如图8-3所示。

这在64位体系中尤其有用,以Alpha为例,其更大的64位的地址空间意味着类似于x86体系的地址转换将要求大量的页目录、大量页表、大量偏移量,或三者兼有。

对于这种情况,Alpha的设计者们向线性地址模式中引入了另一层次,即Linux所称的页面中间目录(pagemiddledirectory),它位于页目录和页表之间。

这个方案与以前实际是一样的,只不过多增加了一级。

这种三级转换方法同样具有页目录,页目录的每一项包含一个页面中间目录的入口地址,页面中间目录的每一项包含一个页表的入口地址,而页表也同以前一样每一项包含物理内存中一个页面的地址,这个地址再加上偏移量就得到了最终的地址。

而使情况更为复杂的是,通过进一步观察可知,三部分地址模式与两级地址转换是相关联的,而四部分地址模式则与三级地址转换相关联的,这是由于我们通常所说的“级(或层次levels)”不包括索引到页目录的第一步(我想是因为这一步没有进行转换的缘故)。

令人奇怪的是内核开发者们决定只用其中一种模式来处理问

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1