https://raoxuntian.github.io/2020/08/09/os-paging-and-segmentation/

分页和分段是在面试过程中常被问到的两种内存管理技术。

计算机结构比较复杂,那么说到“存储”,我们一般就想到内存和外存,比如我们买手机买电脑,都要看看这些终端的内存够不够打游戏,外存够不够装照片这些。内存外存只是比较通俗的叫法,在实际的计算机存储体系当中,我们划分了四块区域:寄存器(CPU registers)、高速缓存(CPU cache)、主存(内存)、外存(磁盘)。

https://raoxuntian.github.io/2020/08/09/os-paging-and-segmentation/1.png

这篇文章主要是将这座金字塔结构自顶向下第三层的主存结构,也就是我们俗称的内存。

内存这东西不是一两篇文章就能看懂吃透的,无奈每次面试或多或少都被面试官问道这些东西,稍微捋一下这些概念性的东西。

一、内存管理

内存——内部存储器,在运行的时候存储信息,CPU可以直接寻址,区别于那些可以永久保存数据、CPU需要通过硬件控制器读取数据的“外部存储器”。这两者是从计算机架构的角度说的。在通常语境下,“内存”只有主板上插的内存条一种,内存就成了“主板上的RAM”的代称

RAM(Random Access Memory),随机访问控制器,断电就失效,可以直接通过电流刷新数据。􏴳􏴿由于1950年代和1960年代的计算机使用微小的可磁化铁氧体磁芯作为主存储器,因此旧时有时将其称为核心存储器。所以不能在高速缓存中得到满足的内存访问请求斗湖转往RAM当中。

对应的ROM(Read-Only Memory),只读储存器,最开始的ROM真的是只读,不可写入,包括半导体ROM和CD-ROM,后来出现了紫外线擦除的EPROM,电擦除的EEPROM。

我们可以更通俗点去理解内存,内存就是暂时存储程序以及数据的地方,当我们在使用WPS处理文稿时,当你在键盘上敲入字符时,它就被存入内存中,当你选择存盘时,内存中的数据才会被存入硬(磁)盘。

我们在计算机上运行着许许多多的程序,比如QQ、QQ音乐、浏览器等等,每个程序虽然安装在磁盘上,但当用户在运行的时候,需要CPU对这些程序进行操作,显然CPU不可能直接对磁盘进行读取,所以这个时候,内存的作用就出来了。当一个程序,也就是一个进程需要运行的时候,这个进程会先加载到内存上,然后再由CPU对内存上的数据进行操作。

那我们再想想实际的情况,内存一般并不大,现在的电脑一般也就4GB-16GB,而我们的设备一般都支持多进程,同一时刻你可以听着歌QQ在线接收消息顺便打个LOL,甚至有的进程比如MATLAB十几个G来启动,所有的进程数据都保存在内存当中的话,就需要大量的内存,如果内存不足,则无法完成。

针对上面的内存不足的问题,有两种处理方式,第一种比较简单的方式就是交换(swapping)技术,也就是把一个进程完整得调入内存,在内存中运行一段时间之后,再把它放回磁盘。空闲的进程会存储在磁盘当中,所以这些进程在没有运行的时候不会占用太多的内存。这种交换技术我们在这里不多说,主要想聊的是第二种策略,虚拟内存(virtual memory)

二、虚拟内存

正如第一节所讲,虚拟内存的出现是为了解决内存不足的问题。通过虚拟内存可以让程序拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减少出错。

虚拟内存的目的就是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

虚拟内存是计算机系统内存管理的一种技术,我们可以手动设置自己电脑的虚拟内存。不要单纯认为虚拟内存只是“使用硬盘空间来扩展内存“的技术。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且 把内存扩展到硬盘空间。推荐阅读:《虚拟内存的那点事儿》