概述
Linux的Namespace是一种隔离机制,通过将全局共享的系统资源变为进程私有的资源,实现了对进程之间的隔离。其中之一的PID Namespace(进程ID隔离)是Linux Namespace的一种,它使得每个PID Namespace内的进程ID都互相隔离,从而实现了一个进程在一个PID Namespace中,可以将整个进程视为一个独立的系统。
PID Namespace的作用
PID是每个进程的唯一标识符,它在整个系统中是唯一的。PID Namespace的引入使得不同的PID Namespace下的进程可以使用相同的PID,同时不会相互干扰。PID Namespace为进程提供了一个隔离的环境,在该环境中,每个PID Namespace内的进程感知不到其他PID Namespace中的进程存在。
PID Namespace的另一个作用是使得进程在不同的PID Namespace下可以有不同的视图。每个PID Namespace都以一个init进程(PID为1)为根,即PID Namespace中的所有进程的父进程都是init进程。这样,一组进程可以独立于其他进程运行,形成自己的进程树,从而实现对进程的隔离,方便管理和监控。
创建PID Namespace
创建PID Namespace可以使用clone
系统调用,通过传递CLONE_NEWPID
标志给clone
函数即可创建一个新的PID Namespace。举个例子,下面的代码演示了如何创建一个新的PID Namespace:
#define _GNU_SOURCE
#include <sched.h>
#include <unistd.h>
#include <stdio.h>
int child_func(void *args) {
printf("Child process - PID: %d\n", getpid());
sleep(5);
return 0;
}
int main() {
char stack[1024 * 1024];
int clone_flags = CLONE_NEWPID | SIGCHLD;
pid_t child_pid;
child_pid = clone(child_func, stack + sizeof(stack), clone_flags, NULL);
if (child_pid < 0) {
perror("clone");
return 1;
}
printf("Parent process - PID: %d, Child PID: %d\n", getpid(), child_pid);
sleep(10);
return 0;
}
在上面的代码中,主进程使用clone
函数创建了一个新的PID Namespace,并通过child_func
函数在新的PID Namespace中创建了一个子进程。
查看PID Namespace
可以使用命令ps -e -o pid,ns
来查看系统中存在的PID Namespace及其对应的进程。
$ ps -e -o pid,ns
PID NS
1 4026531840
2 4026531840
3 4026531840
...
上面的命令输出了系统中的进程及其所属的PID Namespace。每个PID Namespace都有唯一的标识符,通过查看PID Namespace标识符,可以知道每个进程属于哪个PID Namespace。
总结
PID Namespace是Linux Namespace的一种,它通过隔离进程ID,使得每个PID Namespace内的进程互相隔离,为每个PID Namespace提供了一个独立的环境和视图。PID Namespace的应用让进程具备了更强大的隔离性和自我管理能力,为容器技术等提供了坚实的基础。
参考文献:
- Linux Manual Pages - clone(2) [https://man7.org/linux/man-pages/man2/clone.2.html]
- Namespaces in operation, part 2: process namespaces [https://lwn.net/Articles/531419/]
本文来自极简博客,作者:星河追踪者,转载请注明原文链接:Linux Namespace之:PID Namespace