日期:2014-05-16  浏览次数:20836 次

(莱昂氏unix源代码分析导读-27) Swap in/out (上)

                                                     By   cszhao1980

Swap in/out指的是进程在物理内存(core空间)和磁盘交换文件间的双向移动过程,进程在active状态时,

segment必然被swap in内存空间(core空间),而一旦处于非活动状态就有可能swap out到磁盘交换

文件中。换进换出的过程必然涉及到磁盘io——这可看作是比较低层的操作,因此,这部分内容可以分

为两部分:高层的模型和低层的实际io

1 高层模型

Unix使用“swapmap”这个高层模型来记录swap区域,swapmap类似coremap,都是map结构:

2515: struct map

2516: {

2517:    char *m_size;

2518:    char *m_addr;

2519: };

 

区别是:

(1)         swap mapm_size的单位是“磁盘块”,即512个字节;

(2)         swap mapm_addr为“磁盘块号”——而不是内存block号。

 

使用“swapmap”来管理swap空间有一个巨大的好处——同“coremap”一样,对空间资源

的管理可以通过高层函数malloc()free()来实现。

整个swap区域由main函数初始化:

1583: mfree(swapmap, nswap, swplo);

4697: int swplo 4000; /* cannot be zero */

4698: int nswap 872;

 

因此,swap区域即定义为自磁盘第4000块开始,连续872个块。 

在进行换进换出时,必须包括进程的“私有空间”——也被称为“swappable image”,