【一】 操作系统复习 | 内存管理之分段机制和分页机制

前言

操作系统为每个进程分配独立的一套虚拟地址,每个进程都不能直接访问物理地址,因为对于多进程的计算机而言,如果每个进程都直接对物理内存进行访问,那么程序不能正常运行起来的。而为每个进程分配属于自己的虚拟内存后,这样不同的进程在运行时,只需要把不同的进程的虚拟地址映射到不同的物理地址,他们之间就不会发生冲突,程序就可以正常运行起来。

虚拟内存地址和物理内存地址
  • 程序所使用的内存地址称之为虚拟内存地址
  • 硬件中的内存的地址叫做物理内存地址

当进程运行时,操作系统会通过CPU中的内存管理单元(MMU)把进程的虚拟地址映射物理地址,然后进程通过物理地址对内存进行访问

操作系统管理虚拟地址和物理地址之间关系的方式:内存分段和内存分页

内存分段机制
  • 在内存分段机制下,虚拟地址由两部分组成,即段选择子和段内偏移量。其中段选择子保存在段寄存器中,在段选择子中里面包括了段号,它的作用是用来索引段表。段表中包括,段的基地址(也就是该段的物理起始地址)、段的界限(该段的物理地址范围)、该段的特权等级。段的偏移量,它的值应该属于【0,段的界限】,假如,段内偏移量是合法的话,将段的基地址加上段内偏移就能够得到内存分段机制下虚拟地址所对应的物理地址。
  • 在分段机制下,程序的虚拟地址被分成4个段,分别是代码段、数据段、堆段、栈段

在这里插入图片描述
内存分段机制存在的两个问题:首先是内存碎片问题,其次是内存交换的效率低(内存交换空间太大 )

  • 内存碎片分为外部内存碎片和内部内存碎片。其中外部内存碎片,在对程序分配物理内存的时候,产生了多个不连续的较小的物理内存,而这些较小的物理内存因为过小无法装载新的程序。内部内存碎片指的是程序全部的内存装载到了物理内存,但是这个程序中有一部分内存可能使用的频率不是很高,但一直占据着物理内存,从而造成了内存资源的浪费。
  • 解决外部内存碎片的方法是进行内存交换,就是通过利用硬盘的交换空间,对内存空间进行调整,使得多个外部内存碎片连接到一起,变成更大的内存空闲空间,供新的程序加载。由于硬盘的访问速度远小于内存的访问速度,所以分段机制下如果在进行内存交换的时候,交换的是一个内存空间占用很大的程序,这样会使得计算机变得很卡顿。
内存分页机制
  • 在分页机制下,虚拟内存和物理内存空间被划分成一个个固定大小的片段。这样一个个固定大小且连续的内存空间称之为页,在Linux操作系统下,一个页的大小为4KB
  • 在分页机制下,虚拟地址和物理地址之间是通过页表来进行映射的,页表存储在CPU的内存管理单元中,CPU可以利用内存管理单元通过页表找到程序虚拟内存地址对应的物理内存地址。当进程访问的虚拟地址在页表中查不到的时候,说明所需要的数据还未被加载到内存当中,这时候操作系统就会产生一个缺页中断,进入系统的内核空间为在外存中需要访问的数据分配内存空间并更新进程页表,完成后返回用户空间,恢复进程的运行
  • 在分页机制下,因为内存空间都是提前划分好的,并且在分页机制下,内存释放都是以页为单位进行释放的, 所以不会像分段机制那样产生非常小的内存空闲空间,即外部内存碎片
  • 在分页机制下,如果内存空间不足的时候,操作系统会把其他正在运行的进程中最近没有被使用的内存页面释放掉,即把它暂时写回到硬盘上,这个操作称之为换出,而当进程在一次用到这个内存页面时,再重新把它加载到内存当中
  • 在分页机制下,一次性写入磁盘的只是少数几个页,不用花费很长的时间,内存交换的效率相对于分段机制而言较高
  • 在分页机制下,在加载程序的时候,不需要一次性把程序都加载到内存中,在完成虚拟内存和物理内存的映射之后,只加载程序运行所需要的必须的指令和数据,而在程序运行过程中,需要用到对应的虚拟内存页中的其他指令和数据时,在把它加载到物理内存当中去
分页机制下,虚拟地址和物理地址之间的映射
  • 在分页机制下,虚拟地址可以分为两个部分,分别是页号和页内偏移。页号作为页表的索引项,页表中包含物理页每页所在物理内存中的基地址,通过基地址和页内偏移就可以得到虚拟地址对应的物理内存地址
  • 具体来说,内存地址转换可以分为三个步骤,首先把虚拟内存地址,划分成页号和页内偏移两部分;然后,通过页号,从页表中查询到该页号对应的物理页号;最后,获取到物理页号,加上页内偏移量,就可以得到物理内存地址

在这里插入图片描述

直接使用分页机制存在的缺陷

在32位的计算机环境下,虚拟地址空间共有2^32 = 2^2 x 2^ 30 = 4GB的大小,我们假设向在Liunx操作系统下一样,一个页面的大小为2^12 = 4KB大小,那么虚拟地址空间大约就有2 ^20 =100万页,每个页表项需要4个字节大小的空间来存储,那么整个4GB的虚拟地址空间的映射就需要4MB的内存来存储所维护的页表。假设在多道程序的计算机环境中,可以允许100个进程同时运行,由于每个进程都需要维护自己的页表,这时操作系统就需要100 X 4MB = 400MB的内存来维护所有进程的页表,这就占用了很大的内存空间,如果是64位操作系统的话,操作系统维护所有进程的页表所需要的内存空间就更大

参考文献:

[1] 小林coding, 20张图揭开内存管理的迷雾[CSND], 2020.06.30.
[2] Abraham Sliverschatz,Greg Gagne, et al. Operating System Conceptions Essentials[B],机械工业出版社,第二版.

更多有关于Linux C++后台开发的学习分享,感兴趣的朋友们可以关注我的个人公众号
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值