首页 > 系统相关 >内存管理——分段和分页的区别

内存管理——分段和分页的区别

时间:2022-08-23 21:36:54浏览次数:86  
标签:分页 映射 内存 分段 虚拟内存 物理

分段与分页的区别

分段:

分页:

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

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

但是有几点不同:

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

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

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

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

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

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

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

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

标签:分页,映射,内存,分段,虚拟内存,物理
From: https://www.cnblogs.com/Ethan-Code/p/16617858.html

相关文章