有的时候为了避免程序毫无意义的占用CPU(如死循环)、过度占用内存(如内存泄漏),我们可以限制程序使用的资源。
下面主要从两个角度限制资源:
- 限制程序累计运行时长
- 限制可以使用的内存大小
限制资源使用到的函数是 setrlimit,该函数限制资源的本质是当程序使用的资源超过我们限制的标准时,OS就会给运行中的程序发送信号来终止程序的运行。
目录
1、认识 setrlimit函数
2、使用 setrlimit函数限制资源
(1) 限制累计运行时长
(2) 限制可以使用的内存大小
1、认识 setrlimit函数
setrlimit 可以根据填入的参数来从不同的角度限制资源,函数声明如下:
第一个参数 resource:想要限制的资源类型。可选值如下:
资源类型 | 含义 |
RLIMIT_CPU | 限制程序的累计运行时长(即占用CPU的时长) |
RLIMIT_AS | 限制内存可以使用的字节数 |
第二个参数 rlim:输入型参数。需要根据第一个参数的值,来填写相应内容,比如第一个参数填的是RLIMIT_AS,这里要填入的就是字节数;若第一个参数填的是RLIMIT_CPU,这里要填入的就是时间。结构体定义如下:
struct rlimit {
rlim_t rlim_cur; /* Soft limit(软件层面的限制) */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur —— 软件限制的最大值) */
};
2、使用 setrlimit函数限制资源
(1) 限制累计运行时长
#include <sys/time.h>
#include <sys/resource.h>
int main(){
struct rlimit rlim;
rlim.rlim_cur = 1; // 累计运行时间为1s
rlim.rlim_max = RLIM_INFINITY; // rlim_cur无上限
setrlimit(RLIMIT_CPU, &rlim);
while(1);
return 0;
}
当前进程收到的终止信号是 6号信号
(2) 限制可以使用的内存大小
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
int main(){
struct rlimit rlim;
rlim.rlim_cur = 1024*1024*20; // 限制当前程序可以使用的内存大小
rlim.rlim_max = RLIM_INFINITY; // rlim_cur无上限
setrlimit(RLIMIT_AS, &rlim);
int count = 0;
while(1){
int* a = new int[1024*1024]; // 每次申请 1024*1024*4 = 4M 的空间(一个int占4字节)
count++;
printf("目前已经申请的大小: %d M\n", count*4);
sleep(1);
}
return 0;
}
现在限制了程序可以使用的内存大小是20M,程序在运行的时候,生成的二进制代码都是放在内存的,所以程序本身就需要占用一部分内存,因此,实际可以用于动态开辟的空间要小于20M。
当前进程收到的中止信号是24号信号。