日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c++ namespace和linux namespace

發布時間:2024/4/18 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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命名空間的層次化結構。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的c++ namespace和linux namespace的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。