【Linux内核之swap区】 关于swapfree和swaptotal
不知道有没有高人也曾关注过linux下的swap区呢?
最近调查了一下/proc/meminfo下关于swap数据的来源
已基本清楚swap区的分配与使用过程
大概流程如下
swap区可在系统启动时由脚本文件启动也可以在启动后动态启动
以我所调查的2.6.18版本来说,是有脚本启动的
具体见/etc/rc.sysinit文件,通过查找“swaping”关键字可以找到具体脚本程序
(由于版本差异,此处就不贴出具体代码了,相信大家可以自己找到)
此脚本程序启动后,会执行swap_on()函数,由此进入swap区的分配及换页操作。
swap_on()函数主要初始化一个新的swap区, 并累加nr_swap_pages和total_swap_pages两个全局变量(这两个全局变量可是主角哦,meminfo下的swap数据就是由这两个全局变量得来的。)
具体的换页操作由守护线程kswapd()来执行
具体如下,以换出页为例,即将一页从RAM中换出到SWAP区:(注意,此处函数名都是参照2.6.18版本的)
kswapd()-->balance_pgdat()-->shrink_zone()-->shrink_inactive_list()-->shrink_page_list()(核心函数)-->add_to_swap()-->get_swap_page()-->。。。。。(后续工作,略)
以上过程中是修改nr_swap_pages和total_swap_pages两个全局变量的关键性代码。
当取消swap区时,系统调用swapoff()函数,试图将swap区内的所有页换入到RAM中后释放SWAP区,但是由于SWAP区中每一页都有可能正在被若干进程引用,所以此函数在换进过程中很有可能失败。
释放SWAP区时会调用delete_from_swap_cache()函数将swapcache中的一页释放掉(额,此处又牵扯到swapcache这个新东西,其实它只是为了解决进程同步问题而存在的,不过真的是个好东西),其中的swap_entry_free()函数也会改变全局变量nr_swap_pages()。
OK,以上简单描述了一下swap的过程,
然后,/proc/meminfo下的数据是由fs/proc/proc_misc.c下的meminfo_read_proc()函数显示出来的,其中swap的数据主要由root/mm/swapfile.c下的si_swapinfo()函数取得,由此函数可以看出swap的数据是由nr_swap_pages和total_swap_pages两个全局变量分别加上nr_to_be_unused这个局部变量得来~!!
到此,问题出现了:
nr_to_be_unused这个局部变量到底代表了什么意思??!!
当一个swap区是SWP_USED状态而不是SWP_WRITEOK状态时,是一种什么情况??
而且加上的是swap区的正在被使用的页数inuse_pages,这个实在想不通了。
(本人已通查内核代码关于设置swap区的flag的地方,没有发现能让swap区只是SWP_USED状态的地方。只有当swapon()函数刚好将一个swap区设置成SWP_USED状态,而这边就去取数据的那一瞬间可能存在这种情况,但是此时的inuse_pages成员变量必然是0,追加inuse_pages的话毫无意义。)
描述的不够细致,请大家谅解。还请有研究过的高人指点一二~!!
以上!
(没分了,实在不好意思,只能送上10分~~~)