CPU、内存分段分页机制了解

2,068 阅读5分钟

CPU

CPU.png

进程上下文

操作系统为进程分配的CPU以及内存资源就是这个进程的上下文


内存地址

一、虚拟内存地址:进程使用的内存地址

二、物理内存地址:实际存在硬件里面的空间地址

进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存

操作系统是如何管理虚拟地址与物理地址之间的关系?

主要有两种方式,分别是内存分段和内存分页


内存管理

一、内存分页存储:在页式存储管理中,将程序的逻辑地址划分为固定大小的页(page),而物理内存划分为同样大小的帧,程序加载时,可以将任意一页放入内存中任意一个帧,这些帧不必连续,从而实现了离散分离

(1)页是信息的物理单位,分页是为实现离散分配方式;

(2)以消减内存的外零头,提高内存的利用率;但是会有内零头;

(3)页的大小固定且由系统确定

在 Linux 下,每一页的大小为 4KB。 虚拟地址与物理地址之间通过页表来映射

当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行

对于一个内存地址转换,其实就是这样三个步骤:

  1. 把虚拟内存地址,切分成页号和偏移量;
  2. 根据页号,从页表里面,查询对应的物理页号;
  3. 直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。

内存分页.png

二、内存分段存储:在段式存储管理中,将程序的地址空间划分为若干段(segment),如代码段,数据段,堆栈段;这样每个进程有一个二维地址空间,相互独立,互不干扰

(1)没有内零头,会产生外零头

区分:

  1. 目的不同:分页是由于系统管理的需要而不是用户的需要,它是信息的物理单位;分段的目的是为了能更好地满足用户的需要,它是信息的逻辑单位,它含有一组其意义相对完整的信息;
  2. 大小不同:页的大小固定且由系统决定,而段的长度却不固定,由其所完成的功能决定;
  3. 地址空间不同: 段向用户提供二维地址空间;页向用户提供的是一维地址空间;
  4. 信息共享:段是信息的逻辑单位,便于存储保护和信息的共享,页的保护和共享受到限制;
  5. 内存碎片:页式存储管理的优点是没有外碎片(因为页的大小固定),但会产生内碎片(一个页可能填充不满);而段式管理的优点是没有内碎片(因为段大小可变,改变段大小来消除内碎片)。但段换入换出时,会产生外碎片(比如4k的段换5k的段,会产生1k的外碎片)。

内存分段.png

三、段页式内存管理(每个程序一张段表,每个段建立一张页表)

  1. 先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
  2. 接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页

步骤:

  1. 第一次访问段表,得到页表起始地址;
  2. 第二次访问页表,得到物理页号;
  3. 第三次将物理页号与页内位移组合,得到物理地址。

段页式内存管理.png


内存交换空间(Linux中的Swap)

解决外部内碎片问题:将某个进程占用的内存写到硬上,然后再重硬盘读回内存,但是读回时是紧接在已经被占用的内存的后面,从而腾出更加多内存空间

内存分段:对于多进程的系统来说,用分段的方式,内存碎片是很容易产生的,产生了内存碎片,那不得不重新 Swap 内存区域,这个过程会产生性能瓶颈。 因为硬盘的访问速度要比内存慢太多了,每一次内存交换,我们都需要把一大段连续的内存数据写到硬盘上。 所以,如果内存交换的时候,交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿。

内存分页:如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出(Swap Out)。一旦需要的时候,再加载进来,称为换入(Swap In)。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高


内存零头

  1. 外零头:内存中存在一些区域不归任何进程所有,由于区域太小,无法满足其他进程所申请的内存大小。
  2. 内零头:指已分配给进程的内存空间但未被使用的那一部分区域。