【微知】linux命令ulimit的原理简要分析?(task_struct->signal->rlimt、RLIMIT_MEMLOCK)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值