4

段页式内存管理

 2 years ago
source link: https://zofun.github.io/2020/05/15/%E6%AE%B5%E9%A1%B5%E5%BC%8F%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

内存管理需要解决的问题

内存管理无非就是解决三个问题:

  • 如何使进程的地址空间隔离
  • 如果提高内存的使用效率
  • 如何解决程序运行时的重定位问题

现在的内存管理方案就是引入虚拟内存这一中间层。虚拟内存位于程序和物理内存之间,程序只能看见虚拟内存,不能直接访问物理内存。每个程序都有自己独立的虚拟地址空间,这样就做到了进程地址空间的隔离

引入了虚拟地址技术后,我们需要解决如何将虚拟地址映射到物理地址。这主要有分段和分页两种技术。

这种方法的基本思路是将程序所需要的内存地址空间大小的虚拟空间映射到某个物理地址空间。

YsDYaq.png

分段机制使得每个进程具有独立的进程地址空间,保证了地址空间的隔离性。同时它也解决了程序重定位的问题,因为程序始终是在虚拟地址空间下运行的。

分段机制同样也存在许多的问题,因为它映射的粒度太大,是以程序为单位的,如果内存不足,那么只能换出整个程序。这样内存的使用效率就很低。

分页机制就是将内存地址空间分为若干各很小的固定大小的页,每一页的大小由内存来决定。这样映射的粒度更小了,根据局部性原理,我们只需要在内存中保存少部分的页,大部分的页都可以换到磁盘中去。

YssggO.png

页式存储管理能够有效的提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享

段页式管理

段页式管理就是将程序分为多个逻辑段,在每个段里面又进行分页,即将分段和分页组合起来使用。

Ys6kfP.png

在段页式系统中,作业的逻辑地址分为三部分:段号、页号和页内偏移量。

Ys6R7d.png

为了实现地址变化,系统为每个进程维护了一个段表,每个分段又有一个页表。段表中包含段号、页表长度和页表的起始地址。页表中包含页号和块号。系统还有一个段表寄存器,存储段表的起始地址和段表长度。

在进行地址变化式,通过段表查到页表的起始地址,然后再通过页表查到物理块的地址。

Ysco5R.png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK