c++ namespace和linux namespace

本文深入探讨了C++中的命名空间机制,解释了其作用域、类型以及如何使用。同时,详细阐述了Linux中的命名空间,特别是PID命名空间的层次化结构和工作原理,包括UTS、IPC、MNT、PID和NET子模块。通过示例展示了不同命名空间下PID的差异,并分析了PID命名空间在进程中的位置和管理方式。
摘要由CSDN通过智能技术生成

一、c++中的namespace

C++语言中,命名空间使用namespace来声明,并使用{ }来界定命名空间的作用域。命名空间可以是全局的,也可以位于另一命名空间之中;但不能在类和代码块之中。按照是否有名字,可分为有名字的命名空间与无名命名空间。可以多次声明和定义同一命名空间,每次给这一命名空间添加新成员。编译器自动合并这些同名的命名空间。

简单示例:

wKioL1QVl_OSd6IgAAGaSuRL42I147.jpg

 

二、linux中的namespaces机制:

Linux Namespace是Linux提供的一种OS-level virtualization的方法。目前在Linux系统上实现OS-level virtualization的系统有Linux VServer、OpenVZ、LXC Linux Container、Virtuozzo等,其中Virtuozzo是OpenVZ的商业版本。以上种种本质来说都是使用了Linux Namespace来进行隔离。

每个进程的命名空间都抽象成一个nsproxy指针,共享同一个命名空间的进程指向同一个指针,指针的结构通过引用计数(count)来确定使用者数目。目前Linux系统实现的命名空间子系有UTS、IPC、MNT、PID以及NET网络子模块。

 

Linux/include/linux/sched.h中struct task_struct中找到对应的namespace结构:

struct task_struct {
...
    struct nsproxy *nsproxy;
...
};

// nsproxy是每个进程自己的namespace结构

 

Linux/include/linux/nsproxy.h中找到具体的namespace结构:

struct nsproxy {
    atomic_t count;
    struct uts_namespace *uts_ns;
    struct ipc_namespace *ipc_ns;
    struct mnt_namespace *mnt_ns;
    struct pid_namespace *pid_ns;
    struct net          *net_ns;
};
extern struct nsproxy init_nsproxy;

 

Linux系统命名空间的UTS、IPC、MNT、PID以及NET网络子模块相关定义分别在一下文件中:在Linux/include/linux/utsname.hLinux/include/linux/ipc_namespace.hLinux/include/linux/mnt_namespace.hLinux/include/linux/pid_namespace.hLinux/include/net/net_namespace.h

 

三、下面简单分析linux中PID命名空间(namespace)

linux通过命名空间管理进程pid,对于同一进程(同一个task_struct),在不同的命名空间中,看到的pid号不相同,每个pid命名空间有一套自己的pid管理方法,所以在不同的命名空间中调用getpid(),看到的pid号是不同的。

PID是命名空间中较为复杂的模块,因为PID命名空间是有层次的,在高层次命名空间能看到低命名空间信息,反之不行。

 

pid namespace原理:

PID层次化命名空间结构图:

wKioL1QVmO7ynByxAAE227O5sCY859.jpg

注解:进程在不同命名空间有不同的数据表示,获取一个进程信息进程号和空间信息才能唯一确定一个进程。

 

Linux/include/linux/pid_namespace.h

wKiom1QVmQeTnvyIAAIjDBcrxJo926.jpg

注释:

child_reaper指向的进程相当于全局命名空间的init进程,其中一个重要目的是对孤儿进程进行回收;

level记录该pid namespace的深度;

*parent记录父pid namespace。

 

Linux/include/linux/pid.h

wKiom1QVmS7jNir6AAEj9a4DpI0165.jpg

注释:

nr表示命名空间中的标示;

*ns表示命名空间;

即在*ns命名空间的pid是nr;

pid_chain系统所有的upid通过pid_chain挂在同一个全局链表里;

count表示应用次数;

level表示这个pid深度;

tasks表示一个pid可能对应多个task_struct;

numbers表示一个task_struct在每一个namespace的id,number[0]表示最顶层的namespace,level = 0,number[1]表示level =1。

 

PID命名空间在进程中的整体位置:

wKioL1QVmXLBfzr0AAFw84aCwSc751.jpg

简单示例:

wKioL1QWrVqwIAI1AANdHvUQOZA170.jpg

wKioL1QWrVzTAgVWAAMeAsmyF-k413.jpg

wKiom1QWrUmhHp-9AAL4I3n4uVE946.jpg

wKioL1QWrWCAFRSdAAM-PfFVA_4655.jpg

 

示例结果:

 

wKiom1QWrWSBtkq8AAJ6bckyGT8377.jpg

wKiom1QWrWWD8ezOAAJFK_cC-VE290.jpg

由以上结构可以看到PID命名空间的层次化结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值