c++ namespace和linux namespace
一、c++中的namespace
在C++语言中,命名空间使用namespace来声明,并使用{ }来界定命名空间的作用域。命名空间可以是全局的,也可以位于另一命名空间之中;但不能在类和代码块之中。按照是否有名字,可分为有名字的命名空间与无名命名空间。可以多次声明和定义同一命名空间,每次给这一命名空间添加新成员。编译器自动合并这些同名的命名空间。
简单示例:
二、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.h、Linux/include/linux/ipc_namespace.h、Linux/include/linux/mnt_namespace.h、Linux/include/linux/pid_namespace.h、Linux/include/net/net_namespace.h。
三、下面简单分析linux中PID命名空间(namespace)
linux通过命名空间管理进程pid,对于同一进程(同一个task_struct),在不同的命名空间中,看到的pid号不相同,每个pid命名空间有一套自己的pid管理方法,所以在不同的命名空间中调用getpid(),看到的pid号是不同的。
PID是命名空间中较为复杂的模块,因为PID命名空间是有层次的,在高层次命名空间能看到低命名空间信息,反之不行。
pid namespace原理:
PID层次化命名空间结构图:
注解:进程在不同命名空间有不同的数据表示,获取一个进程信息进程号和空间信息才能唯一确定一个进程。
在Linux/include/linux/pid_namespace.h:
注释:
child_reaper指向的进程相当于全局命名空间的init进程,其中一个重要目的是对孤儿进程进行回收;
level记录该pid namespace的深度;
*parent记录父pid namespace。
在Linux/include/linux/pid.h:
注释:
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命名空间在进程中的整体位置:
简单示例:
示例结果:
由以上结构可以看到PID命名空间的层次化结构。
c++ namespace和linux namespace相关推荐
- linux namespace 工具,Linux Namespace : 简介
文章简单的介绍下 linux namespace 的概念以及基本用法. namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部 ...
- 【网址收藏】linux namespace和cgroup
namespace 包含了Linux目前常用的6个namespace的介绍 Linux Namespace系列(01):Namespace概述 Linux Namespace系列(02):UTS na ...
- Docker基础技术:Linux Namespace【上】
点点收获: //之前发现Coolshell上好久不更新了, 博主果然去搞大业去了,只恨这几篇文章看到太晚了啊~太厉害了. 1. clone(), unshare(), setns()初识; 主要是š ...
- linux namespace 隔离内核资源的方式 简介
namespace 的概念 namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相 ...
- 资源隔离之 Linux namespace
Linux namespace 简称 ns,在 2002 年 2.4.19 内核中被引入,发展到今天已经有 15 个年头了. 2010 年后国内云计算爆发,紧接着 2013 年 Docker 崛起,n ...
- Linux Namespace系列(01):Namespace概述
Namespace是对全局系统资源的一种封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他nam ...
- linux ns,Linux Namespace (ns)
LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, 网络, 消息, 文件系统和hos ...
- Docker 基础技术之 Linux namespace 源码分析
上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace ...
- linux unshare 命令,详解Linux Namespace之User
User namespace 是 Linux 3.8 新增的一种 namespace,用于隔离安全相关的资源,包括 user IDs and group IDs,keys, 和 capabilitie ...
最新文章
- 如何设计出优秀的Restful API?
- Java实现SSH模式加密
- Confluence 6 数据库结构图
- 【Java 注解】注解简介及作用
- 数据结构之判断一棵树是不是完满二叉树
- 从外部调用Django模块
- c语言程序输出一个桌子图案,几道程序题,请高手帮帮忙吧
- mysql 创建用户命令-grant
- maven解决“Could not calculate build plan”问题
- 关于pipe管道的读写端关闭问题
- GitHub上整理的一些工具
- JSON cannot be resolved 解决方法
- 驱动精灵在服务器的系统安装,驱动精灵怎么安装打印机驱动?打印机驱动安装的方法...
- 台达DVP-ES3 ModbusTCP通信案例
- php支付宝接口参数错误,php支付接口_php支付宝支付接口程序及参数详解
- 【MQ-2 可燃气体和烟雾传感器与 Arduino 配合使用】
- 程序猿如何高效的学习英语
- 创业时也要读下这十本经典书
- 多标签分类算法的研究进展
- 什么是CSM(Certified Scrum Master) 敏捷认证
热门文章
- 自定义实现ProgressDialog样式的Dialog
- iOS之深入解析预乘透明度Premultiplied Alpha
- 546. Remove Boxes 移除盒子
- 350. Intersection of Two Arrays II 两个数组的交集 II
- 4. Median of Two Sorted Arrays
- Go + Excel 学习 Excelize rows.go
- 【机器视觉】 dev_update_var算子
- 【数字图像】数字图像处理博客汇总
- 【Tiny4412】 Tiny4412开发环境搭建
- [Qt教程] 第40篇 网络(十)WebKit初识