进程限制

进程资源管理与限制
本文详细介绍了UNIX/Linux操作系统中进程资源的类型与管理方法,包括使用getrlimit和setrlimit函数查询和设置资源限制,如虚拟地址空间、Core文件大小、CPU时间等,并提供了系统实验代码示例。

一 进程资源

1. 资源列表

UNIX/Linux 操作系统族 对进程资源进行了抽象;下图为部分操作系统版本支持的资源类型
在这里插入图片描述

2 资源配置

以下接口可以用来查询或者配置系统资源限制
兼容标准:POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

       #include <sys/time.h>
       #include <sys/resource.h>
       int getrlimit(int resource, struct rlimit *rlim);
       int setrlimit(int resource, const struct rlimit *rlim);

3 系统实验

#include <iostream>
using namespace std;

/*c接口,只好extern C*/
extern "C"
{
	#include <sys/time.h>
	#include <sys/resource.h>
}

/*这里用到一种字符串创建技巧*/
#define pr_rlimit(name) print_rlimit(#name,name)

//int getrlimit(int resource, struct rlimit *rlim);
//int setrlimit(int resource, const struct rlimit *rlim);
int print_rlimit(char const *str, int resource);

int main(void)
{
	/*虚拟地址空间上限:笔者系统显示,无上限*/
	pr_rlimit(RLIMIT_AS);
	/*Core 文件size上限:无上限*/
	pr_rlimit(RLIMIT_CORE);
	/*CPU时间/秒单位上限:无上限*/
	pr_rlimit(RLIMIT_CPU);
	/*数据段(静态区,堆):无上限*/
	pr_rlimit(RLIMIT_DATA);
	/*进程创建文件可能的最大size:无上限*/
	pr_rlimit(RLIMIT_FSIZE);
	
	/*用途不详?*/
	pr_rlimit(RLIMIT_MEMLOCK);
	/*see mq_open?*/
	pr_rlimit(RLIMIT_MSGQUEUE);
	
	/*进程优先级最高级:0级*/
	pr_rlimit(RLIMIT_NICE);
	/*可以打开的文件最大个数:1024个*/
    pr_rlimit(RLIMIT_NOFILE);
    /*可以创建的最大子进程个数:7758*/
    pr_rlimit(RLIMIT_NPROC);
    
    /*?*/
    pr_rlimit(RLIMIT_RSS);
    /*?*/
    pr_rlimit(RLIMIT_RTPRIO);
    /*?*/
    pr_rlimit(RLIMIT_RTTIME);

	/*pending 信号的最大值:7758*/
    pr_rlimit(RLIMIT_SIGPENDING);
    
    /*进程最大栈容量字节:8388608*/
    pr_rlimit(RLIMIT_STACK);
	cout << "Infinite val is : " << RLIM_INFINITY << endl;

	return 0;
}

int print_rlimit(char const *str, int resource)
{
	int res = 0;
	if(NULL == str)
	{
		res = -1;
		goto End;
	}
	
	struct rlimit limit;
	if(res = getrlimit(resource,&limit))
	goto End;

	cout << str << ": Max = " << limit.rlim_max << " Cur = " << 
	limit.rlim_cur << endl;

	End:
		return res;
}

输出:
RLIMIT_AS: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_CORE: Max = 18446744073709551615 Cur = 0
RLIMIT_CPU: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_DATA: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_FSIZE: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_MEMLOCK: Max = 65536 Cur = 65536
RLIMIT_MSGQUEUE: Max = 819200 Cur = 819200
RLIMIT_NICE: Max = 0 Cur = 0
RLIMIT_NOFILE: Max = 1048576 Cur = 1024
RLIMIT_NPROC: Max = 7758 Cur = 7758
RLIMIT_RSS: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_RTPRIO: Max = 0 Cur = 0
RLIMIT_RTTIME: Max = 18446744073709551615 Cur = 18446744073709551615
RLIMIT_SIGPENDING: Max = 7758 Cur = 7758
RLIMIT_STACK: Max = 18446744073709551615 Cur = 8388608
Infinite val is : 18446744073709551615

二 更改进程资源

int setrlimit(int resource, const struct rlimit *rlim);
           struct rlimit {
               rlim_t rlim_cur;  /* Soft limit */
               rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
         };

前置条件:

  1. 只有超级用户才能修改进程rlim_max 字段
  2. 进程 owner可以降级rlim_cur或者rlim_max ,但要求 rlim_cur <= rlim_max
### 限制安卓系统中进程数量的方法 在安卓系统中,限制进程数量主要涉及两个方面:一是通过系统设置调整后台进程限制,二是通过系统源码进行定制化开发以实现更精细的控制。 #### 1. 通过开发者选项调整后台进程限制 安卓系统在开发者选项中提供了一个限制后台进程数量的功能。该功能允许用户根据需求设置后台运行的应用数量上限。具体操作如下: - 进入 **设置 > 开发者选项**。 - 找到 **限制后台进程数** 选项,默认情况下选择的是“标准限制”。 - 可将限制调整为具体数值,例如限制为 4 个后台进程。 此方法适用于普通用户或测试场景,能够快速缓解因后台进程过多导致的内存压力问题。需要注意的是,这一设置不会影响前台应用的运行,但可能会限制后台服务的执行能力[^1]。 #### 2. 在系统源码中定制后台进程数量限制 对于 ROM 定制开发人员而言,可以通过修改系统源码来实现对后台进程数量的更精确控制。安卓系统在内存管理中使用了“LowMemory Killer”机制,用于根据内存使用情况和进程的重要性决定终止哪些进程。然而,在某些定制化系统中,这一机制可能未被正确配置或未生效。 在安卓 9.0 系统的 ROM 定制开发中,通常会通过分析系统源码并修改相关参数来实现后台进程数量的限制。例如,可以调整与进程管理相关的内核参数,或修改系统服务中的进程调度策略,以确保系统在运行多个应用时依然保持流畅体验。 以下是一个示例代码片段,展示了如何在系统源码中修改后台进程数量限制: ```java // 示例:修改后台进程数量限制 private static final int MAX_BACKGROUND_PROCESSES = 8; public void setMaxBackgroundProcesses(int maxProcesses) { ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); am.setProcessLimit(maxProcesses); } ``` 通过调用 `setProcessLimit` 方法并传入期望的后台进程上限值,可以动态调整系统允许的后台进程数量[^2]。 #### 3. 后台执行限制的影响 从 Android O 开始,系统对应用在后台运行时的行为施加了更多限制,称为“后台执行限制”(Background Execution Limits)。这些限制包括: - **后台服务限制**:限制应用在后台启动服务的能力。 - **广播限制**:限制应用在后台注册和接收广播的能力。 这些限制旨在减少后台应用的资源占用,从而降低内存使用和耗电量,提升整体用户体验。如果应用需要在后台执行长时间任务,应考虑使用 `JobScheduler` 或 `WorkManager` 等系统推荐的替代方案[^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值