连续内存分配与非连续内存分配

连续内存分配

  1. 首次适配:空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
  2. 最优适配:空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。
  3. 最坏适配:空闲分区以容量递减的次序链接。找到第一个能满足要求的空闲分区,也就是挑选出最大的分区。

 

 

非连续内存分配

一、分页式存储管理介绍:

       用户程序逻辑地址空间->页(连续)

       物理内存空间->块(离散)

       页表(内存中):key=页号,value=块号(内存中的物理块)

       快表(高速缓冲区存储器中):key=页号,value=块号(内存中的物理块)

  1. 基本思想:用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
  2. 分页概念:逻辑空间分页,物理空间分块,页与块同样大,页连续块离散,用页号查页表,由硬件做转换,页面和内存块大小一般选为2的若干次幂(便于管理)。页表作用:实现从页号到物理地址的映射
  3. 分页存储管理的地址机构:页号4位,每个作业最多2的4次方=16页,表示页号从0000~1111(24-1),页内位移量的位数表示页的大小,若页内位移量12位,则2的12次方=4k,页的大小为4k,页内地址从000000000000~111111111111
  4. 页表:分页系统中,允许将进程的每一页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面对应的物理块,系统为每个进程建立一张页面映射表,简称页表。页表的作用是实现从页号到物理块号的地址映射。
  5. 具有快表的地址变换机构:分页系统中,CPU每次要存取一个数据,都要两次访问内存(访问页表、访问实际物理地址)。为提高地址变换速度,增设一个具有并行查询能力的特殊高速缓冲存储器,称为“联想存储器”或“快表”,存放当前访问的页表项,快表就是存放在高速缓冲存储器的部分页表。它起页表相同的作用。包含快表机制的内存管理中,当要访问内存数据的时候,首先将页号在快表中查询,如果查找到说明要访问的页表项在快表中,那么直接从快表中读取相应的物理块号;如果没有找到,那么访问内存中的页表,从页表中得到物理地址,同时将页表中的该映射表项添加到快表中(可能存在快表换出算法)。只需要一次内存访问
  6. 多级页表:在某些计算机中如果内存的逻辑地址很大,将会导致程序的页表项会很多,而页表在内存中是连续存放的,所以相应的就需要较大的连续内存空间。为了解决这个问题,可以采用两级页表或者多级页表的方法,其中外层页表一次性调入内存且连续存放,内层页表离散存放。相应的访问内存页表的时候需要一次地址变换,访问逻辑地址对应的物理地址的时候也需要一次地址变换,而且一共需要访问内存3次才可以读取一次数据。
  7. 如果存储器采用基本分页机制,那么操作系统会为每个进程或任务建立一个页表(这个页表可能是一级的也可能是多级的)。整个操作系统中有多个进程在运行,那么系统就会有多个页表。页表在内存中的存储位置由寄存器CR3给出。

 

二、分段式存储管理

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

2、分段存储方式的引入:方便编程、分段共享、分段保护、动态链接、动态增长

3、分段地址结构:作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例程序段、数据段等。每个段都从0开始编址,段长不一样,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间是二维的。一维是段号,一维是(段内地址/段表项的长度);由于分段管理中,每个段内部是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。段表中的每一个表项记录了该段在内存中的起始地址和该段的长度。段表可以放在内存中也可以放在寄存器中。

4、访问内存的次数:访问内存的时候根据段号和(段内地址/段表项的长度/段内位移量)计算当前访问段在段表中的位置,然后访问段表,得到该段的物理地址,根据该物理地址以及段内偏移量就可以得到需要访问的内存。由于也是两次内存访问,所以分段管理中同样引入了联想寄存器。

5、如果存储器采用基本分段机制,那么操作系统会为每个进程或任务建立一个段表

分段总结:作业空间是二维的,一维段号、一维段内地址/段内位移量(段长),段表由段号、段长、基址组成,用户通过段号到段表中获得段长与基址,从而定位到内存中的数据。内存空间中,每个段之间不连续,但是每个段自己内部是连续的

 

三、分页和分段的主要区别(两者都不要求作业连续存放)

1、段是信息的逻辑单位,分段的目的是为了更好地实现共享,根据用户的需要划分,因此段对用户是可见的;页是信息的物理单位,是为了管理主存的方便而划分的,分页是为了实现非连续分配,以便解决内存碎片问题,或者说分页是由于系统管理的需要,其对用户是透明的

2、段的大小不固定,由它所完成的功能决定;页的大小固定(一般为4K),由系统决定,将逻辑地址划分为页号和页内地址是由机器硬件实现的。

3、段向用户提供二维地址(段号+段内地址);页向用户提供的是一维地址(页号)

4、段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制。

 

四、段页式存储管理

1、基本思想:

       分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。

       在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。

       段页式系统中,作业的地址结构包含三部分的内容:段号、页号、页内位移量

       程序员按照分段系统的地址结构将地址分为段号与段内位移量,地址变换机构将段内位移量分解为页号和页内位移量。

       为实现段页式存储管理,系统应为每个进程设置一个段表,包括每段的段号,该段的页表始址和页表长度(本来是段内基址和段长),如下图。每个段有自己的页表,记录段中的每一页的页号和存放在主存中的物理块号。

       如果采用段页式结合的机制,那么一般一个进程或任务,操作系统会给其建立一个段表,而段表中的每个段又会对应一个页表,也就是说,段页式机制的每个进程有一个段表,有多个页表。

 

2、地址变换的过程:

(1)程序执行时,从PCB中取出段表始址和段表长度,装入段表寄存器。

(2)由地址变换机构将逻辑地址自动分成段号、页号和页内地址。(涵盖了段表+页表)

(3)将段号与段表长度进行比较,若段号大于或等于段表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。

(4)将段表始址与段号和段表项长度的乘积相加,便得到该段表项在段表中的位置。

(5)取出段描述子得到该段的页表始址和页表长度。

(6)将页号与页表长度进行比较,若页号大于或等于页表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。

(7)将页表始址与页号和页表项长度的乘积相加,便得到该页表项在页表中的位置。

(8)取出页描述子得到该页的物理块号。

(9)对该页的存取控制进行检查。

(10)将物理块号送入物理地址寄存器中,再将有效地址寄存器中的页内地址直接送入物理地址寄存器的块内地址字段中,拼接得到实际的物理地址。

3、访问内存的次数

       在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内

       存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。

 

4、段页式总结:

       作业空间分段,再将每段分成大小相等的页,内存也分页

       作业空间是二维的,分段号、页号、页内偏移量

       程序员按照分段系统的地址结构将地址分为段号与段内位移量(段的长度),地址变换机构将段内位移量分解为页号和页内位移量

 

五、在网上找到了一个比较形象的比喻,挺不错的,列出来如下:

       打个比方,比如说你去听课,带了一个纸质笔记本做笔记。笔记本有100张纸,课程有语文、数学、英语三门,对于这个笔记本的使用,为了便于以后复习方便,你可以有两种选择。

       第一种是,你从本子的第一张纸开始用,并且事先在本子上做划分:第2张到第30张纸记语文笔记,第31到60张纸记数学笔记,第61到100张纸记英语笔记,最后在第一张纸做个列表,记录着三门笔记各自的范围。这就是分段管理,第一张纸叫段表。

       第二种是,你从第二张纸开始做笔记,各种课的笔记是连在一起的:第2张纸是数学,第3张是语文,第4张英语……最后呢,你在第一张纸做了一个目录,记录着语文笔记在第3、7、14、15张纸……,数学笔记在第2、6、8、9、11……,英语笔记在第4、5、12……。这就是分页管理,第一张纸叫页表。你要复习哪一门课,就到页表里查寻相关的纸的编号,然后翻到那一页去复习

 

 

来自码农翻身 关于非连续内存分配的理解介绍:

虚拟内存:时间局部性原理+空间局部性原理

分页:

每页4KB,装载程序的时候按4KB装载

        物理内存分块/页框(Page Frame),虚拟地址空间分页

        操作系统维持一个页表,用来映射虚拟页面和物理页面

        如果访问到一个没有被映射到物理内存的页面,则产生缺页中断

              地址分为两部分:页号+偏移量(分段机制),由CPU的MMU实现地址的转换

              由页号p在内存中的页表找到对应的页框号/块f,再到程序的物理地址中找到f块,对应偏移量i就可以得到程序了

        为了防止每次都要多次访问内存,可以在MMU的缓存中存放快表

分段+分页:段页式存储管理机制

       将程序分为代码段、数据段、堆栈段便于存储管理(比如修改代码段的时候可以立马抛出异常)

       地址分为段号+偏移量,通过段号找到段的基址,和偏移量相加得到一个线性地址,这个线性地址再通过分页系统进行转换,最后形成物理地址

 

参考链接:

http://link.zhihu.com/?target=http%3A//blog.csdn.net/wangrunmin/article/details/7967293

猜你喜欢

转载自blog.csdn.net/qq_35642036/article/details/82809762