二十一、Linux 进程与信号---进程资源限制
21.1 进程资源限制
在操作系统中,我们能够通过函数getrlimit()、setrlimit()分别获得、设置每个进程能够创建的各种系统资源的限制使用量。
21.1.1 函数
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlp);
- 函数功能:获得资源限制,存放在 rlp 指向的结构体中
- 函数参数:
- @resource:见下面的说明
- @rlp:指向结构体 rlimit 的指针
- 返回值:成功返回0,失败返回非0
#include <sys/resource.h>
int setrlimit(int resource, const struct rlimit *rlp);
- 函数功能:通过 rlp 指向的结构体去修改 resource 指定的资源限制
- 函数参数:
- @resource:资源限制,可能的选择有
- RLIMIT_AS :进程的最大虚内存空间,字节为单位。即进程可用存储区大小
- RLIMIT_CORE :内核转存文件的最大长度。即core 文件最大字节数
- RLIMIT_CPU :最大允许的CPU使用时间,秒为单位。当进程达到软限制,内核将给其发送SIGXCPU信号,这一信号的默认行为是终止进程的执行。然而,可以捕捉信号,处理句柄可将控制返回给主程序。如果进程继续耗费CPU时间,核心会以每秒一次的频率给其发送SIGXCPU信号,直到达到硬限制,那时将给进程发送 SIGKILL信号终止其执行。
- RLIMIT_DATA :进程数据段的最大值。
- RLIMIT_FSIZE :进程可创建的文件的最大长度。如果进程试图超出这一限制时,核心会给其发送SIGXFSZ信号,默认情况下将终止进程的执行。
- RLIMIT_LOCKS :进程可建立的锁和租赁的最大值。即文件锁的最大数
- RLIMIT_MEMLOCK :进程可锁定在内存中的最大数据量,字节为单位。即使用 mlock 能否再再存储器中锁定的最大字节数
- RLIMIT_MSGQUEUE :进程可为POSIX消息队列分配的最大字节数。
- RLIMIT_NICE :进程可通过setpriority() 或 nice()调用设置的最大完美值。
- RLIMIT_NOFILE :指定比进程可打开的最大文件描述词大一的值,超出此值,将会产生EMFILE错误。即能打开的最大文件数
- RLIMIT_NPROC :用户可拥有的最大进程数。即每个用户 ID 可拥有的最大子进程数
- RLIMIT_RTPRIO :进程可通过sched_setscheduler 和 sched_setparam设置的最大实时优先级。
- RTLMIT_RSS :最大驻内存集的字节长度
- RLIMIT_SIGPENDING :用户可拥有的最大挂起信号数。
- RLIMIT_STACK :最大的进程堆栈,以字节为单位。即栈的最大长度
- @rlp:指向结构体 rlimit 的指针
- @resource:资源限制,可能的选择有
- 返回值:成功返回0,出错返回 非0
rlimit 结构体:
struct rlimit {
__kernel_ulong_t rlim_cur; //软资源限制:用户可以修改的资源限制
__kernel_ulong_t rlim_max; //硬资源限制:系统中标配的限制,用户可以修改,root 用户除外
};
21.1.2 资源限制修改规则
- 进程资源限制的配置文件
- /etc/security/limits.conf
- Linux 中进程资源的初始化由 0 号进程建立,并被后续进程继承
- 资源限制的修改规则
- 硬资源限制必须大于等于软资源限制
- 任何一进程可以降低或者提升其软资源限制,但必须小于等于其硬资源限制
- 任何一进程可以降低其硬件资源限制,但必须大于其软资源限制,普通用户不可逆进行此操作(即提高操作)
- 只有超级用户可以提高硬资源限制
21.2 例子
21.2.1 获得系统中软硬资源的上限
process_limit.c
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define RLIMIT(name) get_limit(#name, name) void get_limit(char *name, int resource)
{
struct rlimit limit;
if(getrlimit(resource, &limit) < ) {
perror("getrlimit error");
return;
} printf("%-15s", name); if(limit.rlim_cur == RLIM_INFINITY) {
printf(" infinity");
} else {
printf("%10ld", limit.rlim_cur);
} if(limit.rlim_max == RLIM_INFINITY) {
printf(" infinity");
} else {
printf("%10ld", limit.rlim_max);
} printf("\n");
} int main(void)
{
RLIMIT(RLIMIT_AS);
RLIMIT(RLIMIT_CORE);
RLIMIT(RLIMIT_CPU);
RLIMIT(RLIMIT_DATA);
RLIMIT(RLIMIT_FSIZE);
RLIMIT(RLIMIT_LOCKS);
RLIMIT(RLIMIT_MEMLOCK);
RLIMIT(RLIMIT_MSGQUEUE);
RLIMIT(RLIMIT_NICE);
RLIMIT(RLIMIT_NOFILE);
RLIMIT(RLIMIT_NPROC);
RLIMIT(RLIMIT_RTPRIO);
RLIMIT(RLIMIT_RSS);
RLIMIT(RLIMIT_SIGPENDING);
RLIMIT(RLIMIT_STACK); return ;
}
编译运行如下:
21.2.2 修改最大文件数
limit_nofile.c
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h> #define MODE S_IRWXU | S_IRWXG | S_IRWXO int open_file(const char *filename)
{
int fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, MODE);
if(fd < ) {
perror("open error");
exit();
} return fd;
} int main(int argc, char *argv[])
{
struct rlimit limit;
limit.rlim_cur = ; //设置软资源限制
limit.rlim_max = ; //设置硬资源限制 //设置文件打开的最大数
//(注意:0 标准输入 1 标准输出 2 标准错误 已经打开)
if(setrlimit(RLIMIT_NOFILE, &limit) < ) {
perror("setrlimit error");
exit();
} int fd1, fd2;
fd1 = open_file("s1.txt");
fd2 = open_file("s2.txt"); close(fd1);
close(fd2); return ;
}
编译执行:
因为 0,1,2 是已经打开的,所以最多还能打开 4-3 = 1 和 1024 - 3 = 1021 个文件。
二十一、Linux 进程与信号---进程资源限制的更多相关文章
- 二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识
21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...
- 二十二、Linux 进程与信号---进程创建
22.1 fork 和 vfork 函数 22.1.1 函数说明 #include <unistd.h> #include <sys/types.h> pid_t fork( ...
- 二十三、Linux 进程与信号---进程链和进程扇、守护进程和孤儿进程以及僵尸进程
23.1 进程链和进程扇 23.1.1 概念 进程链:一个父进程构建出一个子进程,子进程再构建出子子进程,子子进程构建出子子子进程.... 这种就为进程链 进程扇:一个父进程构建出多个子进程,子进程都 ...
- 二十七、Linux 进程与信号---进程组和组长进程
27.1 进程组 27.1.1 进程组介绍 进程组为一个或多个进程的集合 进程组可以接受同一终端的各种信号,同一个信号发送进程组等于发送给组中的所有进程 每个进程组有唯一的进程组 ID 进程组的消亡要 ...
- 二十二、Linux 进程与信号---进程创建(续)
22.2 父子进程操作文件 文件操作由两种模式: IO 系统调用操作文件 标准C IO 操作文件 看代码: #include <unistd.h> #include <string. ...
- 十八、Linux 进程与信号---进程介绍
18.1 进程的概念 程序:程序(program)是存放再磁盘文件中的可执行文件 进程 程序的执行实例被称为进程(process) 一个程序的执行实例可能由多个 进程具有独立的权限和职责.如果系统中某 ...
- Linux学习之CentOS(二十一)--Linux系统启动详解
在这篇随笔里面将对Linux系统的启动进行一个详细的解释!我的实验机器是CentOS6.4,当然对于现有的Linux发行版本,其系统的启动基本上都是一样的! 首先我们来看下Linux系统启动的几个 ...
- linux 下信号处理命令trap && linux下各种信号的意义
1.用途说明 trap是一个shell内建命令,它用来在脚本中指定信号如何处理.比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出 ...
- Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)
1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...
随机推荐
- 全局变量 static变量
变量 作用域 全局变量( external linkage ) 定义在函数外 Int a=1 作用于整个工程 在连接两个文件时若有两个a会报错 Staic 函数外(internal linkage) ...
- can 网络管理
网络管理主要功能: 是用来管理ECU是否在网络里面,不在的话请求加入,也就是ALIVE报文, 要判断是否掉线,以及睡眠状态的转换机制,以及跛行状态判,也即是RING报文. 主要的实现逻辑流程: 从rt ...
- 20165223 week2学习查漏补缺
标识符.字符集.关键字 基本数据类型 逻辑类型:boolean 常量:true.false 变量:boolean赋值 整数类型:byte.short.long.int 注意long型后缀L Java没 ...
- mybatis 二级缓存
Mybatis读取缓存次序: 先从二级缓存中获取数据,如果有直接获取,如果没有进行下一步: 从一级缓存中取数据,有直接获取,如果没有进行下一步: 到数据库中进行查询,并保存到一级缓存中: 当sqlSe ...
- Spring 整合 Hibernate 时启用二级缓存实例详解
写在前面: 1. 本例使用 Hibernate3 + Spring3: 2. 本例的查询使用了 HibernateTemplate: 1. 导入 ehcache-x.x.x.jar 包: 2. 在 a ...
- zxing二维码的生成与解码(C#)
ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和An ...
- 通过锁字符串达到控制并发的效果C#
lock锁的是地址 而.net有内部机制使得相同的字符串内存地址是相同的(new string)除外 下面上实验代码 using System; using System.Collections.Ge ...
- Command `bundle` unrecognized. Make sure that you have run `npm install` and that you are inside a react-native project.
呃呃,在写下面的代码时出现的问题,解决办法是npm install或者yarn,如果yarn报错,再npm install就可以了 下面的是携程App首页的样式,有轮播,我没有实现出来 代码如下: / ...
- 第三十三篇-TabLayout的使用
效果图: 最上方是一个TabLayout,有三个部分,新闻.财经.娱乐,下方是一个ViewPaper,里面包含三个fragment,分别对应三个xml和java class. 第一个Fragment里 ...
- 第十四节,TensorFlow中的反卷积,反池化操作以及gradients的使用
反卷积是指,通过测量输出和已知输入重构未知输入的过程.在神经网络中,反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积神经网络,没有学习训练的过程.反卷积有着许多特别的应用,一般可以用 ...