【操作系统之十】内存分页管理与swap

拜拜、爱过 提交于 2019-12-03 04:54:16

一、虚拟内存
电脑里内存分内存条(这里我们叫物理内存)和硬盘,内存条保存程序运行时数据,硬盘持久保存数据。那么虚拟内存是什么?

程序运行会启动一个进程,进程里有程序段、全局数据、栈和堆,这些都会加载到内存里,每一部分都有对应的内存地址,进程就是一直在处理这些地址中数据。
然而在Linux下,进程不能直接读写内存地址。
进程中能访问的地址,只能是虚拟内存地址(virtual memory address)。
操作系统会把虚拟内存地址翻译成真实的内存地址。
这种内存管理方式,称为虚拟内存(virtual memory)。

 

特点
1、虚拟内存地址和物理内存地址类似,都是为数据提供位置索引;
2、虚拟内存地址和物理内存地址通过映射关系来关联;
3、不同进程都有自己的一套虚拟内存地址,用来给自己的进程空间编号;
4、进程的虚拟内存地址相互独立。因此,两个进程空间可以有相同的虚拟内存地址,如0x10001000。
5、应用程序的数据读写操作的是虚拟地址,对物理内存地址一无所知。
6、程序中表达的内存地址,也都是虚拟内存地址。
7、进程对虚拟内存地址的操作,会被操作系统翻译成对某个物理内存地址的操作。


优势:
1、借助虚拟内存地址,操作系统可以保障进程空间的独立性,不同进程就不可能相互篡改对方的数据,进程出错的可能性就大为减少。
2、有了虚拟内存地址,内存共享也变得简单。操作系统可以把同一物理内存区域对应到多个进程空间。这样,不需要任何的数据复制,多个进程就可以看到相同的数据。内核和共享库的映射,就是通过这种方式进行的.


二、内存分页
通过上面对虚拟内存的介绍得知,操作系统必须能高效地翻译虚拟内存和物理内存地址映射。
Linux采用了分页(paging)的方式来记录对应关系。
所谓的分页,就是以更大尺寸的单位页(page)来管理内存。
内存分页,可以极大地减少所要记录的内存对应关系。我们已经看到,以字节为单位的对应记录实在太多。如果把物理内存和进程空间的地址都分成页,内核只需要记录页的对应关系,相关的工作量就会大为减少。
在Linux中,通常每页大小为4KB。
使用命令查看内存页大小:

[root@PCS101 ~]# getconf PAGE_SIZE
4096

多级分页表

单一的连续分页表,需要给每一个虚拟页预留一条记录的位置。但对于任何一个应用进程,其进程空间真正用到的地址都相当有限。我们还记得,进程空间会有栈和堆。进程空间为栈和堆的增长预留了地址,但栈和堆很少会占满进程空间。这意味着,如果使用连续分页表,很多条目都没有真正用到。因此,Linux中的分页表,采用了多层的数据结构。多层的分页表能够充分利用内存空间。

比如两级分页表:一级分页表记录一级表和二级表映射关系,二级表记录二级表和物理地址映射关系。



 

参考:
Linux的内存分页管理
linux内存管理swap分区

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!