Linux内核管理之分配掩码(三)_gfp_mask(2)
在Linux2.6.24内核中,为了解决外碎片化的问题,引入了迁移类型,因此在分配内存时也需要指定所分配的页面具有哪些移动属性。
| 标志 | 描述 |
|---|---|
| __GFP_MOVABLE | 页面可以被迁移或者回收,比如内存规整 |
| __GFP_RECLAIMABLE | 在slab分配器中指定了SLAB_RECLAIM_ACCOUNT标志位,表示slab中使用的页面可以通过shrinkers来回收 |
| __GFP_HARDWALL | 使能cpuset内存分配策略 |
| __GFP_THISNODE | 从指定的内存节点中分配内存,并且没有回退机制 |
| __GFP_ACCOUNT | 分配过程中会被kmemcg记录 |
水位修饰符
水位修饰符用来控制是否可以访问系统紧急预留的内存
| 标志 | 描述 |
|---|---|
| __GFP_HIGH | 表示分配内存具有高优先级,并且这个分配请求是很有必要的,分配器可以使用紧急的内存池 |
| __GFP_ATOMIC | 表示分配内存的过程不能执行页面回收或者睡眠动作,并且具有很高的优先级。常用的场景是在中断上下文分配内存 |
| __GFP_MEMALLOC | 分配过程中允许访问所有的内存,包括系统预留的紧急内存 |
| __GFP_NOMEMALLOC | 分配过程中不允许访问系统预留的紧急内存 |
页面回收修饰符
| 标志 | 描述 |
|---|---|
| __GFP_IO | 允许开启I/O传输 |
| __GFP_FS | 允许调用底层的文件系统。。清楚这个标志位通常是为了避免死锁的发生 |
| __GFP_DIRECT_RECLAIM | 分配内存的过程中调用直接页面回收机制 |
| __GFP_KSWAPD_RECLAIM | 表示当到达内存管理区的低水位时会唤醒kswapd内核现成去异步地回收内存,直到内存管理区恢复到高水位为止 |
| __GFP_RECLAIM | 用来允许或禁止直接页面回收和kswapd内核线程 |
| __GFP_REPEAT | 当分配失败时会继续尝试 |
| __GFP_NOFAIL | 当分配失败时会无限地尝试下去,直到分配成功为止。当分配者希望分配内存不失败时,应该使用这个标志位,而不是自己写一个while循环来不断调用页面分配接口函数 |
| __GFP_NORETRY | 当直接页面回收和内存规整等机制都使用了还是无法分配内存时,就不用去重复尝试分配了,直接返回NULL |
行动修饰符
| 标志 | 描述 |
|---|---|
| __GFP_COLD | 分配的内存不会马上被使用 |
| __GFP_NOWARN | 关闭分配过程中的一些错误报告 |
| __GFP_ZERO | 返回一个全部填充为0的页面 |
| __GFP_NOTRACK | 不被kmemcheck机制跟踪 |
| __GFP_OTHER_NODE | 在远端一个内存节点上分配 |
类型标志
对于内核开发者或者驱动开发者来说,要正确使用这些标志位是一件很困难的事情,因此定义了一些常用的分配掩码的组合,成为类型标志。类型标志提供了内核开发中常用的分配掩码的组合,推荐开发者使用这些类型标志。
一般来说,__GFP开头的就为分配掩码,GFP开头的(没有下划线)的就是类型标志
| 标志 | 描述 |
|---|---|
| GFP_ATOMIC | 调用者不能睡眠并且保证分配会成功。它可以访问系统预留的内存,这个标志位通常使用在中断处理程序、下半部、持有自旋锁或者其他不能睡眠的地方 |
| GFP_KERNEL | 内核分配内存最常用的标志位之一。它可能会被阻塞,即分配过程可能会睡眠 |
| GFP_NOWAIT | 分配不允许睡眠等待 |
| GFP_NOIO | 不需要启动任何的I/O操作。比如使用直接回收机制去丢弃干净的页面或者为slab分配的页面 |
| GFP_NOFS | 不会访问任何的文件系统的接口和操作 |
| GFP_USER | 通过用户空间的进程用来分配内存,这些内存可以被内核或者硬件使用。常用的一个场景是,硬件使用的DMA缓冲器要映射到用户空间,比如显卡的缓冲器 |
| GFP_DMA/GFP_DMA32 | 使用ZOME_DMA或者ZOME_DMA32来分配内存 |
| GFP_HIGHUSER | 用户空间进程用来分配内存,优先使用ZONE_HIGHME,这些内存可以被映射到用户空间,内核空间不会直接访问这些内存,另外这些内存不能被迁移 |
| GFP_HIGHUSER_MOVEABLE | 类似GFP_HIGHUSER,但是页面可以被迁移 |
上面表格中的类型标志都是非常常用的分配掩码组合,在实际使用的过程汇总需要注意以下事项。
GFP_KERNEL
GFP_KERNEL是最常见的内存分配掩码之一,主要用于分配内核使用的的内存,需要注意的是分配过程中会引起睡眠,这在中断上下文以及不能睡眠的内核路径里调用该分配掩码需要特别警惕,因为会引起死锁或者其他系统异常GFP_ATOMIC
为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)