84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
我感觉每个进程“占的内存”加起来应该大于物理内存,怎样的内存管理和调度可以让这几百个进程看起来是一块运行的啊?
ringa_lee
呵呵,这正是虚拟内存要解决的问题。进程分配的内存实际是虚拟内存,实际的物理内存不会立即分配,物理内存仅在访问时通过缺页异常分配,所以所有进程的占用虚拟内存总和是可以超过物理内存的,但物理内存总和不行。top命令结果中,VIRT和RES分别代表虚拟内存和物理内存使用量。关于调度,cpu分时复用,按一定的算法给每个进程分配时间片,简单说,就是每个进程间隔运行一小段时间,由于时间片粒度小(通常ms级别),所以用户和上次业务通常感知不明显。
同一个物理页可以映射到不同进程的地址空间,比如如果多个版本的程序都用同一个Visual C++运行时的DLL,那么只读数据是共享的。一个进程的私有内存才是说占就真占的。
另外,系统会把暂时不用的内存(比如窗口正在被最小化的程序的内存)交换到磁盘上的虚拟内存交换文件,直到下次程序想起来用(比如窗口正在被还原)的时候再交换回来。一个机器上的可用内存应该是对操作系统可见的物理内存(32位的Windows因为地址空间限制一些内存可能用不了)+虚拟内存。
内存不够时会使用硬盘来做虚拟内存。对于linux内核而言,最难的最复杂的就是内存管理这一部分可以看下这本书深入理解Linux虚拟内存管理
呵呵,这正是虚拟内存要解决的问题。
进程分配的内存实际是虚拟内存,实际的物理内存不会立即分配,物理内存仅在访问时通过缺页异常分配,所以所有进程的占用虚拟内存总和是可以超过物理内存的,但物理内存总和不行。top命令结果中,VIRT和RES分别代表虚拟内存和物理内存使用量。
关于调度,cpu分时复用,按一定的算法给每个进程分配时间片,简单说,就是每个进程间隔运行一小段时间,由于时间片粒度小(通常ms级别),所以用户和上次业务通常感知不明显。
同一个物理页可以映射到不同进程的地址空间,比如如果多个版本的程序都用同一个Visual C++运行时的DLL,那么只读数据是共享的。一个进程的私有内存才是说占就真占的。
另外,系统会把暂时不用的内存(比如窗口正在被最小化的程序的内存)交换到磁盘上的虚拟内存交换文件,直到下次程序想起来用(比如窗口正在被还原)的时候再交换回来。一个机器上的可用内存应该是对操作系统可见的物理内存(32位的Windows因为地址空间限制一些内存可能用不了)+虚拟内存。
内存不够时会使用硬盘来做虚拟内存。
对于linux内核而言,最难的最复杂的就是内存管理这一部分
可以看下这本书深入理解Linux虚拟内存管理