linux进程pid分配规则,Linux进程pid分配法【转】

本文深入探讨了Linux系统中进程PID的分配规则。通过分析`copy_process`和`alloc_pid`函数,揭示了PID如何从300到32768之间的范围内分配和复用,以及PID命名空间在虚拟化中的作用。文章还详细解释了`pidmap`结构体和位图法在管理已分配和未分配PID中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 概述

Android系统创建进程,最终的实现还是调用linux fork方法,对于linux系统每个进程都有唯一的 进程ID(值大于0),也有pid上限,默认为32768。 pid可重复利用,当进程被杀后会回收该pid,以供后续的进程pid分配。

上一篇文章Linux进程管理 详细地介绍了进程fork过程,在copy_process()过程,执行完父进行文件、内存等信息的拷贝,紧接着便是执行alloc_pid()方法去分配pid.

二. 分配法

2.1 copy_process

static struct task_struct *copy_process(unsigned long clone_flags, unsigned long stack_start, unsigned long stack_size, int __user *child_tidptr, struct pid *pid, int trace, unsigned long tls) {

...

struct task_struct *p;

if (pid != &init_struct_pid) {

//分配pid[见小节2.2]

pid = alloc_pid(p->nsproxy->pid_ns_for_children);

}

p->pid = pid_nr(pid); //设置pid[见小节2.4]

...

}

2.2 alloc_pid

[-> kernel/kernel/pid.c]

struct pid *alloc_pid(struct pid_namespace *ns)

{

struct pid *pid; //[见小节2.2.1]

enum pid_type type;

int i, nr;

struct pid_namespace *tmp; //[见小节2.2.4]

struct upid *upid;

int retval = -ENOMEM;

//分配pid结构体的内存

pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);

...

tmp = ns;

pid->level = ns->level;

for (i = ns->level; i >= 0; i--) {

nr = alloc_pidmap(tmp); //分配pid【见小节2.3】

...

pid->numbers[i].nr = nr; //nr保存到pid结构体

pid->numbers[i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值