文章目录
a. 背景
本文分析了ulimit命令的工作原理及其内核实现机制。ulimit通过系统调用setrlimit/getrlimit与内核交互,资源限制参数存储在进程task_struct结构的signal->rlim数组中,按resource类型组织。用户可通过ulimit -a或/proc//limits查看限制值,内核使用rlimit()接口读取当前进程的限制值进行资源管控。当资源超过限制时,内核会采取相应处理策略。文章以memlock为例,展示了从用户态设置到内核态读取限制值的完整流程,并指出默认限制值在系统启动时初始化。整体阐明了ulimit如何通过内核机制实现资源限制功能。
m. 关键信息
ulimit 命令通常通过系统调用与内核进行交互,常见的系统调用有 setrlimit 和 getrlimit。在 kernel/syscalls.c 中。
m.1 ulimit命令查看限制:ulimit -a

m.2 通过proc查看:cat /proc/555474/limits

m.3 内核代码中该部分的结构:

并且可以看到rlimit的数据实际存在于进程的task_struct的signal中的rlim中。并且这个数组是根据resource来组织的,resource就是ulimit -a列出的item数。

m.4 如何读取当前task_struct的limit
以memlock为例:

m.5 用户态程序如何设置rlimit:

m.6 启动启动默认的rlimit值:

m.7 如果超过资源限制后的处理策略:

综述
通过简要分析ulimit的原理,并且结合memlock的资源限制配置和使用情况,可以看到ulimit主要利用系统调用下发配置值到内核中,系统调用通过resource来指定参数。并且内核中通过task_struct的signal的rlimit的数组存储不同资源的配置值,配置值有两种cur和max。 然后需要使用的地方,直接读取当前进程的limit值进行判断,并且读取的方式使用内核接口rlimit函数,该函数本质就是读取当前进程task_struct的对应资源值。
内核链接:https://github.com/torvalds/linux

845

被折叠的 条评论
为什么被折叠?



