`

进程资源限制

阅读更多
    每个进程都有一组资源限制,进程的资源限制通常是在系统初始化时由 0 进程建立的,然后由后续进程继承。每种实现都可以用自己的方法对资源限制做出调整。可以使用 getrlimit 和 setrlimit 函数来查询和修改进程的资源限制。
#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
                    /* 返回值:若成功,都返回 0;否则,都返回非 0 */

struct rlimit{
    rlim_t rlim_cur;        // soft limit: current limit
    rlim_t rlim_max;        // hard limit: maximum value for rlim_cur
};

    在更改资源限制时,须遵循下列 3 条规则。
    (1)任何一个进程都可将一个软限制值更改为小于或等于其硬限制值。
    (2)任何一个进程都可降低其硬限制值,但必须不小于其软限制值。这种降低对普通用户而言是不可逆的。
    (3)只有超级用户进程可以提高硬限制值。
    常量 RLIM_INFINITY 指定了一个无限量的限制。
    下图显示了 resource 参数的可选值中哪些是由 Single UNIX Specification 定义以及常用UNIX 系统的支持情况。

    其中各个值的说明如下。
    * RLIMIT_AS:进程总的可用存储空间的最大长度(字节)。这影响到 sbrk 函数和 mmap 函数。
    * RLIMIT_CORE:core 文件的最大字节数,若其值为 0 则阻止创建 core 文件。
    * RLIMIT_CPU:CPU 时间的最大量值(秒),当超过此软限制时,向进程发送 SIGXCPU 信号。
    * RLIMIT_DATA:数据段的最大字节长度。这是初始化数据、非初始化以及堆的总和。
    * RLIMIT_FSIZE:可以创建的文件的最大字节长度。当超过此软限制时,则向该进程发送 SIGXFSZ 信号。
    * RLIMIT_MEMLOCK:一个进程使用 mlock(2) 能够锁定在存储空间中的最大字节长度。
    * RLIMIT_MSQQUEUE:进程为 POSIX 消息队列可分配的最大存储字节数。
    * RLIMIT_NICE:为了影响进程的调度优先级,nice 值可设置的最大限制。
    * RLIMIT_NOFILE:每个进程能打开的最多文件数。更改此限制将影响到 sysconf 函数在参数 _SC_OPEN_MAX 中返回的值。
    * RLIMIT_NPROC:每个实际用户 ID 可拥有的最大子进程数。更改此限制将影响到 sysconf 函数在参数 _SC_CHILD_MAX 中返回的值。
    * RLIMIT_NPTS:用户可同时打开的伪终端的最大数量。
    * RLIMIT_RSS:最大驻内存集字节长度(resident set size in bytes,RSS)。如果可用的物理存储器非常少,则内核将从进程处取回超过 RSS 的部分。
    * RLIMIT_SBSIZE:在任一给定时刻,一个用户可以占用的套接字缓冲区的最大长度(字节)。
    * RLIMIT_SIGPENDING:一个进程可排队的信号最大数量。这个限制是 sigqueue 函数实施的。
    * RLIMIT_STACK:栈的最大字节长度。
    * RLIMIT_SWAP:用户可消耗的交换空间的最大字节数。
    * RLIMIT_VMEM:RLIMIT_AS 的同义词。
    资源限制影响到调用进程并由其子进程继承。这意味着,为了影响一个用户的所有后续进程,需要将资源限制的设置构造在 shell 中,比如 Bourne shell、GNU Bourne-again shell 和 Kom shell 就具有内置的 ulimit 命令,C shell 具有内置的 limit 命令。
    下列程序打印由系统支持的所有资源当前的软限制和硬限制(注意,有些平台定义 rlim_t 为 unsigned long long 而非 unsigned long。有些限制作用于文件大小,因此 rlim_t 类型必须足够大才能表示文件大小限制。为了避免使用错误的格式说明而导致编译器警告,通常会首先把限制复制到 64 位整型,这样只需处理一种格式)。
#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>

#define doit(name)	pr_limits(#name, name);

static void pr_limits(char *, int);

int main(void){
#ifdef RLIMIT_AS
	doit(RLIMIT_AS);
#endif
	doit(RLIMIT_CORE);
	doit(RLIMIT_CPU);
	doit(RLIMIT_DATA);
	doit(RLIMIT_FSIZE);
#ifdef RLIMIT_MEMLOCK
	doit(RLIMIT_MEMLOCK);
#endif
#ifdef RLIMIT_MSGQUEUE
	doit(RLIMIT_MSGQUEUE);
#endif
#ifdef RLIMIT_NICE
	doit(RLIMIT_NICE);
#endif
	doit(RLIMIT_NOFILE);
#ifdef RLIMIT_NPROC
	doit(RLIMIT_NPROC);
#endif
#ifdef RLIMIT_NPTS
	doit(RLIMIT_NPTS);
#endif
#ifdef RLIMIT_RSS
	doit(RLIMIT_RSS);
#endif
#ifdef RLIMIT_SBSIZE
	doit(RLIMIT_SBSIZE);
#endif
#ifdef RLIMIT_SIGPENDING
	doit(RLIMIT_SIGPENDING);
#endif
	doit(RLIMIT_STACK);
#ifdef RLIMIT_SWAP
	doit(RLIMIT_SWAP);
#endif
#ifdef RLIMIT_VMEM
	doit(RLIMIT_VMEM);
#endif
	exit(0);
}

static void pr_limits(char *name, int resource){
	struct rlimit	limit;
	unsigned long long lim;
	if(getrlimit(resource, &limit) < 0){
		printf("getrlimit error for %s\n", name);
		return;
	}
	printf("%-14s ", name);
	if(limit.rlim_cur == RLIM_INFINITY){
		printf("(infinite) ");
	}else{
		lim = limit.rlim_cur;
		printf("%10lld ", lim);
	}
	if(limit.rlim_max == RLIM_INFINITY){
		printf("(infinite)");
	}else{
		lim = limit.rlim_max;
		printf("%10lld", lim);
	}
	putchar((int)'\n');
}

    注意,在 doit 宏中使用了 ISO C 的字符串创建运算符“#”,以便为每个资源名产生字符串值。
    Linux 系统上的运行结果如下。
$ ./resourceLimit.out 
RLIMIT_AS      (infinite) (infinite)
RLIMIT_CORE             0 (infinite)
RLIMIT_CPU     (infinite) (infinite)
RLIMIT_DATA    (infinite) (infinite)
RLIMIT_FSIZE   (infinite) (infinite)
RLIMIT_MEMLOCK      65536      65536
RLIMIT_MSGQUEUE     819200     819200
RLIMIT_NICE             0          0
RLIMIT_NOFILE       65535      65535
RLIMIT_NPROC         1024      65535
RLIMIT_RSS     (infinite) (infinite)
RLIMIT_SIGPENDING       3810       3810
RLIMIT_STACK     10485760 (infinite)
  • 大小: 16.1 KB
分享到:
评论

相关推荐

    64位windows操作系统上解除32位应用程序单进程内存限制工具

    WOW64则是一种在64位Windows下运行32位应用程序的模拟层,它可以调整某些系统限制,以便32位应用程序能够更好地利用64位系统的资源。 这个工具的使用可能会涉及到以下步骤: 1. 下载并运行`memory.exe`,这是一个...

    AIX操作系统(中文)\进程管理.pdf

    进程资源限制 AIX允许管理员设置进程的资源限制,包括最大虚拟内存大小、最大文件大小、打开文件的最大数目等,这有助于防止资源耗尽和提高系统的安全性。 #### 6. 进程监控与调试 AIX提供了多种工具和命令来...

    理解UNIX进程(英).pdf

    UNIX提供了对进程资源限制的软限制和硬限制,可以调整这些限制以控制进程资源使用。进程有环境变量,这是一组定义进程运行环境的字符串集合。进程可以通过命名来标识自己,并且在执行完毕后提供退出代码。 UNIX进程...

    LINUX教程——进程PPT

    `jobs`命令可以列出当前shell会话中的作业,而`kill`命令用于向进程发送信号以结束进程,`limit`则用于设置进程资源限制。 了解这些基础知识对于理解和管理Linux系统中的进程至关重要,无论是日常使用还是进行系统...

    linux 进程控制阅读笔记

    此外,`nice()`和`renice`命令可以改变进程的优先级,`setrlimit()`用于设置进程资源限制。 守护进程(Daemon)在Linux中是一种特殊类型的后台进程,它们不与任何终端关联,通常用于提供系统服务。创建守护进程通常...

    API.rar_API 线程_创建进程_操作系统 进程_进程 创建 线程

    而跨进程通信则可以解决单个进程资源限制的问题。 在提供的压缩包文件中,"www.pudn.com.txt"可能包含了关于这个主题的进一步资料,而"创建进程"可能是示例代码或者详细教程。通过阅读这些文件,你可以更深入地学习...

    最新整理Linux操作系统的进程管理详解.doc

    在Linux中,进程的状态管理还包括调度策略、优先级调整、资源限制等方面,比如nice值和renice命令可以改变进程的执行优先级,而ulimit命令可以设置进程资源限制,如最大文件描述符数量等。 总的来说,理解并熟练...

    linux下 rlimit

    在Linux系统中,rlimit机制是用于控制进程资源限制的关键组件。通过rlimit,系统管理员或用户能够设定进程可以消耗的资源上限,这对于防止资源过度消耗、提高系统稳定性及安全性至关重要。本文将深入探讨rlimit的...

    疯狂内核之——进程管理子系统

    ##### 1.7.3 进程资源限制 为了限制进程的资源使用,Linux内核提供了一系列机制,例如通过`struct rlimit`结构体来设置进程的最大资源消耗限制,包括但不限于CPU时间、文件大小、堆栈大小等。 #### 1.8 系统调用...

    working-with-unix-processes

    进程资源限制是系统资源管理的一部分,它规定了进程能够使用资源的最大限度。在Unix系统中,资源限制可以分为软限制和硬限制,软限制是实际可设置的资源上限,而硬限制则是软限制的上限。可以使用getrlimit()和...

    mysql数据库测试报告

    - 使用命令`echo-n'Maxprocesses=SOFT_LIMITS:HARD_LIMITS'&gt;/proc/`pidofmysqld`/limits`可以在不重启MySQL的情况下动态调整进程资源限制。 - **知识点6:解决并发连接问题** - 当MySQL服务提供长连接且需要支持...

    Linux/Android cgroup架构分析研究总结

    Linux/Android cgroup架构是操作系统中用于管理进程资源限制的关键机制。cgroup,全称为control groups,它允许管理员或系统设定一组进程的资源使用限制,包括CPU、内存、磁盘I/O、网络带宽等。在Linux内核中,...

    Linux process

    七、进程资源限制 通过`ulimit`命令,系统管理员可以设置单个用户或进程的资源限制,如打开文件描述符的数量、最大虚拟内存大小等,以防止资源滥用。 八、进程树 在Linux中,进程形成了一棵树状结构,根节点是init...

    易语言进程通讯多开限制

    然而,在某些情况下,我们需要对进程通信进行限制,以避免资源过度消耗或确保系统的稳定运行。本篇将深入探讨“易语言进程通讯多开限制”这一主题。 首先,让我们理解什么是进程通讯。在操作系统中,进程是程序执行...

    Linux编程接口 - Linux和UNIX系统编程手册

    - **进程资源限制**:对进程资源使用的限制。 - **守护进程**:后台服务程序的开发。 - **安全的特权程序编写**:编写具有高权限的程序的安全性考虑。 - **能力管理**:授予进程特定的超级用户权限。 - **登录会计**...

    Can't create TCP/IP socket(24).原因及解决办法

    1. "ulimit显示open file能进程能打开的文件数默认是1024.txt":ulimit命令用于设置和查看进程资源限制,其中包括最大打开文件数。默认情况下,许多Linux发行版限制一个进程最多可以打开1024个文件。 2. "errno 24 ...

    Unix环境高级编程

    ### Unix环境高级编程:进程的环境 #### 7.1 引言 在深入探讨进程控制原语之前,本章将详细介绍进程所...接下来的部分将更深入地探讨与进程相关的其他主题,例如命令行参数、环境变量的使用以及进程资源限制等内容。

    进程资源检测工具

    进程资源检测工具是一种用于监控和分析计算机系统性能的软件应用,尤其关注CPU使用率、硬盘活动以及SQL数据库的占用情况。这些工具对于系统管理员、开发人员以及任何关心系统健康和性能的人来说都至关重要。下面我们...

Global site tag (gtag.js) - Google Analytics