0
点赞
收藏
分享

微信扫一扫

pid_namespace

343d85639154 2022-03-30 阅读 46
linux

1、pid_namespace结构主要的成员

        pid_namespace实现了容器间pid资源的隔离,容器里面的进程只能看到容器内的pid信息,高层级的pidns可以看到低层级的pidns信息。

struct pid_namespace {
	struct pidmap pidmap[PIDMAP_ENTRIES];
	int last_pid;
	struct kmem_cache *pid_cachep;
	unsigned int level;
	struct pid_namespace *parent;
};

pidmap用于分配pid号的位图变量

last_pid上一次分配的pid号

pid_cachep用于分配struct pid的slab缓存

Level 表示pidns的层级

Parent上一级的pidns

2、create_pid_namespace

        fork函数创建子进程时带有标志位CLONE_NEWPID创建子进程自己的pidns。

fork
    copy_process
        copy_namespaces
            copy_pid_ns
                create_pid_namespace 

        struct pid在进程创建的时候都会通过task的pidns的pid_cachep的slab缓存中分配对象,pid_cachep的slab缓存的object的大小是 sizeof(struct pid) + (nr_ids - 1) * sizeof(struct upid),和进程的pidns所处的层级有关系。

        struct pid最重要的成员变量就是numbers数组,它表示一个进程在每个namespace里的id,这里的id就是getpid()所得到的值。Numbers[0]表示最顶层的namespace,level=0,numbers[1]表示level=1的namespace,依此类推。在alloc_pid是从最底层依次从ns的pidmap位图变量中申请pid号。

 

举报

相关推荐

0 条评论