Linux内核管理之分配掩码(三)

Linux内核管理之分配掩码(三)

分配掩码是linux内存管理中非常重要的一个参数,它影响着页面分配的整个流程。

分配掩码gfp_mask定义在include/linux/gfp.h文件中,这些标志位在Linux4.4内核中被重新归类,大致可以分成以下几类:

  • 内存管理区修饰符(zone modifier)
  • 移动修饰符(mobility and placement modifier)
  • 水位修饰符(watermark modifier)
  • 页面回收修饰符(page reclaim modifier)
  • 行动修饰符(action modifier)

内存管理区修饰符

内存管理区修饰符主要是用来表示应当从哪些内存管理区中来分配物理内存。内存管理区修饰符使用gfp_mask的最低4个比特位来表示

标志描述
__GFP_DMA从ZONE_DAM中分配内存
__GFP_DMA32从ZONE_DMA32中分配内存
__GFP_HIGHMEM优先从ZONE_HIGHMEN中分配内存

移动修饰符

移动修饰符主要用来指示分配出来的页面具有的移动属性。

在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
    GFP_ATOMIC这个标志位正好和GFP_KERNEL相反,它可以使用在不能睡眠的内存分配路径上,比如中断处理程序、软中断以及tasklet等。GFP_KERNEL可以让调用者睡眠等待系统页面回收来释放一些内存,但是GFP_ATOMIC不可以,所以有可能会分配失败。

  • GFP_USERGFP_HIGHUSERGFP_HIGHUSER_MOVEABLE
    这三个标志位都是为用户空间进程分配内存的。不同之处在于,GFP_HIGHUSER首先使用高端内存,GFP_HIGHUSER_MOVEABLE首先使用高端内存并且分配的内存具有可迁移性

  • GFP_NOINGFP_NOFS
    这两个标志位都会产生阻塞,它们用来避免某些其他的操作。
    GFP_NOIO表示分配过程中绝不会启动任何磁盘I/O的操作。
    GFP_NOFS表示分配过程中绝不会启动文件系统的相关操作。
    举个例子,假设进程A在执行打开文件的操作中需要分配内存,这时内存短缺了,那么进程A会睡眠等待,系统的OOM Killer机制会选择一个进程杀掉。假设选择了进程B,而进程B退出时需要执行一些文件系统的操作,这些操作可能会去申请锁,而恰巧进程A持有这个锁,所以死锁就发生了。

常用类型标志的使用

待完成

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux操作系统基础是指对Linux操作系统的基本概念、原理和操作方法的理解和掌握。作为一种开源的操作系统,Linux在人民邮电领域的应用广泛,具有安全稳定、高效性能和灵活自由等特点。 首先,Linux操作系统是一种基于UNIX的多用户、多任务操作系统,具有良好的稳定性和兼容性。它的核心是Linux内核,负责管理硬件资源、提供系统调用接口,通过内核管理和调度,实现对计算机系统的各种资源的管理分配。 其次,Linux操作系统采用了文件系统来组织和管理文件,提供了一套完整的权限控制机制,保护用户的数据安全,并通过目录树的方式方便用户进行文件的管理和查找。 此外,Linux操作系统支持多任务处理和进程管理,可以同时运行多个应用程序,并通过进程调度算法来合理地分配CPU资源,实现多任务的高效运行。 此外,Linux操作系统还提供了丰富的命令行工具和图形化界面,用户可以根据自己的需求选择命令行或图形界面进行操作。对于初学者来说,可以通过学习常用的命令,如ls、cd、cp、rm等,来进行文件和目录的操作。 最后,Linux操作系统广泛应用于人民邮电领域,如邮件服务器、文件服务器、安全防护设备等。由于其开源的特性,可以根据需求进行定制和扩展,满足不同场景的需求。 总之,掌握Linux操作系统基础知识对于人民邮电领域的从业人员来说是非常重要的。只有深入理解Linux操作系统的原理和机制,掌握常用的命令和工具,才能更好地进行系统管理和应用开发工作。 ### 回答2: Linux操作系统是一种开源的、免费的操作系统。它的核心是Linux内核,由芬兰人Linus Torvalds开发并于1991年首次发布。Linux操作系统的特点是稳定、安全、高效和灵活。它可以运行在各种硬件平台上,并且支持多任务处理和多用户操作。 Linux操作系统有许多变种,如Ubuntu、Fedora、Red Hat等,每个变种都有不同的特点和应用领域。人民邮电是一家相关IT领域的公司,在其日常的运维管理和服务器管理中,应用Linux操作系统非常普遍。 Linux操作系统基础包括以下几个方面: 1. 命令行操作:Linux操作系统的主要界面是命令行界面。学习Linux需要掌握一些基本的命令行操作,如文件和目录管理、进程管理等。 2. 文件系统:Linux操作系统使用了一种层级的、由根目录开始的文件系统结构。学习Linux需要了解文件系统的基本概念和操作方法,如文件和目录的权限、链接等。 3. 用户管理Linux操作系统支持多用户操作,学习Linux需要了解用户的创建、删除和权限管理等操作。 4. 网络设置:Linux操作系统支持网络功能,学习Linux需要了解网络设置和配置,如IP地址、子网掩码、网关等。 5. 软件安装:Linux操作系统拥有庞大的软件仓库,可以通过包管理器来安装和升级软件。学习Linux需要了解软件包管理器的使用方法。 总之,学习Linux操作系统基础是非常重要的,它可以帮助我们更好地理解和使用Linux系统,在人民邮电等IT公司的工作中提高工作效率和技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值