linux内核pid名字空间

本文探讨了Linux内核中的pid名字空间,详细解释了如何通过数据结构实现进程隔离,并阐述了新创建进程如何影响名字空间,以及struct pid的分配和初始化过程。通过pid名字空间,可以实现虚拟化环境中的进程隔离,同时支持从PID数字值查找进程相关信息。
摘要由CSDN通过智能技术生成

最近看《深入理解linux内核架构》中pid名字空间一块,略有感悟。这里开门见山,直接来讲pid名字空间是如何实现的,以及如何使用。先看一幅图,图中描述了所使用的数据结构和他们的关系。

 

首先强调图中的几个比较容易搞混的字段。看task_struct中的struct pid_link *pids数组中,每个元素里有一个struct hlist_node node字段。也就是说,可以利用这个字段把task_struct加入到一个哈希表中。再看右边的struct pid结构中的struct hlist_head tasks[]数组,明显这个hlist_head,也就是表头,这个地方的每个数组元素都可以是一个链表。由于这里数据结构比较多,所以一定要注意是一个内结点,还是一个链表的头结点。

图中绿线(无箭头)表示头结点把中间结点链接成了一个链。而蓝色单箭头线表示,是只有一个指向目标结点的指针。蓝色双箭头线表示是双向链表。

为什么要搞这么复杂的结构呢?因为满足一些需求。 搞pid名字空间就是为了把一些进程隔离开来,让他们以为他们独占了整个系统,在虚拟化等中有应用。 还有,内核中经常需要由PID的数字值得到进程task_struct。(struct hlist_head *pid_hash的作用)。 需要由PID数字值得到进程组ID,会话ID。 当一个会话结束了,需要终止属于这个会话的所有进程。也就是要由会话ID找到所有属于这个会话的进程task_struct。(看看struct pid中有个SID字段,这里链接着属于这个PID的所有会话进程)。 linux用轻量级进程模拟线程,所以需要由线程组长ID找到所有属于这个进程的线程ID。

新创建一个进程是怎么影响名字空间的?

新建进程时的调用栈如下图。可以看出这是在创建内核线程。创建用户线程是调用fork()系统调用,这fork里也调用了do_fork(),也就是图中的do_fork(). do_fork中调用了copy_process函数,在这个函数中子进程复制了父进程的task_struct,其中就复制了task_struct中的struct pid_link pids[]数组。也就是说这时子进程与父进程有一样的PID,SID,GID。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值