【Linux内核】内存管理——分段和分页的区别

转载请注明出处: https://www.cnblogs.com/Ethan-Code/p/16617858.html

分段与分页的区别

分段:

分页:

分段和分页的工作方式相似,都是非连续存储。

  • 分段的逻辑地址=段号+段内偏移。段表存放段描述符。段描述符=段基址+段界限。物理地址=段基址+段内偏移。
  • 分页的虚拟地址=页号+页内偏移。页表存放页面映射。页面映射=虚拟页号+物理页号。物理地址=物理页号+页内偏移。

但是有几点不同:

  • 分段的大小是不固定的,通过段界限来划分。并且每个段的虚拟内存和物理内存都是连续空间,段的大小以段界限划分,导致颗粒度比较大。而不同的段在物理内存中不一定连续的,当需要分的段比任一段与段之间的内存大时,分段机制无法将这些离散内存映射成一段,导致外部内存碎片问题,需要把物理内存上非连续的段换出再重新换入,才能消除这些离散的内存碎片。当内存不足时,换入换出的开销比较大。
  • 分页的大小是固定的4K。分页以页为单位,虚拟内存的页连续而映射的物理内存页不一定连续,颗粒度比较小,就算物理内存可用的页是离散的,只要将这些页进行映射,进程就可以正常访问,不会产生外部内存碎片。当内存不足时,充分利用局部性原理,采用LRU算法换出不常用的页。提供的更适合多进程运行的环境。当程序大小不足一页的时候,会产生页内的内部内存碎片。

所以,分段和分页的区别在于颗粒度,把分段的大小固定为页的大小,两者就基本一致了。但分段的初衷是为了按程序的特定逻辑功能来划分,每个段都有其分配的意义。而分页则将所有的内存一视同仁,不会去管每一页是做什么功能的,只需要按需分配和swap。

而Linux也主要采用分页机制,不使用分段机制,但是为了兼容Intel的CPU架构,Linux保留了分段机制,只是把所有的段基址都设置成了0从而屏蔽了内存分段。

个人不完善的看法

按照工作方式来看的话,其实分段和分页基本是一样的,都是用了一个表来对虚拟地址和物理地址做了映射,基址+偏移。

但是这两者被提出的时候是用来解决不同的问题的。

(1)分段的意义

  • 分段主要是为了将一个程序的内存按照逻辑功能分成不同的区间段,比如将分出代码段、数据段等,段内部是连续存放的。这样子分开可以避免出错。在没有分段时,内存的换入换出都是以整个进程内存空间为单位,而分段后,只需要换出进程中不常用的某些段就可以,需要的时候再从磁盘中换入。

例如,在汇编程序中,会在一开头使用Segment划分段,这就是手动的分段,每个段之间的内存时连续的,并且都是由0地址开始(偏移地址),再加上段基址。如:CS:IP,SS:SP。这里的段表应该是由8086的寄存器构成。

  • 不过也看到了分段的另一种方式,就是按照进程来分段映射,一个进程分为一个段。这样的话当产生内存碎片或内存不足时换入换出和没有分段的开销一样大。这样分段的**意义是隔离进程地址空间,若直接使用物理内存,则可能会出现访问到其他进程内存的情况。**通过分段引入虚拟内存,对进程而言都有0~4G(32位)的地址空间,由分段机制对物理内存进行映射,当多进程访问同一个虚拟地址,在物理内存上都会对应到进程自身的段,而不会影响其他进程。

(2)分页的意义

  • 分页则是为了更好的提高内存的利用率。充分利用了程序的局部性原理,一个进程访问频率最高的也就只有局部的一小段内存。因此采用分页将虚拟内存空间划分为多个页,同时物理内存也划分为多个页框,大小跟虚拟内存的页的单位一致。这样就可以做到页框对页的映射。对于进程本身而言,拥有分页后全部的连续虚拟内存空间,只有在访问这些虚拟内存时产生缺页异常,MMU才会进行映射的动作,将物理内存分配过来。当物理内存不足时,会根据LRU算法将最近最少使用的页暂时换出到磁盘,释放出物理内存页建立映射,因此进程所使用的物理内存可以是非连续的,并且由于内存是按页框对齐的,不存在外部内存碎片。

一个形象的例子

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

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

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

够形象吧~ 笔记本对应物理内存,第一张纸对应段表or页表,三个科目对应三个进程。分段是预先划分好,一个进程放在连续的一大段。分页是边写边记录,哪个进程需要内存就先写一页,然后记录好目录。

END!


好文推荐:https://www.cnblogs.com/myseries/p/12487211.html
https://cloud.tencent.com/developer/article/1344772

猜你喜欢

转载自blog.csdn.net/weixin_45636061/article/details/127184754
今日推荐