文章目录
2.5 在中断上下文中能不能调用包含GFP_KERNEL分配掩码的内存分配函数?
在中断上下文中不能使用包含GFP_KERNEL分配掩码。这里我们扩展了GFP_ATOMIC的知识。
2.5.1 zone水位
基础知识需要先了解一下zone water水位的知识。
- HIGH: 系统的free内存大于HIGH水位的时候,是一个相对保险的值,不需要急着做内存回收(reclaim);
- LOW: 系统的free内存达到LOW水位的时候,启动后台kswapd进行内存回收,回收的目标是让空闲内存达到HIGH水位;
- MIN:系统应该保有的最小free内存,当空闲内存达到这个值的时候,kswapd的后台回收可能来不及了,一般用户在申请内存的时候,进行DIRECT RECLAIM。
min水位一般是系统自动换算的,其具体值可以从/proc看出:
$ cat /proc/sys/vm/min_free_kbytes
67584
而LOW水位一般是min125%,HIGH 一般是min150%。
MIN水位以下的内存,只能被紧急情况下的用户申请到,最著名的紧急用户莫过于PF_MEMALLOC用户,task_struct设置了这个标记表示忽略MIN水位。比如回收内存的代码本身也可能需要申请内存,这个时候我们应该给它无限制的