内存分页
内存分页机制

内存分页机制
一、内存分页机制
内存分页机制是一种内存管理机制,它的主要作用是将内存空间进行划分,每个划分出来的内存空间称为一个页,每个页的大小相同,以方便管理和使用内存。
内存分页机制能够有效地提高内存空间的利用率,减少碎片化现象,增强系统的可靠性和安全性,并提高系统性能。
二、物理地址映射
内存分页机制的运行依赖于物理内存空间的地址映射,即将虚拟地址映射到物理地址的过程,这样实现操作系统对物理内存的控制。
地址映射的基本规则也是内存分页机制的基础,通过这一机制,内存分页机制能够实现将内存空间进行划分,实现虚拟内存空间管理。
三、进程的内存划分
内存分页机制通过将进程的内存空间进行划分,以满足需求,可以将进程的内存按照代码段、数据段、示例数据段等进行划分,也可以根据进程在内存中的使用状况,将其划分成活动页、非活动页等。
四、内存置换机制
内存置换机制是内存分页机制的重要组成部分,它是操作系统用于控制内存空间的重要组成部分。
内存置换机制的目的是在物理内存中运行的进程小于物理内存容量时,可以将部分进程从物理内存中移动到外存中,以便腾出内存空间,从而防止内存溢出。
五、总结
内存分页机制是一种有效的内存管理机制,它根据物理内存空间的地址映射,将内存分页,从而有效地提高内存空间的利用率,减少碎片化现象,增强系统的可靠性和安全性,并提高系统性能,是进程内存空间管理的重要机制。
操作系统中虚拟内存的管理

操作系统中虚拟内存的管理在使用操作系统时,我们经常会涉及到虚拟内存的概念。
虚拟内存是一种通过硬盘来扩展计算机的物理内存,让计算机看起来拥有更多的内存空间,从而提升计算机的运行效率。
虚拟内存的管理是操作系统中非常重要的一部分,下面就来介绍一下操作系统中虚拟内存的管理。
一、内存分页内存分页是指将整个物理内存分成多个大小相同的分页,每个分页的大小通常为4KB或8KB。
然后将每个进程的虚拟内存也分成多个相同大小的虚拟页面,每个虚拟页面映射到一个物理页面。
这样一来,进程就可以按照页面单位来管理内存。
当进程访问一个虚拟页面时,操作系统会根据虚拟页面的映射关系,将其转换为物理页面并读取其内容。
如果虚拟页面没有被映射到物理页面,那么操作系统就需要将一个空闲的物理页面映射到该虚拟页面上,并将其内容从硬盘中读取进来。
二、页面置换随着进程的运行,部分物理页面会被频繁使用,而另一部分页面则很少使用甚至没有使用过。
为了更好地利用内存空间,操作系统需要对页面进行置换。
页面置换算法的目标是在物理页面不足时,寻找最适合置换出去的物理页面,并将其替换成要使用的新页面。
常见的页面置换算法有FIFO、LRU、Clock和Random等。
其中,FIFO算法是按照物理页面被加载的时间顺序来置换的,即最先加载进来的页面最先被置换出去。
LRU算法则是按照物理页面最近被使用的时间顺序来置换的。
这样,被最少使用的页面就会被优先置换出去,从而留出更多的页面空间给新页面使用。
三、页面缓存为了提高读取速度,操作系统会将最近使用的物理页面缓存到内存缓存区中,以便下一次访问时能够更快地读取。
而当物理页面不足时,操作系统也会优先将内存缓存区中的页面置换出去,以腾出空间给其他页面使用。
四、页面共享有些进程可能会需要共享同一个物理页面,以节省内存空间并提高系统性能。
比如多个进程在同时运行相同的程序时,它们所使用的代码部分可以共享同一个物理页面,减少了内存开销。
内存分页的概念

内存分页的概念内存分页是在计算机内存管理中的一个重要概念,它是一种将主存分成小块,用来存储操作系统和其他应用程序所需数据的方法。
每个小块都被称为“页”,并且每页大小都是固定的。
在内存分页中,程序的地址空间也被分成同样大小的页面。
内存分页的优势在于,它可以让操作系统更有效地使用内存。
当一个程序被加载到内存中时,它不一定要占用连续的内存空间,而是可以被分成许多大小相等的页面。
这些页面可以放置在任何可用的内存块中,从而最大程度地利用内存的空间。
内存分页还有另一个优势,就是它可以避免内存碎片。
内存碎片是指,当多个程序从内存中删除之后,内存中会留下不连续的小块,这些小块太小无法再用来存储大的程序。
而通过内存分页,所有的程序都会被分成小块,如果一个程序被删除,它的页也会被删除,而这些空闲的页可以被其他程序使用,避免了内存碎片。
在内存分页中,每个页面都有一个唯一的编号,用来标识该页面。
这个编号被称为“页框号”,它相当于一个二进制数的地址。
当一个程序被加载到内存中时,它的不同部分被映射到不同的页面中,从而形成一个页面表。
页面表记录了每个页面的页框号和该页面所属的程序。
由于页面表很长,每次访问内存时都要查找页面表,这将导致内存访问速度变慢。
为了解决这个问题,使用了一种叫做“快表”的机制。
快表是一个相对较小的页面表,它存储了最近访问的页面,从而提高内存访问速度。
内存分页的另一个问题是,当一个程序需要访问一个不在内存中的页面时,系统必须从硬盘上加载这个页面,这将导致较长的延迟。
为了解决这个问题,引入了页面置换算法,以便按需地将页面从内存中删除。
页面置换算法有很多种,其中常见的有FIFO算法、最近最少使用算法、最少使用算法等。
FIFO算法是最简单的页面置换算法,它把最先进入内存的页面置换出去。
最近最少使用算法是根据页面最近被访问的时间来决定置换的页面。
最少使用算法是根据页面的使用次数来决定页面淘汰的顺序。
总之,内存分页是一个重要的内存管理概念,它能够让操作系统更好地管理内存,提高内存使用效率。
分页、分段与段页式存储

分页、分段与段页式存储⼀. 分页存储管理1.基本思想⽤户程序的地址空间被划分成若⼲固定⼤⼩的区域,称为“页”,相应地,内存空间分成若⼲个物理块,页和块的⼤⼩相等。
可将⽤户程序的任⼀页放在内存的任⼀块中,实现了离散分配。
1) 等分内存页式存储管理将内存空间划分成等长的若⼲物理块,成为物理页⾯也成为物理块,每个物理块的⼤⼩⼀般取2的整数幂。
内存的所有物理块从0开始编号,称作物理页号。
2) 逻辑地址系统将程序的逻辑空间按照同样⼤⼩也划分成若⼲页⾯,称为逻辑页⾯也称为页。
程序的各个逻辑页⾯从0开始依次编号,称作逻辑页号或相对页号。
每个页⾯内从0开始编址,称为页内地址。
程序中的逻辑地址由两部分组成:页号P和页内位移量W。
在执⾏⼀个程序之前,内存管理器需要的准备⼯作:1) 确定程序的页数2) 在主存中留出⾜够的空闲页⾯3) 将程序的所有页⾯载⼊主存⾥。
(静态的分页,页⾯⽆需连续)2. 分页存储管理的地址机构页号x位,每个作业最多2的x次⽅页,页内位移量的位数表⽰页的⼤⼩,若页内位移量y位,则2的y次⽅,即页的⼤⼩,页内地址从000000000000开始到2的y次⽅若给定⼀个逻辑地址为A,页⾯⼤⼩为L,则页号P=INT[A/L],页内地址W=A MOD L3.内存分配相邻的页⾯在内存中不⼀定相邻,即分配给程序的内存块之间不⼀定连续。
对程序地址空间的分页是系统⾃动进⾏的,即对⽤户是透明的。
由于页⾯尺⼨为2的整数次幂,故相对地址中的⾼位部分即为页号,低位部分为页内地址。
4. 页表分页系统中,允许将进程的每⼀页离散地存储在内存的任⼀物理块中,为了能在内存中找到每个页⾯对应的物理块,系统为每个进程建⽴⼀张页表,⽤于记录进程逻辑页⾯与内存物理页⾯之间的对应关系。
页表的作⽤是实现从页号到物理块号的地址映射,地址空间有多少页,该页表⾥就登记多少⾏,且按逻辑页的顺序排列,形如:5. 地址变换页式虚拟存储系统的逻辑地址是由页号和页内地址两部分组成,地址变换过程如图7-3所⽰。
c分页实现方式

c分页实现方式
在 C 语言中,实现分页有多种方式,下面介绍两种常见的方法:
1. 固定大小的分页:
- 定义一个结构体来表示页,包含页的内容和一些元数据,如页号和页内偏移量。
- 分配一个大的缓冲区来存储所有的页。
- 在需要分页时,将数据按照固定大小分成若干页,存储在缓冲区中。
- 通过页号和页内偏移量来访问指定的页。
2. 动态分页:
- 定义一个结构体来表示页,包含页的内容和一些元数据,如页号和页内偏移量。
- 在需要分页时,动态分配每页的内存。
- 将数据存储在分配的页内存中。
- 通过页号和页内偏移量来访问指定的页。
无论使用哪种方式,都需要考虑以下几个方面:
1. 页的大小:根据实际需求和内存情况,选择合适的页大小。
2. 页的管理:需要维护页的元数据,如页号、页内偏移量等。
3. 数据的存储和访问:需要根据页号和页内偏移量来存储和访问数据。
4. 内存管理:在动态分页中,需要注意内存的分配和释放。
这两种方式只是基本的示例,实际的分页实现可能会根据具体需求进行一些优化和扩展。
希望我的回答能够帮助到你,如果你还有其他疑问,请随时向我提问,我将尽力为你解答。
操作系统——页式存储管理

操作系统——页式存储管理分区式存储管理最⼤的缺点是碎⽚问题严重,内存利⽤率低。
究其原因,主要在于连续分配的限制,即它要求每个作⽤在内存中必须占⼀个连续的分区。
如果允许将⼀个进程分散地装⼊到许多不相邻的分区中,便可充分地利⽤内存,⽽⽆需再进⾏“紧凑”。
基于这⼀思想,产⽣了“⾮连续分配⽅式”,或者称为“离散分配⽅式”。
连续分配:为⽤户进程分配的必须是⼀个连续的内存空间。
⾮连续分配:为⽤户进程分配的可以是⼀些分散的内存空间。
分页存储管理的思想:把内存分为⼀个个相等的⼩分区,再按照分区⼤⼩把进程拆分成⼀个个⼩部分。
分页存储管理分为:实分页存储管理和虚分页存储管理⼀、实分页式存储管理实分页式存储最⼤的优点是内存利⽤率⾼,与⽬前流⾏的虚分页存储管理相⽐,具有实现简单,程序运⾏快的优点。
⽬前,飞速发展的硬件制造技术使得物理内存越来越⼤,因此我们认为,实分页式存储管理将是⼀种最有发展前途的存储管理⽅式。
1.1、基本原理假设⼀个⼤型饭店,所有的客房都是标准的双⼈间,部分客房已经住进客⼈,现在⼜有⼀个旅游团要求⼊住。
接待员统计了⼀下,对旅游团领队说:“贵团全体成员都能住下,两⼈⼀个房间,但是不能住在同⼀楼层了,因为每层空着的客房不够,更没有⼏个挨着的。
请原谅!”。
对于这样的安排,⼀般⼈不会感到奇怪。
因为旅游团本来就是由⼀位位个⼈或夫妻等组成的,⽽饭店的客房本来也是两⼈⼀间的,两⼈⼀组正好可住在⼀个客房⾥;另外,饭店⼏乎每天都有⼊住的和退房的客⼈,想在同⼀楼层找⼏间挨着的客房实在不容易。
①将整个系统的内存空间划分成⼀系列⼤⼩相等的块,每⼀块称为⼀个物理块、物理页或实页,页架或页帧(frame),可简称为块(block)。
所有的块按物理地址递增顺序连续编号为0、1、2、……。
这⾥的块相当于饭店的客房,系统对内存分块相当于饭店把⼤楼所有的客房都设计成标准的双⼈间。
②每个作业的地址空间也划分成⼀系列与内存块⼀样⼤⼩的块,每⼀块称为⼀个逻辑页或虚页,也有⼈叫页⾯,可简称为页(page)。
内存管理的名词解释

内存管理的名词解释1.引言在计算机科学中,内存管理是一个重要且复杂的领域,它涉及到如何有效地分配、使用和释放计算机的内存资源。
本文将深入探讨内存管理的重要概念和术语,并解释它们的含义和作用。
2.虚拟内存虚拟内存是一种内存管理技术,它允许操作系统将物理内存和磁盘空间结合起来,以扩展计算机的可用内存。
通过虚拟内存,每个进程都可以拥有自己的虚拟内存空间,而不受物理内存大小的限制。
该技术通过将内存中的数据分割成固定大小的块,称为页面,以实现对内存的动态分配。
3.物理内存物理内存是计算机中实际存在的内存,它包括RAM(Random Access Memory,随机存取存储器)和ROM(Read-Only Memory,只读存储器)等。
操作系统通过内存管理器来分配和回收物理内存,以满足程序的需求。
物理内存的大小直接影响到计算机的性能,如果内存不足,系统可能会变得缓慢或不稳定。
4.分页分页是一种内存管理技术,它将进程的虚拟内存空间划分为固定大小的页面,并将这些页面映射到物理内存的页面帧上。
分页的好处是可以更高效地使用内存空间,同时也能够有效地隔离各个进程的内存,提高系统的安全性。
5.分段分段是一种内存管理技术,它将进程的虚拟内存空间划分为多个段,如代码段、数据段、堆段和栈段等。
每个段具有不同的大小和属性,它们被映射到物理内存的连续区域中。
分段的好处是可以为不同的程序段提供不同的访问权限和保护级别,提高系统的可靠性和安全性。
6.内存分配内存分配是指将可用的内存资源分配给进程或程序使用。
在操作系统中,内存管理器负责处理内存分配请求。
常见的内存分配算法包括首次适应算法、最佳适应算法和最坏适应算法等。
内存分配的目标是尽可能高效地利用内存资源,同时确保进程之间不会发生冲突或互相访问彼此的内存。
7.内存回收内存回收是指在进程完成后将其使用的内存资源释放回操作系统,以便其他进程可以使用。
内存管理器负责跟踪和记录已分配的内存块,并在进程结束时将其标记为可用状态。
分页方法命名

分页方法命名(原创版3篇)目录(篇1)1.引言2.分页方法的定义和分类3.分页方法的命名规则4.常见分页方法的示例与比较5.总结正文(篇1)【引言】在计算机编程中,分页方法是一种将大量数据分割成合适大小的小块以便于处理的技术。
合理的分页方法可以提高程序的执行效率,降低系统资源的消耗。
为了更好地理解和应用分页方法,我们需要先了解它们的命名规则以及常见的分类。
【分页方法的定义和分类】分页方法,顾名思义,是指将数据按照一定的规则进行分割,以便于存储和处理。
根据分页的实现方式,我们可以将分页方法分为两大类:静态分页和动态分页。
静态分页是指在程序编译期间就确定好数据的分页方式,优点是执行效率高,缺点是灵活性较差,无法根据实际运行情况进行调整。
动态分页则是在程序运行期间根据实际情况进行分页,优点是灵活性高,缺点是执行效率较低。
【分页方法的命名规则】分页方法的命名规则通常包括以下几个部分:分页方式、分页间隔、分页偏移。
- 分页方式:指数据按照哪种方式进行分页,例如线性分页、二维分页等。
- 分页间隔:指分页后每个页面的大小,通常是一个固定的数值。
- 分页偏移:指分页的起始位置,通常是一个偏移量或者索引。
【常见分页方法的示例与比较】常见的分页方法包括线性分页、二维分页、树形分页等。
- 线性分页:是最简单的分页方法,将数据按照一定的间隔进行分割。
优点是简单易懂,缺点是当数据量较大时,效率较低。
- 二维分页:也称为横纵分页,将数据按照行和列进行分割。
优点是能够充分利用存储空间,缺点是实现较为复杂。
- 树形分页:将数据按照树状结构进行分页。
优点是能够动态调整,缺点是实现较为复杂,且容易发生外部碎片。
【总结】分页方法是计算机编程中常用的数据处理技术,合理的分页方法能够提高程序的执行效率,降低系统资源的消耗。
目录(篇2)1.引言2.分页方法的概念和分类3.分页方法的命名规则4.常见分页方法的示例5.总结正文(篇2)【引言】在编程领域,分页方法是一种常用的数据处理技术,它可以将大量的数据分割成较小的、易于处理的部分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. Linear Space & Physical Space在硬件工程师和普通用户看来,内存就是插在或固化在主板上的内存条,它们有一定的容量——比如64 MB。
但在应用程序员眼中,并不过度关心插在主板上的内存容量,而是他们可以使用的内存空间——他们可以开发一个需要占用1 GB内存的程序,并让其在OS平台上运行,哪怕这台运行主机上只有128 MB的物理内存条。
而对于OS开发者而言,则是介于二者之间,他们既需要知道物理内存的细节,也需要提供一套机制,为应用程序员提供另一个内存空间,这个内存空间的大小可以和实际的物理内存大小之间没有任何关系。
我们将主板上的物理内存条所提供的内存空间定义为物理内存空间;将应用程序员看到的内存空间定义为线性空间。
物理内存空间大小在不同的主机上可以是不一样的,随着主板上所插的物理内存条的容量不同而不同;但为应用程序员提供的线性空间却是固定的,不会随物理内存的变化而变化,这样才能保证应用程序的可移植性。
尽管物理内存的大小可以影响应用程序运行的性能,并且很多情况下对物理内存的大小有一个最低要求,但这些因素只是为了让一个OS可以正常的运行。
线性空间的大小在32-bit平台上为4 GB的固定大小,对于每个进程都是这样(一个应用可以是多进程的,在OS眼中,是以进程为单位的)。
也就是说线性空间不是进程共享的,而是进程隔离的,每个进程都有相同大小的4 GB线性空间。
一个进程对于某一个内存地址的访问,与其它进程对于同一内存地址的访问绝不冲突。
比如,一个进程读取线性空间地址1234ABCDh可以读出整数8,而另外一个进程读取线性空间地址1234ABCDh可以读出整数20,这取决于进程自身的逻辑。
在任意一个时刻,在一个CPU上只有一个进程在运行。
所以对于此CPU 来讲,在这一时刻,整个系统只存在一个线性空间,这个线性空间是面向此进程的。
当进程发生切换的时候,线性空间也随着切换。
所以结论就是每个进程都有自己的线性空间,只有此进程运行的时候,其线性空间才被运行它的CPU所知。
在其它时刻,其线性空间对于CPU来说,是不可知的。
所以尽管每个进程都可以有4 GB的线性空间,但在CPU 眼中,只有一个线性空间的存在。
线性空间的变化,随着进程切换而变化。
尽管线性空间的大小和物理内存的大小之间没有任何关系,但使用线性空间的应用程序最终还是要运行在物理内存中。
应用所给出的任何线性地址最终必须被转化为物理地址,才能够真正的访问物理内存。
所以,线性内存空间必须被映射到物理内存空间中,这个映射关系需要通过使用硬件体系结构所规定的数据结构来建立。
我们不妨先称其为映射表。
一个映射表的内容就是某个线性内存空间和物理内存空间之间的映射关系。
OS Kernel一旦告诉某个CPU一个映射表的位置,那么这个CPU 需要去访问一个线性空间地址时,就根据这张映射表的内容,将这个线性空间地址转化为物理空间地址,并将此物理地址送到地址线,毕竟地址线只知道物理地址。
所以,我们很容易得出一个结论,如果我们给出不同的映射表,那么CPU 将某一线性空间地址转化的物理地址也会不同。
所以我们为每一个进程都建立一张映射表,将每个进程的线性空间根据自己的需要映射到物理空间上。
既然某一时刻在某一CPU上只能有一个应用在运行,那么当任务发生切换的时候,将映射表也更换为响应的映射表就可以实现每个进程都有自己的线性空间而互不影响。
所以,在任意时刻,对于一个CPU 来说,也只需要有一张映射表,以实现当前进程的线性空间到物理空间的转化。
--------------------------------------------------------------------------------2. OS Kernel Space & Process Space由于OS Kernel在任意时刻都必须存在于内存中,而进程却可以切换,所以在任意时刻,内存中都存在两部分,OS Kernel和用户进程。
而在任意时刻,对于一个CPU来说只存在一个线性空间,所以这个线性空间必须被分成两部分,一部分供OS Kernel使用,另一部分供用户进程使用。
既然OS Kernel在任何时候都占用线性空间中的一部分,那么对于所有进程的线性空间而言,它们为OS Kernel所留出的线性空间可以是完全相同的,也就是说,它们各自的映射表中,也分为两部分,一部分是进程私有映射部分,对于OS Kernel映射部分的内容则完全相同。
从这个意义上来说,我们可以认为,对于所有的进程而言,它们共享OS Kernel所占用的线性空间部分,而每个进程又各自有自己私有的线性空间部分。
假如,我们将任意一个4 GB线性空间分割为1 GB的OS Kernel 空间部分和3 GB的进程空间部分,那么所有进程的4 GB线性空间中1 GB的OS Kernel空间是共享的,而剩余的3 GB进程空间部分则是各个进程私有的。
Linux就是这么做的,而Windows NT则是让OS Kernel 和进程各使用2 GB线性空间。
--------------------------------------------------------------------------------3. Segment Mapping & Page Mapping所有的线性空间的内容只有被放置到物理内存中才能够被真正的运行和操作。
所以,尽管OS Kernel和进程都被放在线性空间中,但它们最终必须被放置到物理内存中。
所以OS Kernel和所有的进程都最终共享物理内存。
在现阶段,物理内存远没有线性空间那么大——线性空间是 4 GB,而物理内存空间往往只有几百兆,甚至更小。
另外即使物理内存有4 GB,但由于每个进程都可以有3 GB线性空间(假如进程私有线性空间是3 GB的话),如果把所有进程的线性空间内容都放在物理内存中,明显是不现实的。
所以OS Kernel必须将某些进程暂时用不到的数据或代码放在物理内存之外,将有限的内存提供给当前最需要的进程。
另外,由于OS Kernel在任何时候都有可能运行,所以OS Kernel最好被永远放在物理内存中。
我们仅仅将进程数据进行换入换出。
从线性空间到物理空间的映射需要映射表,映射表的内容是将某段线性空间映射到相同大小的物理内存空间上。
从理论上,我们可以使用两种映射方法:变长映射,和定长映射。
变长映射指的是根据不同的需要,将一个一个变长段映射到物理内存上,其格式可以如下(线性空间段起始地址,物理空间段起始地址,段长度)。
假如一个进程有3个段:10M 的数据段,5M的代码段,和8K的堆栈段,那么就可以在映射表中建立3项内容,每一项针对一个段。
这看起来没有问题。
但假如现在我们的实际的内存只有32M,其中10M被内核占用,留给进程的物理空间只有22M,那么此进程在运行时,就占据了10M+5M+8K的内存空间。
随后当进程发生切换时,假如另一个进程和其有相同的内存要求,那么剩余的22M-(10M+5M+8K)明显就不够用了,这时只能将原进程的某些段换出,并且必须是整段的换出。
这就意味着我们必须至少换出一个10M的数据段,而换出的成本很高,因为我们必须将这10M的内容拷贝到磁盘上,磁盘I/O是很慢的。
所以,使用变长的段映射的结果就是一个段要么被全部换入,要么被全部换出。
但在现实中,一个程序中并非所有的代码和数据都能够被经常访问,往往被经常访问的只占全部代码数据的一部分,甚至是一小部分。
所以更有效的策略是我们最好只换出那些并不经常使用的部分,而保留那些经常被使用的部分。
而不是整个段的换入换出。
这样可以避免大块的慢速磁盘操作。
这就是定长映射策略,我们将内存空间分割为一个个定长块,每个定长块被称为一个页。
映射表的基本格式为(物理空间页起始地址),由于页是定长的,所以不需要指出它的长度,另外,我们不需要在映射表中指定线性地址,我们可以将线性地址作为索引,到映射表中检索出相应的物理地址。
当使用页时,其策略为:当换出的时候,我们只将那些不活跃的,也就是不经常使用的页换出,而保留那些活跃的页。
在换入的时候,只有被请求访问的页才被换入,没有被请求访问的页将永远不会被换入到物理内存。
这就是请求页(Demand Page)算法的核心思想。
这就引出一个页大小的问题:首先我们不可能以字节为单位,这样映射表的大小和线性空间大小相同——假如整个线性空间都被映射的话——我们不可能将全部线性空间用作存放这个映射表。
由此,我们也可以得知,页越小,则映射表的容量越大。
而我们不能让映射表占用太多的空间。
但如果页太大,则面临着和不定长段映射同样的问题,每次换出一个页,都需要大量的磁盘操作。
另外,由于为一个进程分配内存的最小单位是页,假如我们的页大小为4 MB,那么即使一个进程只需要使用4 KB的内存,也不得不占用整个4 MB页,这明显是一种很大的浪费。
所以我们必须在两者之间进行折衷,一般平台所规定的页大小为1 KB到8 KB,IA-32所规定的页大小为4 KB。
(IA-32也支持4 MB页,你可以根据你的OS的用途进行选择,一般都是使用4 KB页)。
--------------------------------------------------------------------------------4. Page Table假如使用4 KB的页,那么对于4 GB的线性空间,则需要1,048,576个页表实体,每个表项占用4个字节,则需要4,194,304个字节。
仅仅页表就占用4 MB空间,这是一个很大的需求。
但如果确确实实一个进程需要使用全部线性空间的话,那么这4 MB的页表空间投入也是必要的。
但在现实中,很少有那个程序需要使用这么大空间,一般的程序往往很小,从几KB到几MB,再使用这么大的页表就纯粹是一种浪费。
那我们该怎么办?一种策略是建立变长页表——我们只建立所需长度的页表。
但这种策略带来很大的限制,并且仍然会造成比较大的空间浪费。
由于页表机制是使用线性地址作为索引,到页表中进行检索。
那么如果我们想让OS Kernel使用C0000000h-FFFFFFFFh,也就是3 GB-4 GB之间的线性空间,那么页表的3 MB以上部分肯定被使用,那么页表还是不得不占用大于3 MB空间的空间,即使这个进程仅仅使用1 KB的线性空间。
除非我们把OS Kernel放在0h-3FFFFFFFh,也就是第一个1 GB线性空间。
即使是这样,我们的页表也必须至少占用1 MB的空间,尽管实际上我们的内核可能只有4 MB,只需要1024个表项,也就是4 KB表项空间——因为进程私有的线性空间是从40000000h开始的。