一、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相关推荐

  1. linux namespace 工具,Linux Namespace : 简介

    文章简单的介绍下 linux namespace 的概念以及基本用法. namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部 ...

  2. 【网址收藏】linux namespace和cgroup

    namespace 包含了Linux目前常用的6个namespace的介绍 Linux Namespace系列(01):Namespace概述 Linux Namespace系列(02):UTS na ...

  3. Docker基础技术:Linux Namespace【上】

    点点收获: //之前发现Coolshell上好久不更新了, 博主果然去搞大业去了,只恨这几篇文章看到太晚了啊~太厉害了. 1.  clone(), unshare(), setns()初识; 主要是š ...

  4. linux namespace 隔离内核资源的方式 简介

    namespace 的概念 namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相 ...

  5. 资源隔离之 Linux namespace

    Linux namespace 简称 ns,在 2002 年 2.4.19 内核中被引入,发展到今天已经有 15 个年头了. 2010 年后国内云计算爆发,紧接着 2013 年 Docker 崛起,n ...

  6. Linux Namespace系列(01):Namespace概述

    Namespace是对全局系统资源的一种封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他nam ...

  7. linux ns,Linux Namespace (ns)

    LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, 网络, 消息, 文件系统和hos ...

  8. Docker 基础技术之 Linux namespace 源码分析

    上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace ...

  9. linux unshare 命令,详解Linux Namespace之User

    User namespace 是 Linux 3.8 新增的一种 namespace,用于隔离安全相关的资源,包括 user IDs and group IDs,keys, 和 capabilitie ...

最新文章

  1. 如何设计出优秀的Restful API?
  2. Java实现SSH模式加密
  3. Confluence 6 数据库结构图
  4. 【Java 注解】注解简介及作用
  5. 数据结构之判断一棵树是不是完满二叉树
  6. 从外部调用Django模块
  7. c语言程序输出一个桌子图案,几道程序题,请高手帮帮忙吧
  8. mysql 创建用户命令-grant
  9. maven解决“Could not calculate build plan”问题
  10. 关于pipe管道的读写端关闭问题
  11. GitHub上整理的一些工具
  12. JSON cannot be resolved 解决方法
  13. 驱动精灵在服务器的系统安装,驱动精灵怎么安装打印机驱动?打印机驱动安装的方法...
  14. 台达DVP-ES3 ModbusTCP通信案例
  15. php支付宝接口参数错误,php支付接口_php支付宝支付接口程序及参数详解
  16. 【MQ-2 可燃气体和烟雾传感器与 Arduino 配合使用】
  17. 程序猿如何高效的学习英语
  18. 创业时也要读下这十本经典书
  19. 多标签分类算法的研究进展
  20. 什么是CSM(Certified Scrum Master) 敏捷认证

热门文章

  1. 自定义实现ProgressDialog样式的Dialog
  2. iOS之深入解析预乘透明度Premultiplied Alpha
  3. 546. Remove Boxes 移除盒子
  4. 350. Intersection of Two Arrays II 两个数组的交集 II
  5. 4. Median of Two Sorted Arrays
  6. Go + Excel 学习 Excelize rows.go
  7. 【机器视觉】 dev_update_var算子
  8. 【数字图像】数字图像处理博客汇总
  9. 【Tiny4412】 Tiny4412开发环境搭建
  10. [Qt教程] 第40篇 网络(十)WebKit初识