pid_task + kill_pid ->在内核态kill进程

#include <linux/sched.h>   
#include <linux/pid.h>     
#include <linux/sched/signal.h>  
 
struct task_struct *task, *p;
for_each_process(p)
{
	if(strcmp(p->comm, process_name) == 0) //process_name为要kill的进程名
	{
		task = pid_task(find_vpid(p->pid), PIDTYPE_PID);
		if(task != NULL)
			kill_pid(find_vpid(p->pid),SIGKILL,1);
		break;
	}
}

为什么使用find_vpid,参考这篇博客:https://blog.youkuaiyun.com/tomorrowCS/article/details/104782994

### 关于 `lmkd` 和 `do_kill` 的实现与流程 #### 什么是 `lmkd` `lmkd` 是 Low Memory Killer Daemon 的缩写,它是 Android 系统中的一个组件,用于监控系统的内存状态,并在必要时杀死占用过多内存的进程以释放资源。其核心功能类似于 Linux 内核中的 OOM(Out Of Memory)机制[^1],但在 Android 中进行了优化和定制化。 `lmkd` 主要通过读取 `/proc/meminfo` 或其他内核暴露的信息来评估当前可用内存的状态。如果发现系统处于低内存状态,则会根据预定义的策略选择目标进程并通知内核将其终止。 #### `do_kill` 流程概述 在 Linux 内核中,`do_kill` 并不是一个独立的功能函数名,而是指代整个 OOM 杀死进程的核心逻辑的一部分。以下是基于引用描述的相关过程: 1. **OOM 触发条件** 当系统内存不足时,Linux 内核会触发 `out_of_memory()` 函数[^2]。此函数负责协调整个 OOM 处理流程。 2. **选择目标进程** 在 `out_of_memory()` 调用过程中,会选择调用 `select_bad_process()` 函数来决定哪个进程应该被杀死。该函数内部依赖于 `oom_badness()` 计算每个候选进程的“坏度”分数。通常情况下,“最坏”的进程是指那些消耗最多内存且对系统整体影响较小的进程[^1]。 3. **执行强制退出** 一旦选定目标进程,就会向它发送信号 (`SIGKILL`) 实现强制关闭操作。这相当于运行命令 `kill -9 <pid>`[^2]。 4. **具体代码路径分析** 下面展示了一个简化版伪码表示法说明上述提到的关键部分如何协作完成任务: ```c // out_of_memory() function outline void out_of_memory(gfp_t gfp_mask, int order) { struct task_struct *p; p = select_bad_process(&chosen_points); if (p && is_global_init(p)) { // 如果选中的是 init 进程则 panic oom_kill_process(p); // 否则继续尝试 kill 掉这个进程 } } // select_bad_process calls into this helper to evaluate each candidate. static unsigned long oom_badness(struct task_struct *p, const nodemask_t *nodemask) { ... } // Finally send SIGKILL signal via force_sig() void oom_kill_process(struct task_struct *victim){ force_sig(SIGKILL,victim); } ``` 以上展示了从检测到处理的一系列动作链路图解。 #### 结合 `lmkd` 的特殊场景应用 对于 Android 设备而言,由于存在多种类型的后台服务以及前台用户体验需求等因素考虑,在标准 Kernel 层面上可能无法完全满足特定平台的要求。因此引入了像 `lmkd` 那样的用户空间守护程序来进行更精细控制。例如它可以设置不同的阈值级别对应不同重要程度的应用类别;或者记录历史行为模式以便做出更加智能化决策等等[^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值