一. 概述
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