每个进程都有一组相关的资源限制(resource limit),限制了指定进程能使用的系统资源数量。
对当前进程的资源限制存放在current->signal->rlim字段,进程的信号描述符的一个字段。该字段类型为rlimit结构的数组,每个资源限制对应一个元素。
struct rlimit {
unsigned long rlim_cur;
unsigned long rlim_max;
};
其中rlim_cur字段是资源的当前资源限制(current->signal->rlim[RLIMIT_CPU])。rlim_cur表示正运行进程所占用cpu时间的当前限制
rlim_max字段是资源限制所允许的最大值。利用getrlimit()和setrlimit()系统调用,用户总能把一些资源的rlim_cur限制增加到rlim_max。只有超级用户(具有CAP_SYS_RESOURCE权能的用户)才能改变rlim_max字段,或把rlim_cur字段设置成大于相应rlim_max字段的一个值。
大多数资源限制包含数值RLIM_INFINITY(0xffffffff),它意味着没有对相应的资源施加用户限制。
#ifndef __ARCH_RLIMIT_ORDER
#define RLIMIT_CPU 0 /* CPU time in ms */进程使用cpu最长时间(秒)。进程超过了这个限制,内核就给它发送一个SIGXCPU信号,然后如果进程还不终止,再发一个SIGKLL信号。
#define RLIMIT_FSIZE 1 /* Maximum filesize */文件大小的最大数值(字节)。如果进程试图把一个文件的大小扩充到大于这个值,内核就给这个进程发SIGXFSZ信号。
#define RLIMIT_DATA 2 /* max data size */堆大小的最大数值(字节)。在扩充进程的堆之前,内核检查这个数值。
#define RLIMIT_STACK 3 /* max stack size */栈大小的最大数(字节)。内核在扩充进程的用户态堆栈之前检查这个数值。
#define RLIMIT_CORE 4 /* max core file size */内核信息转储文件的大小(字节)。当一个进程异常终止时,内核在进程的当前目录下创建内存信息转储文件之前检查这个值。如果限制为0,内核就不创建这个文件。
#define RLIMIT_RSS 5 /* max resident set size */内核所拥有的页框最大数。
#define RLIMIT_NPROC 6 /* max number of processes */内核所拥有的进程最大数。
#define RLIMIT_NOFILE 7 /* max number of open files */打开文件描述符的最大数。当打开一个新文或复制一个文件描述符时,内核检查这个值
#define RLIMIT_MEMLOCK 8 /* max locked-in-memory address space */非交换内存的最大数值(字节)。当进程试图通过mlock()或者mlockall()系统调用锁住一个页框时,内核检查这个数值。
#define RLIMIT_AS 9 /* address space limit */进程地址交换空间的最大数(字节)。当进程使用malloc()函数或相关函数时扩大它的地址空间时,内核检查这个数值。
#define RLIMIT_LOCKS 10 /* maximum file locks held */文件锁的最大数值。
#define RLIMIT_SIGPENDING 11 /* max number of pending signals */进程挂起信号的最大数
#define RLIMIT_MSGQUEUE 12 /* maximum bytes in POSIX mqueues */posix消息队列中的最大字节数
#define RLIM_NLIMITS 13
#endif
#ifdef __KERNEL__
#define INIT_RLIMITS /
{ /
[RLIMIT_CPU] = { RLIM_INFINITY, RLIM_INFINITY }, /
[RLIMIT_FSIZE] = { RLIM_INFINITY, RLIM_INFINITY }, /
[RLIMIT_DATA] = { RLIM_INFINITY, RLIM_INFINITY }, /
[RLIMIT_STACK] = { _STK_LIM, _STK_LIM_MAX }, /
[RLIMIT_CORE] = { 0, RLIM_INFINITY }, /
[RLIMIT_RSS] = { RLIM_INFINITY, RLIM_INFINITY }, /
[RLIMIT_NPROC] = { 0, 0 }, /
[RLIMIT_NOFILE] = { INR_OPEN, INR_OPEN }, /
[RLIMIT_MEMLOCK] = { MLOCK_LIMIT, MLOCK_LIMIT }, /
[RLIMIT_AS] = { RLIM_INFINITY, RLIM_INFINITY }, /
[RLIMIT_LOCKS] = { RLIM_INFINITY, RLIM_INFINITY }, /
[RLIMIT_SIGPENDING] = { MAX_SIGPENDING, MAX_SIGPENDING }, /
[RLIMIT_MSGQUEUE] = { MQ_BYTES_MAX, MQ_BYTES_MAX }, /
}
#endif
#ifndef RLIM_INFINITY
#define RLIM_INFINITY (~0UL)
#endif
#ifndef _STK_LIM_MAX
#define _STK_LIM_MAX RLIM_INFINITY
#endif
linux 2.6源代码情景分析笔记之进程6
最新推荐文章于 2022-05-01 14:02:08 发布