【Linux内核之swap区】 关于swapfree和swaptotal

Biscuit_rar 2009-08-18 11:21:12
不知道有没有高人也曾关注过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分~~~)
...全文
1794 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dc2002007 2009-12-07
  • 打赏
  • 举报
回复
受教了 不错的贴
Biscuit_rar 2009-08-31
  • 打赏
  • 举报
回复
最近又仔细查阅了一下资料
发现swap区的状态为SWP_USED这种情况还是很可能发生的。
因为在sys_swapoff()函数中(此函数是关闭swap区时有系统调用触发),首先会将swap状态置为SWP_USED,而在关闭swap区时要调用try_to_unuse()函数将此区中所有的page换入RAM,这就需要从init_mm内存描述符开始,访问所有内核线程和进程的地址空间。这是一个相当耗时的操作,因此如果在try_to_unuse()执行期间,si_swapinfo()函数进行采集swap信息,那么次swap的状态必然为SWP_USED。(之前一直迷惑于swap的状态何时可以为SWP_USED,其实这种状态只是一种时间差上的存在。)

swap这一块调查的童鞋可能不是很多,问题也米人看,哎~~
lcsicnoah 2009-08-21
  • 打赏
  • 举报
回复
看了,快送分
Biscuit_rar 2009-08-18
  • 打赏
  • 举报
回复
压根儿没人看??

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧