在linux内核中,对一个进程获取系统资源的数量进行了限制。那么linux内核是如何实现这种对一个进程的各种资源的限制呢?
linux使用struct rlimit结构体来实现的,rlimit是 resource limit的缩写。
struct rlimit
{
unsigned int rlim_cur; /* soft limit */
unsigned int rlim_max; /* hard limit (ceiling for rlim_cur)*/
}
linux系统对一个进程获取各种系统资源的限制的实现:
struct task_struct
{
struct rlimit rlim[RLIM_NLIMITS]; //这一项定义了一个进程所能获取的系统资源量;
}
接下来对 struct rlimit rlim[]数组进行详细介绍:
#define RLIM_NLIMITS 16 定义了rlim[]数组的大小,同时也规定了一个系统资源的类型数
struct rlimit rlim[]数组中的每一个数组元数表示一个进程可以获取的一种系统资源以及一个进程可以获取到的资源的限制(rlim_cur, rlim_max)。
一个进程可以获取的16种系统资源:
每一个difine后面的数字定义了该类资源在struct rlimit rlim[]数组中的位置。
同时linux系统也为我们提供了两个函数来获取系统资源的限制:
#include<sys/time.h>
#include<sys/resource.h>
int getrlimit(int resource , struct rlimit &rlim) 用于获取系统资源的限制;
resource : 用于指定获取哪种系统资源;
取值范围为:上图中定义的范围: 0 ~ 15;
rlim : 用于存放获取的资源限制信息;
int setrlimit(int resource, struct rlimit *rlim) 用于设置系统资源限制;
resource :用于指定对哪种资源进行设置;
rlim :存放用于设置的信息;
可以通过:cat /proc/self/limits 来查看系统对以上资源的限制:
系统中的每个进程的struct task_struct结构体中的struct rlimit rlim[RLIM_NLIMITS]中的对每个资源的限制时如何来的呢?
在linux系统中启动的时候,运行的第一个进程是 init task进程,这个 init task也是系统中的双向进程描述符表中的第一个元素。也可以说,init task进程是系统中其它所有进程的祖先。因此系统中的其它所有进程的 struct rlimit rlim[]可以通过继承 init task 中的 struct rlimit rlim[]来实现。
来看看linux系统是如何初始化init task 中的 struct rlimit rlim[]的:
linux通过 #define INIT_RLIMITS来对 init task 中的 struct rlimit rlim[]进行初始化,然后之后其他的子进程继承就可以了。
到这而,struct rlimt结构体介绍完毕!