5大核心功能解放双手:京东自动化脚本工具全攻略

核心内容摘要

语音活动检测新选择:FSMN-VAD离线版来了
2025年YOLO算法案例应用领域应用趋势

AI专著撰写必备!优质工具大集合,让专著生成不再是难事

linux内核物理页面分配函数alloc_pages(...)在进行页面分配时非常重要的一个步骤就是判断当前Zone中可用页面减去分配需求页面后的剩余可用页面和低水位值(ALLOC_WMARK_LOW)之间的关系如果低于最水位值则开始直接回收,否则可以继续分配。

其中判断关键步骤由函数zone_watermark_ok(...)实现下面开始分析该函数bool zone_watermark_ok(struct zone *z, unsigned int order, unsigned long mark,int classzone_idx, int alloc_flags) { return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,zone_page_state(z, NR_FREE_PAGES)); }zone_watermark_ok-__zone_watermark_ok#define ALLOC_HARDER 0x10 /* try to alloc harder */ #define ALLOC_HIGH 0x20 /* __GFP_HIGH set */ #define ALLOC_CPUSET 0x40 /* check for correct cpuset */ #define ALLOC_CMA 0x80 /* allow allocations from CMA areas */ #define ALLOC_FAIR 0x100 /* fair zone allocation */ /* Return true if free pages are above mark. This takes into account the order of the allocation. */ static bool __zone_watermark_ok(struct zone *z, unsigned int order,unsigned long mark, int classzone_idx, int alloc_flags,long free_pages) { /* free_pages may go negative - thats OK */ /*mark值为水位值,分配物理页面后剩余的物理页面和水位值之间的关系*/ long min mark; int o; long free_cma 0; /*去除需要分配的物理页面*/ free_pages - (1 order) - 1; if (alloc_flags ALLOC_HIGH) min - min / 2; if (alloc_flags ALLOC_HARDER) min - min / 4; #ifdef CONFIG_CMA /* If allocation cant use CMA areas dont use free CMA pages */ if (!(alloc_flags ALLOC_CMA)) free_cma zone_page_state(z, NR_FREE_CMA_PAGES); #endif if (free_pages - free_cma min z-lowmem_reserve[classzone_idx]) return false; for (o 0; o order; o) { /* At the next order, this orders pages become unavailable */ free_pages - z-free_area[o].nr_free o; /*nr_freeo转换为order中空闲页面数*/ /* Require fewer higher order pages to be free */ min 1; if (free_pages min) return false; } /*free_pages min即可*/ return true; }注意下面部分代码:if (alloc_flags ALLOC_HIGH) min - min / 2; if (alloc_flags ALLOC_HARDER) min - min / 4;Q:为什么存在min - min / 2; min - min / 4; 的操作?A:当分配请求携带ALLOC_HIGH或ALLOC_HARDER标志时,内核会放宽水位检查(如min减半),允 许分配后剩余页略低于lowmem_reserve[]if (alloc_flags ALLOC_HIGH)min - min / 2;/*高优先级分配:水位要求减半,这样对水位的要就就降低,允许在不满足条件下也能优先分配*/if (alloc_flags ALLOC_HARDER)min - min / 4;/*更紧急分配:水位要求减1/4,这样对水位的要就就降低,允许在不满足条件下也能优先分配*/这里体现了通过 ALLOC_HIGH/ALLOC_HARDER放宽水位要求,适应紧急分配场景。

继续下面这部分代码:if (free_pages - free_cma min z-lowmem_reserve[classzone_idx]) return false;要求zone空闲页面小于水位值和zone紧急内存(lowmem_reserve)之和。

zone-lowmem_reserve[]的保留内存是逻辑上的最小空闲页保障,而非物理上已分配的内存块。

其使用体现在:正常分配:从Zone的空闲页中分配,通过水位检查确保分配后剩余页≥ min lowmem_reserve[idx](即不突破预留底线)。

极端情况:高优先级分配或OOM killer可能临时突破预留底线,动用原本应保留的空闲页,但这是应急机制,非常规分配。

继续分析下面代码:for (o 0; o order; o) { /* At the next order, this orders pages become unavailable */ free_pages - z-free_area[o].nr_free o; /*nr_freeo转换为order中空闲页面数*/ /* Require fewer higher order pages to be free */ min 1; if (free_pages min) return false; }Q:为什么min1,即minmin/2?A:高阶分配对连续内存要求更高,但允许更低的水位(通过 min

这部分代码很好的体现了保守估计:扣除所有可能用于分配的页(包括低阶页),确保分配后水位安全逐级放宽要求:高阶分配对连续内存要求更高,但允许更低的水位(通过 min

紧急通道:通过 ALLOC_HIGH/ALLOC_HARDER放宽水位要求,适应紧急分配场景。

抖音成人版-抖音成人版应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123