Linux 虚拟内存机制


Linux 虚拟内存机制

1. 虚拟内存概念

1、每个进程有一个独立的4G内存空间,每个进程内存空间都具有类似的结构
2、每当一个新进程建立时,会建立一个自己的内存空间,将进程的数据,代码从磁盘拷贝到改内存空间,这些信息会记录在task_struct链表中。
3、每个进程对应的空间都和磁盘的空间是映射的。

vmmap
4、每个进程的4G空间只是虚拟内存空间,每次访问时都要翻译为真实的物理地址
5、所有进程共享一个物理内存,每个进程只把自己当前需要的虚拟地址空间映射并存到物理内存
6、进程要知道哪些地址在物理内存上,哪些不在,在物理内存的哪一个地方,需要用页表来记录
7、当进程访问某个虚拟地址,去看页表,发现不在物理内存中,则发生缺页异常
8、缺页异常就是把需要的数据从磁盘拷贝到物理内存,如果内存满了就找一个页覆盖

vmmap_detail
补充理解:
虚拟内存起初都是映射到磁盘空间(mmap),并由页表记录映射位置,当访问到某个地址的时候,查看页表发现不在物理内存,就通过缺页异常,将数据从磁盘拷贝到物理内存,如果没有空闲内存,则牺牲页面,替换其他页面。

2. 虚拟内存优点

1、每个进程空间内存地址固定
2、不同进程使用同一份代码,比如库文件,物理内存保存一份,虚拟内存映射过去就可以了,节省内存
3、程序分配内存时,只需在虚拟内存连续分配空间,无需实际内存的连续空间,可以利用碎片

3. 虚拟内存管理方式

linux系统有两种方法进行内存管理,“调页算法”“交换技术”
调页算法:
将内存不经常使用的页面换到磁盘,常用的页面(活动页面)保留在内存

交换技术:
系统将整个进程,而不是部分页面,全部换到磁盘