在linux内核中, 会对一个进程获取系统资源的数量进行限制。那如何实现资源的限制?
linux使用结构体rlimit来实现限制, rlimit是resource limit的缩写。
struct rlimit {
int rlim_cur; /*软限制, 实际的 限制值*/
int rlim_max; /*硬限制, 限制值的限制值,软限制最大不能超过的值*/
}
struct task_struct {
...
struct rlimit rlim[RLIM_NLIMITS]; /*定义这个进程 所能获得的资源数量,a资源、b资源..
}
task_struct结构体中的 限制项 为何是数组?
#define RLIM_NLIMITS 16 定义了rlim[] 数组大小, 也规定了一个系统资源的类型数量
struct rlimit rlim[] 数组中的每一个数组元素 表示 这个进程 可获取 的资源的限制(rlim_cur, rlim_max)
一个进程可获取16种系统资源,如下
#define RLIMIT_CPU0 0 /*每秒CPU时间*/
#define RLIMIT_FSIZE1 1
#define RLIMIT_DATA 2
#define RLIMIT_STACK 3
#define RLIMIT_CORE 4
#define RLIMIT_RSS 5
#define RLIMIT_NPROC 6
#define RLIMIT_NOFILE 7 /*进程能打开文件个数的最大值*/
#define RLIMIT_MEMLOCK 8
#define RLIMIT_AS 9
#define RLIMIT_LOCKS 10
#define RLIMIT_SIGPENDING 11
#define RLIMIT_MSGQUEUE 12
#define RLIMIT_NICE 13
#define RLIMIT_RTPRIO 14
#define RLIMIT_RTIME 15
#define RLIM_NLIMITS 16
define后的数字 定义了 该类型资源在rlim[]数组的位置
同时,linux也提供了两个函数 来获取资源的限制
int getrlimit() 用于 获取 资源的限制
resource:指定 获取那种资源,取值范围1-15(16种资源define)
rlim:存放获取的资源的 限制信息
int setrlimt() 用于 设置 资源的限制
resource:指定对哪种资源 进行设置
rlim:存放设置的信息
两个函数返回值:成功返回0,失败返回非零
可通过:cat/proc/self/limits 查看系统 对以上资源的限制
1、进程的资源限制,通常在 系统初始化时,由进程0 建立;
2、然后,由每个 后续进程 继承;
3、每种实现 都可用自己的方法 对 各种限制 调整;
4、在更改系统资源限制时,必须遵循3条规则:
·软限制值 可 改为 小于等于 硬限制值
·硬限制值 可降低, 但其 必须大于软限制值。这种操作 对普通用户来说 不可逆
·超级用户进程 方可 提高 硬限制值
5、常量RLIMIT_INFINITY 指定一个 无限制 的限制值
6、资源限制 影响到 调用进程,并由其子进程继承。这也意味着,为了影响一个用户的 所有后续进行, 需将资源限制 设置构造在 shell 之中。Bash和Bsh具有内置的ulimit命令,Csh具有内置的limit命令