Window内存管理方式:页式 段式 段页式

转自: LingLee_荆棘鸟 http://blog.csdn.net/u012813201/article/details/70143990

内部碎片:已经被分配出去的内存空间>请求所需的内存空间。(分出去的没用完)

页式内存管理。页的大小大于实际进程所需要的空间,但是该剩余部分不能够被其他进程使用。分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如0#块、1#块等等。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。

外部碎片:还没有分配出去,但是由于太小而无法分配给申请空间的新金正的内存空间空闲块。

外部碎片是处于任何两个已经分配区域之间的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但由于他们的地址不连续或者其他原因,是的系统无法满足当前申请。

Windows内存管理方式主要分为:页式管理、段式管理和段页式管理

首先看一下“基本的存储分配方式”种类:


      



1.  离散分配方式的出现


  由于连续分配方式会形成许多内存碎片,虽可通过“紧凑”功能将碎片合并,但会付出很大开销。于是出现离散分配方式:将一个进程直接分散地装入到许多不相邻的内存分区中。

       下面主要介绍“离散分配”三种方式的基本原理以及步骤:


2.  基本分页存储


2.1.       步骤


³ 逻辑空间等分为页;并从0开始编号

³ 内存空间等分为块,与页面大小相同;从0开始编号

分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中

用户程序的逻辑地址空间被划分成若干固定大小的区域,称为“页”或者“页面”,相应地,内存物理空间也分成相对应的若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。

2.2.       地址结构


       分两部分:页号、位移量(业内地址)


     地址长度为32位,其中0~11位为页内地址,即每页大小为4KB;12~32位为页号,地址空间最多允许有220页。

  逻辑地址=页号&位移量(&号是连接符号,是将页号作为逻辑地址的最高位)


2.3.       地址映射(逻辑地址—>物理地址)


  (物理地址=块号&块内地址)

  因为块的大小=页的大小,所以块内位移量=页内位移量,所以只需求出块号即可:


页表:

为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,记录页面在内存中对应的物理块号,页表一般存放在内存中。

在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见页表作用是实现从页号到物理块号的地址映射,如下图所示:



给定一个逻辑地址和页面大小,如何计算物理地址?

1)       根据页面大小可计算出页内地址的位数

2)       页内地址位数结合逻辑地址计算出页内地址(即,块内地址)和页号

3)       页号结合页表,即可得出块号

4)       块号&块内地址即可得出物理地址

【例子】若页面大小为1K字节,页号2对应的物理快为b=8,计算逻辑地址A=2500的物理地址E。

 逻辑地址:2500/1K=2 余数252,页号为2,页内地址=252

物理块号 8,块内地址252, 所以 物理地址=8*1K+252=8644

CPU每次存取一个数据的时候需要访问2次内存第一次访问页表,根据自己的页号找到相应的内存块的地址,第二才是真正的访问那块内存,读写数据,(为了解决这个问题,可以建立一个快表,用寄存器实现速度块,可以把常用的页表项放进去,这样一般访问一次内存即可,访问寄存器的速度超快,基本跟上指令执行,不用担心)页表是一维的,只需要页号就能访问内存, 但是现在内存大了,既有可能表项庞大,这一个页表就占了很大内存,这时提出了二级页表,第一张表的没一项存放一个页表的地址,所以第一张表是多张页表的索引


2.4.       地址变换原理及步骤



 



请看上图,给出逻辑地址的页号和页内地址,开始进行地址变换:

1)       在被调进程的PCB中取出页表始址和页表大小,装入页表寄存器

2)       页号与页表寄存器的页表长度比较,若页号大于等于页表长度,发生地址越界中断,停止调用,否则继续

3)       由页号结合页表始址求出块号

4)       块号&页内地址,即得物理地址

 优点:没有外碎片,内碎片大小不超过页的大小

缺点:整个程序要全部装入内存,要求有响应的硬件支持。

 

3.   基本分段存储


3.1.       步骤

将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。

³ 逻辑空间分为若干个段,每个段定义了一组有完整逻辑意义的信息(如主程序Main()),如:




  内存空间为每个段分配一个连续的分区

  段的长度由相应的逻辑信息组的长度决定,因而各段长度不等,引入分段存储管理方式的目的主要是为了满足用户(程序员)在编程和使用上多方面的要求。

  要注重理解,完整的逻辑意义信息,就是说将程序分页时,页的大小是固定的,只根据页面大小大小死生生的将程序切割开;而分段时比较灵活,只有一段程序有了完整的意义才将这一段切割开。

 

3.2.       地址结构


       分两部分:段号、位移量(段内地址)




³  段内地址的位数可以决定段的大小

³  逻辑地址=段号&段内地址(&号是连接符号,是将段号作为逻辑地址的最高位)

图中段的大小为2^16  即64K。段号范围为0~2^64

3.3.       地址映射(逻辑地址—>物理地址)


物理地址=基址+段内地址注意为+号,而不是&号


段表:根据段号求出基址




 

  求基址的过程与页式存储中求块号的过程原理相同,这里需要注意的是,物理地址是基址+段内地址,而不是基址&段内地址,由逻辑地址得到段号、段内地址,再根据段号和段表求出基址,再由基址+段内地址即可得物理地址。

分页的目的主要是提高内存利用率,从操作系统的角度来看的,那么为了满足用户多方面的需要,提出分段的概念,分段的大小是不固定的,,所以在分段系统中,要访问一块内存,需要两个信息,基址,段长, 而分页的页长是固定的,因而找的一个页只需要页号即可, 所以页表地址空间是一维的,分段地址空间是二维的,同样段表也放在内存中,读写内存的时候,需要访问两次内存,同样的可以用快表的思想来解决

 

3.4.       地址变换原理及步骤





请看上图,给出逻辑地址的段号和段内地址,开始进行地址变换:

1)       在被调进程的PCB中取出段表始址和段表长度,装入控制寄存器

2)       段号与控制寄存器的页表长度比较,若页号大于等于段表长度,发生地址越界中断,停止调用,否则继续

3)       由段号结合段表始址求出基址

4)       基址+段内地址,即得物理地址


 

分页和分段的主要区别:



4.  基本段页式存储


4.1.       步骤



³ 用户程序先分段,每个段内部再分页(内部原理同基本的分页、分段相同)





4.2.       地址结构



       分三部分:段号、段内页号、页内地址




4.3.       地址映射(逻辑地址—>物理地址)



³ 逻辑地址—– >段号、段内页号、业内地址

³ 段表寄存器— >段表始址

³ 段号+段表始址—- >页表始址

³ 页表始址+段内页号—–>存储块号

³ 块号+页内地址——>物理地址


 

先分段,段内在分页,因此需要读写数据时候,访问3次内存,第一次通过段号找页号,第二次通过页号找物理地址,第三次才是真正的读写数据同样的可以用寄存器搞两个缓冲区,实现一次访问内存


4.4.       地址变换原理及步骤




请看上图,给出逻辑地址的段号、页号、页内地址,开始进行地址变换:

1)       在被调进程的PCB中取出段表始址和段表长度,装入段表寄存器

2)       段号与控制寄存器的页表长度比较,若页号大于等于段表长度,发生地址越界中断,停止调用,否则继续

3)       由段号结合段表始址求出页表始址和页表大小

4)       页号与段表的页表大小比较,若页号大于等于页表大小,发生地址越界中断,停止调用,否则继续

5)       由页表始址结合段内页号求出存储块号

6)       存储块号&页内地址,即得物理地址

 

 

5.  比较


页式、段式存储管理中,为获得一条指令或数据,须两次访问内存;而段页式则须三次访问内存

页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页。把内存空间按页的大小划分为块,然后把页式虚拟地址与内存地址建立一一对应的页表,并用相应的硬件地址转换机构来解决离散地址变换问题。页式管理采用请求调页和预调页技术来实现内外存存储器的统一管理。

优点:没有外碎片,每个内碎片不超过页的大小

缺点:程序全部装入内存,要求有相应的硬件支持,如地址变换机构缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。增加了机器成本和系统开销。

段式管理的基本思想是把程序按照逻辑分段,每段有自己的名字。一个用户作业或者进程所包含的段对应一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换为实际内存物理地址。

优点:可以分别编写和编译,可以针对不同类型的段采取不同的保护,可以按段为单位来进行共享,包括通过动态链接进行代码共享。

缺点:会产生碎片

段页式管理,系统必须为每个作业或者进程建立一张段表以管理内存分配与释放、缺段处理等。另外由于一个段又被划分为若干个页,每个段必须建立一张页表以把段中的虚页变换为内存中的实际页面。显然与页式管理时相同,页表也要有相应的实现缺页中断处理和页面保护等功能的表项。

段页式管理是段式管理和页式管理相结合而成,具有两者的优点。由于管理软件的增加,复杂性和开销也增加。另外需要的硬件以及占用的内存也有所增加,使得执行速度下降。



参考:http://blog.csdn.NET/wang379275614/article/details/13765599

展开阅读全文

没有更多推荐了,返回首页