UNIX系统管理:内存管理机制

UNIX内存管理是内核最复杂的任务之一。重要因为它用到许多CPU提供的功能,而且和这些功能关系密切。因此,在我们讨论内存管理时,先要讨论CPU及其在内存管理中的作用。

1.受保护的编址方式

CPU执行的许多指令需要访问内存,看起来很简单,在机器代码指令中指定要提取或修改的内存单元的地址就行了。其实没有这么简单。当需要在内存中同时运行许多进程时,使每个进程都好像在它们自己的机器上运行一样就方便了。做到这一点的办法是在CPU内部完成不同形式的地址转换,将指令指定的地址(称为逻辑地址或有效地址)转换为硬件对实际内存的访问。进程按指令、数据和堆栈分成若干段每一段都有段描述符(segment descriptor)。每一段描述符包含8个字节。内容包括段开始的基地址、段的容量和段的访问权限。段的描述符集中放在段描述表中。一个CPU内部寄存器保存访问段描述符表的基地址。

除此之外,CPU还包含一组段寄存器。每个寄存器指向描述表中的一个段描述符项。如果发生了任何类型的内存访问,将选择一个CPU段寄存器(或者由访问内存的类型的隐含说明,或者由访问内存的指令的明确说明)用来进行地址计算。计算的结果得到线性地址。这里说得是每一次的内存访问,CPU都用一个内部寄存器的内容找到描述表的基地址。基地址和一个段寄存器的内容(它的最低3位的值为0)相加。相加的结果是指向描述符表的一个8字节的项的指针。注意:段的描述府项包含段在内存中的基地址,段的容量和对本段的访问权限。访问内存的指令本身也提供一个地址,这个地址是已取得段描述符的内存段内部的逻辑地址(或有效地址)。指令的逻辑地址和段的基地址相加得到线性地址。必须对线性地址进行检查,保证它落在段的范围内(不超过段的容量),并检查是否允许在段内进行请求的访问类型(读、写或执行)。如果这些检查被通过,CPU现在有了用来访问内存的地址。

我们已经看到的段描述符主表称为全程段描述表或者GDT,而指向GDT起点的CPU寄存器称为GDTR.在多任务环境中,可能愿意每个进程访问它自己的内存段。为满足这一要求,CPU也为每个进程提供另外一个描述符表,称为局部描述符表或者LDT,它通过GDT的项和处理机内部寄存器LDTR进行访问。

如果每次内存访问都要查找描述符表(它本身又在内存中)的值,这将消耗大量的CPU时间。为了大大加速这一过程,CPU内部有一些隐藏的,不能由程序直接访问的寄存器。这些寄存器用作快速缓存,保存当前每个段寄存器所指的段描述符的值。只有有关的段寄存器的值改变时,或者描述符表的GDTR或LDTR的基地址改变时,才用相应的段描述符值加载隐藏的寄存器。

&">nbsp;2.分页技术

在前面讨论的组织内存访问的功能的基础上,可以建立起一个完全切实可行的多任务系统。只要在开始运行时每个进程知道它实际需要的内存容量,一开始就可以为这一进程在合适的位置分配它所需的内存块。在进程存在期间也不用再改变内存的分配。然而,有些UNIX版本要比上面的简单模型更为灵活。例如,它允许进程不必考虑周围实际上还有其他的 进程存在的现实而增加它的内存要求。有的UNIX系统还允许同时运行比实际内存所能容纳的更多的进程。之所以能这样做,因为利用了处理机提供的分页(paging)功能。在CPU中是否进行调页由处理机控制寄存器中的1位来进行控制。如果调页位设置,32位的线性地址将一分为二。高20位用作页号,而低12位用作页内的位移地址。这表示32位的线性地址可以用来访问100万4KB页。分页所做的主要工作之一是将线性地址中提供的20位页号转换位对应于机器实际4KB内存页的另一个20位页号。结果是,任何实际4KB内存页可以出现在处理机线性地址空间的100万4KB页边界内的任何位置。地址变换用内存中的对照表完成,其中线性地址的高20位用作大的32位元素的数组的索引。从数组取得的32位值提供所需的20位转换值,其余12位则用来指定类似下面的一些事项:

本页允许读、写还是只允许读访问? 本页是用户进程访问页,还是管理进程访问页? 是否对任何页内地址进行了读或写访问? 是否对任何页内地址进行了写操作? 本页在内存中还是在
磁盘上?

用两级页表取代单个大的页表可以不必用很大的连续线性地址空间来保存页表,两级页表将线性地址空间的高20位划分为两个独立的10位值。CPU的3号控制寄存器包含内存中用作第一级页目录表的4KB的地址。每一4KB页分成1024项,每项占32位。线性地址中页号的前10位正好用来选择页表中的项。这样选出的32位包含20位实际页号,以及前面讨论过的12位。

段的增长

当你希望从包围在中间的内存段(segment)中提高内存容量时,分页技术显得特别重要。

交换

分页的另一个主要用途称为交换(swapping)。交换概念的实质在于允许在系统中同时运行比内存实际能容纳的更多的进程。这包括另外设置交换区(通常在磁盘上)作为内存的溢出区。当需要启动一个新的进程而内存中由没有足够的空间允许这样做时,将调用交换程序,它将选择内存中的一个或者几个新进程将它们写到交换区中,留出内存空间供新的进程装入和运行。当进程运行一段时间后,一些进程因等待输入/输出而挂起。另一些进程将结束,这就给交换出去的进程调回内存的机会(也可能将其他进程交换出去作为代价,使它们能继续执行下去。

利用分页技术实现了交换功能,表示不需要将整个进程交换到磁盘上,只要留出足够的页面供新的进程运行就行了。事实上,还有一种称为按需调页技术(demand paging)。为了实现按需调页技术,页表中的描述符项需要提供说明本页的内容是否实际装入内存的信息。由了这一信息,当CPU试图访问的页不在内存时,将产生异常信息(或称页面故障)。这一异常信息将导致执行异常处理程序,它将所需的页面装入实际内存。导致页面故障的指令将再次被执行,这一次它的内存访问将是成功的。

利用分页技术将新的进程装入内存是好的设想。出现的情况是当运行的进程试图在没有装入内存的地址上执行指令时,将出现页面故障,对它进行处理后,进程又可以继续执行下去。

对执行中的程序进行的研究发现:对一个适度大小的程序来讲,在任何特定的允许时刻,大部分代码并未得到执行。使用按需调页技术,它的含义在于当进程所需的页面调入之后,它将以少量的页面故障稳定允许一段时间,虽然它的大多数页面完全没有装入内存。即使特定的程序在运行时访问所有的程序页,但在任何时刻,在一段时间内进程只用其中少量的页面,所以,从资源利用的角度看,分页技术能取得很大的效益。

时间: 2024-09-28 23:24:12

UNIX系统管理:内存管理机制的相关文章

深入SQL SERVER 2000的内存管理机制(二)

server 深入SQL SERVER 2000的内存管理机制(二)     http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnsqldev/html/sqldev_01262004.asp   可访问大地址的应用 (Large-Address-Aware Executables) 在Windows增加支持/3GB参数以前,一个应用程序是无法访问一个带有高位设置的指针.一个32位的指针只有前31位地址空间可以被用户

深入理解Linux内存管理机制(一)

深入理解Linux内存管理机制(一)通过本文,您即可以: 1. 存储器硬件结构: 2.分段以及对应的组织方式: 3.分页以及对应的组织方式. 注1:本文以Linux内核2.6.32.59本版为例,其对应的代码可以在http://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.59.tar.bz2找到. 注2:本文所有的英文专有名词都是我随便翻译的,请对照英文原文进行理解. 注3:推荐使用Source Insig

【大数据/spark/tachyon】请问关于tachyon的内存管理机制和应用

问题描述 [大数据/spark/tachyon]请问关于tachyon的内存管理机制和应用 1.请问什么情况数据是确定放在内存的呢,我做loadufs操作从hdfs加载到tachyon的都是看到 not in memory 的,但是用spark textFile(tachyon://hostname:19998/test.txt)调用文件后,后来在web UI上又能看到有部分加载到内存了,比如 69% in memory, 然后saveAsTextFile(tachyon://hostname:

ARC内存管理机制详解

        ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数.有自动引用计数,那么就得有手动引用计数MRC(Mannul Reference Counting),前面已经提到过了MRC.那么在ARC模式下是不是意味着我们就可以一点也不用进行内存管理的呢?并不是这样的,我们还需要代码进行内存的管理.下面会结合着代码把OC中的ARC机制做一个详细的

[jjzhu学java]深入理解JVM笔记之内存管理机制

深入理解JVM笔记之内存管理机制 运行时数据区域 程序计数器 JVM栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 对象访问 OutOfMemoryError异常 Java堆溢出示例 JVM栈和本地方法栈溢出 运行时常量池溢出 本机直接内存溢出 深入理解JVM笔记之内存管理机制 运行时数据区域 程序计数器 每个线程都有一个程序计数器(PC),是当前线程所执行的字节码的行号指示器,通过改变程序计数器的值来选取下一条指令.各线程之间的计数器互不影响,是线程私有的内存. 如果线程执行的是一

Spark Tungsten in-heap / off-heap 内存管理机制

前言 发现目前还没有这方面的文章,而自己也对这块比较好奇,所以就有了这篇内容. 分析方式基本是自下而上,也就是我们分析的线路会从最基础内存申请到上层的使用.我们假设你对sun.misc.Unsafe 的API有一些最基本的了解.  in-heap 和 off-heap (MemoryAllocator) 首先我们看看 Tungsten 的 MemoryAllocator off-heap => org.apache.spark.unsafe.memory.UnsafeMemoryAllocato

iOS内存管理机制解析之MRC手动引用计数机制

前言: iOS的内存管理机制ARC和MRC是程序员参加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5以前 :MRC(手动引用计数) iOS 5及以后:ARC (自动引入计数) MRC机制时代 "谁开辟申请,谁及时合理释放" 面对自己申请的内存空间是要及时进行回收的: 不及时释放会造成什么结果? 对象存储在栈上,可能会大量的占用内存,内存不足造成程序闪退(也就是所说的内存泄露) 不合理释放

UNIX系统管理:管理交换分区

完成这一章,你能够做以下事情: 了解需求分页的概念. 了解物理内存,有效内存,和可锁定内存的含义. 确定系统中物理内存,有效内存,和可锁定内存的数目. 确定系统现有的和正在使用的交换区的数量. 在命令行中配置设备交换区. 在命令行中配置文件系统交换区. 取消交换分区. 选择文件系统交换分区和设备交换分区的时候需要考虑事项 11.1 系统内存 物理内存就是安装在你计算机中的随机存取存储器(RAM).在系统启动的时候,在系统控制台上会显示已安装的物理内存的数目: Physical: xxxxxxx

浅谈Linux的内存管理机制

一 物理内存和虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念. 物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space). 作为物理内存的扩展,linux会在物理内存不足时,使用交换