Linux 学习笔记-内存管理之交换技术与虚拟内存的实现与作用

时间:2024-04-07 14:27:04

6 内存管理

内存抽象:
如果看过设计模式的人可能会知道,设计模式中提到最多的概念之一就是抽象,纯虚的基类作为接口就是对各种派生类对象的抽象。调用接口的用户,并不知道内部如何实现,因此内部实现的方法可能也有多种。地址空间也可以这样理解,32位机上,创建进程时操作系统为进程分配4GB的独立地址空间,用户可以使用这4GB的独立地址空间。但是,反过来一想,给每个进程都分配4GB地址空间,对于8GB内存的计算机而言岂不也就能同时运行两个进程。对于现代计算机而言,这显然是不可能的。所以实际上,用户能使用的4GB地址空间并不是对应物理内存的4GB,具体怎么实现被封装了,所以叫内存抽象。

现代操作系统能够同时运行多个程序,程序被运行时,需要占用内存的一块空间,如果同时运行的程序太多,物理内存装不下了怎么办?因此出现了两种技术,交换技术和虚拟内存。

6.1 交换技术

交换技术:就是指当内存满了以后,就将一个程序从内存换出,将另一个程序放入内存,换出的内存数据保存在硬盘上,当该程序再次被换入的时候,就将硬盘上的数据拷贝到内存。
Linux 学习笔记-内存管理之交换技术与虚拟内存的实现与作用

6.2 虚拟内存

**虚拟内存:**操作系统为了管理内存,给每个进程都分配独立的地址空间,对32位的系统而言,这个空间的大小是4GB。这4GB并不是实际的物理内存,实际上并不存在,因此有虚拟内存这一名称
虚拟地址空间的地址称为逻辑地址,实际物理内存(就是内存条的大小)的地址空间称为物理地址。虚拟地址空间被分割成多个大小相同的页面(比如4k为一个页面),物理地址空间被分割成同样大小的页框。虚拟地址的页面通过一个页表映射物理内存的页框,页表中保存着两者的对应关系

Linux将这4GB的地址空间分为两部分,一个是用户地址空间,一个是内核地址空间。内核地址空间的地址范围范围为3G到4G,用户地址空间的地址范围为0G到3G。这里所讲的0G到4G都是虚拟地址,也称为逻辑地址

Linux 学习笔记-内存管理之交换技术与虚拟内存的实现与作用
Linux 学习笔记-内存管理之交换技术与虚拟内存的实现与作用
6.2.1虚拟内存的实现
  虚拟内存是将系统硬盘空间和系统实际内存联合在一起供进程使用,给进程提供了一个比内存大得多的虚拟空间。在程序运行时,只要把虚拟地址空间的一小部分存储到内存,其余都存储在硬盘上(也就是说程序虚拟空间就等于实际物理内存+部分硬盘空间)。当被访问的虚拟地址不在内存时,则说明该地址未被存储到内存,而是被存贮在硬盘中,因此需要的虚拟存储地址随即被调入到内存;同时当系统内存紧张时,也可以把当前不用的虚拟存储空间换出到硬盘,来腾出物理内存空间。系统如此周而复始地运转——换入、换出,而用户几乎无法查觉,这就是虚拟内存的运行机制。
6.2.2虚拟内存的作用
(1)扩大地址空间。无论段式虚存,还是页式虚存,或是段页式虚存,寻址空间都比实存大。
(2)内存保护。每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。另外,虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改
(3)公平分配内存。采用了虚存之后,每个进程都相当于有同样大小的虚存空间。
(4)当进程需要通信时,可采用虚存共享的方式实现

不过,使用虚存也是有代价的,主要表现在以下几个方面:
(1)虚存的管理需要建立很多数据结构,这些数据结构要占用额外的内存
(2)虚拟地址到物理地址的转换,增加了指令的执行时间
(3)页面的换入换出需要磁盘I/O,这是很耗时间的。
(4)如果一页中只有一部分数据,会很浪费内存。

6.3 内存碎片

内存碎片是由于多次进行内存分配造成的,当进行内存分配时,内存格式一般为:(用户使用段)(空白段)(用户使用段),当空白段很小的时候可能不能提供给用户足够需要的空间,可能夹在中间的空白段的大小为5,而用户需要的内存大小为6,这样会产生很多的间隙造成内存使用效率的下降,这些很小的空隙叫碎片。
通过对malloc,free源码的分析,发现在堆上分配内存,很容易造成内存碎片。