【操作系统】为什么要分段?为什么要分页?

  • Post author:
  • Post category:其他


今天被一位大佬问了一个问题

大佬:说一下分段和分页的具体意义

我:分段是将程序分为具有逻辑意义的不同大小的段,方便管理;分页是将物理空间分割成大小一定的一块块物理页,粒度小,内存利用率高,磁盘换出的消耗也小。。。。

大佬:说一下分段的物理意义

我:啊这,这还不够物理意义吗

最后搜寻资料一番,分段被设计出来的最初目的是为了解决有限的地址线路条数的情况下可寻址更大的存储空间,真有你的嗷



为什么要分段?

分段要基于物理硬件的历史来说

在8086处理器出来以前都是直接访问物理地址,当两个程序分配到同一个内存块是不行的,只能运行一个程序

而8086是一个16位处理器,地址总线有20位

2^16 =64kb无法映射到 2^20=1M的物理空间

所以采用了分段,两个16位寄存器,分别为段基址和段偏移

让CPU通过【

段基址+段偏移

】来访问物理内存

然后可能会问16位基址如何映射到20位呢?

他是通过段基址左移4位(基址*16倍变为20位)来映射

如要访问(0x05801)的内存 就是通过(0x0058)左移4位+(0x0001)获得

0x0580+0x0001=0x00581

你如果觉得16位左移4位会溢出?维基百科有一段是这样说的

8086有4个存储器区段(segment)暂存器,可以通过索引暂存器来设置。区段暂存器可以让CPU一种当时是全新的方式访问多达1MB之存储器。在现今有区段的处理器中,8086把区段暂存器左移4位然后把它加上去寻址。这通常被认为是一个不太好的设计,因为这么做会让各区段有重叠。

8086的分段寻址,是指一个物理地址由段地址(segment selector)与偏移量(offset)两部分组成, 长度各是16比特。其中段地址左移4位(即乘以16)与偏移量相加即为物理地址。例如,06EFh:1234h,表示段地址为06EFh, 偏移量为1234h, 物理地址为06EF0h + 1234h = 08124h。在计算物理地址时如果发生上溢出,8086处理器舍弃进位。例如,FFFFh:0010h所对应的物理地址为00000h.

一个20位的物理地址对应着4096个不同的”段地址:偏移量”的组合。这是因为,偏移量的最低4位对应于物理地址的最低四位,而偏移量的高12位共有4096个取值。

我们经常谈的程序可执行文件的分段,例如代码段数据段这些,在最开始其实就是为了跟上面描述的硬件上的内存分段机制对应,并且逻辑上能够更清晰有序地构造程序的组织结构。



为什么要分页?

分页是在分段后的一段时间出的

是为了解决分段粒度大,因为段需要整段的加载进内存以及整段换出,造成内存碎片大,不易于管理,虽然可以通过将段置换出磁盘再加载的方式减少碎片,但是效率实在太低

分页管理通过划分物理空间为一块块固定大小的页与之对应,能够将程序分割成一页一页加载进内存,提升了内存的利用率



分段和分页的优缺点

  • 分段:

    • 优点:

      每个逻辑单元课单独占用一个虚拟空间,使编写程序的空间大为增长

      段氏按照逻辑划分,信息共享十分方便
    • 缺点:

      每一段都占用不固定大小的连续空间,一个段必须全部加载到内存,造成内存碎片过多
  • 分页:

    • 优点:固定大小分页,减少了内存碎片,降低了内存磁盘换入换出的消耗
    • 缺点:一个进程只能占优一个虚拟空间,导致程序大小至多与虚拟空间大小一样大,所有内容都必须从该空间分配



总结

首先,说了分段的来源

然后说了分段的缺点从而引入了分页

所以利用了段的方便管理以及页的内存利用的优点得出了段页式管理

可以将程序分为具有逻辑意义的不同大小的段(方便进程管理,代码共享和信息保护),为了利用空间再对段进行分页



版权声明:本文为HuaJi250原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。