内存分配水位判断问题__zone_watermark_ok
版本3.10.17static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
int classzone_idx, int alloc_flags, long free_pages)
{
/* free_pages my go negative - that's OK */
long min = mark;
int o;
free_pages -= (1 << order) + 1;这里还要+1是出于什么考虑呢?
if (alloc_flags & ALLOC_HIGH)
min -= min / 2;
if (alloc_flags & ALLOC_HARDER)
min -= min / 4;
if (free_pages <= min + z->lowmem_reserve)
return false;
for (o = 0; o < order; o++) {
/* At the next order, this order's pages become unavailable */
free_pages -= z->free_area.nr_free << o;
/* Require fewer higher order pages to be free */
min >>= 1;
if (free_pages <= min)
return false;
}
return true;
} 还有一个疑问
for (o = 0; o < order; o++) {
/* At the next order, this order's pages become unavailable */
free_pages -= z->free_area.nr_free << o;
/* Require fewer higher order pages to be free */
min >>= 1;这里的每次右移一位,这里的1是基于什么考虑呢?
if (free_pages <= min)
return false;
} super皮波 发表于 2015-01-24 21:31 static/image/common/back.gif
版本3.10.17
static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
...
这里的“-(1 << order) + 1;”应该是一个整体,用于保证free pages至少比min(水线)大一个order,这里的加1应该只是为了对齐而已。
比如order==2时,加入free_pages分别等于:
36
35
34
33
时,水线ok的min的最大值分别为
32 31 30和29 super皮波 发表于 2015-01-24 21:55 static/image/common/back.gif
还有一个疑问
for (o = 0; o < order; o++) {
/* At the next order, this order's page ...
这里的意思应该是:
/*每扣除一个order的块,需要将水线除以2,目的是将水线分担到各个order,当order为3时,最终需要>=32k的内存块的容量>min/8,
才能继续分配内存*/
参考:
http://blog.chinaunix.net/uid-14528823-id-4146032.html
回复 4# humjb_1983
我的意思是每次除以2,基于什么考虑,为什么不是除以3或者其他
super皮波 发表于 2015-01-26 09:56 static/image/common/back.gif
回复 4# humjb_1983
我的意思是每次除以2,基于什么考虑,为什么不是除以3或者其他
这个估计就是经验值了,从与buddy system的一致性来说,以order来移位(除2)看似也是相对合理的。
页:
[1]