进程占用的内存可以有以下这些类型:自身的代码
共享库的代码
运行过程分配的堆和栈
通过mmap映射的磁盘文件内容
1. 虚拟内存与物理内存
这里要区分两个概念,虚拟内存和物理内存。物理内存对于进程来说是透明的,进程直接操作的是虚拟内存。而数据和代码是存放在真实的物理内存的,之所以进程在虚拟内存中寻址可以获取数据,是由于虚拟内存与物理内存存在着映射关系。
当我们的进程向系统申请内存时,比方通过malloc方法,得到的其实是虚拟内存,假如进程没有使用这些虚拟内存,那么它们是不会和物理内存关联起来的。比方假如我们malloc 10MB的内存,但是只用了一个byte的,那么进程实际得到的只有一个页的物理内存,也就是4096byte的内存空间。当物理内存被换出到磁盘(swap out),虚拟内存对应的地址还是有效的,假如寻址到这些地址,对应的物理内存就会被换入到内存(swap in)。
虚拟内存是连续的,而物理内存却不肯定。
2. 共享的内存
从进程自身的角度看,虚拟内存是进程独立的,所有内存都是私有的,包括自身代码、共享库、堆栈等,它不用关心共享内存的事情。但实际上在物理内存的层面,很多东西是可以共享的,比方共享的代码库(.so)、自身代码甚至是自身运行时私有的堆栈内存。
2.1 共享库
同一个共享库的代码在物理内存中只会存在一份,这块内存会映射到不同进程的虚拟内存中,对各个进程来说,就像是自己私有的内存一样,而对于系统来说,则是节省了内存的资源。
2.2 进程自身的代码
同样,同一份代码运