成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

一起分析Linux經典技巧之進程ID號

本篇文章給大家帶來了linux中進程ID號分析的相關知識,Linux進程總是會分配一個號碼用于在其命名空間中唯一地標識它們。該號碼被稱作進程ID號,簡稱PID,下面就一起來看一下相關問題,希望對大家有幫助。

一起分析Linux經典技巧之進程ID號

??本文中的代碼摘自 Linux內核5.15.13版本。

??Linux進程總是會分配一個號碼用于在其命名空間中唯一地標識它們。該號碼被稱作進程ID號,簡稱PID。用fork或clone產生的每個進程都由內核自動地分配了一個新的唯一的PID值。

一、進程ID

1.1、其他ID

??每個進程除了PID這個特征值之外,還有其他的ID。有下列幾種可能的類型

??1、 處于某個線程組(在一個進程中,以標志CLONE_THREAD來調用clone建立的該進程的不同的執行上下文,我們在后文會看到)中的所有進程都有統一的線程組ID( TGID)。如果進程沒有使用線程,則其PID和TGID相同。線程組中的主進程被稱作組長( group leader)。通過clone創建的所有線程的task_struct的group_leader成員,會指向組長的task_struct實例。

??2、另外,獨立進程可以合并成進程組(使用setpgrp系統調用)。進程組成員的task_struct的pgrp屬性值都是相同的,即進程組組長的PID。進程組簡化了向組的所有成員發送信號的操作,這對于各種系統程序設計應用(參見系統程序設計方面的文獻,例如[ SR05])是有用的。請注意,用管道連接的進程包含在同一個進程組中。

??3、 幾個進程組可以合并成一個會話。會話中的所有進程都有同樣的會話ID,保存在task_struct的session成員中。 SID可以使用setsid系統調用設置。它可以用于終端程序設計。

1.2、全局ID和局部ID

??名空間增加了PID管理的復雜性。 PID命名空間按層次組織。在建立一個新的命名空間時,該命名空間中的所有PID對父命名空間都是可見的,但子命名空間無法看到父命名空間的PID。但這意味著某些進程具有多個PID,凡可以看到該進程的命名空間,都會為其分配一個PID。 這必須反映在數據結構中。我們必須區分局部ID和全局ID。

??1、 全局ID是在內核本身和初始命名空間中的唯一ID號,在系統啟動期間開始的init進程即屬于初始命名空間。對每個ID類型,都有一個給定的全局ID,保證在整個系統中是唯一的。

??2、 局部ID屬于某個特定的命名空間,不具備全局有效性。對每個ID類型,它們在所屬的命名空間內部有效,但類型相同、值也相同的ID可能出現在不同的命名空間中。

1.3、ID實現

??全局PID和TGID直接保存在task_struct中,分別是task_struct的pid和tgid成員,在sched.h文件里:

struct task_struct {...pid_t pid;pid_t tgid;...}

??這兩項都是pid_t類型,該類型定義為__kernel_pid_t,后者由各個體系結構分別定義。通常定義為int,即可以同時使用232個不同的ID。

二、管理PID

??一個小型的子系統稱之為PID分配器( pid allocator)用于加速新ID的分配。此外,內核需要提供輔助函數,以實現通過ID及其類型查找進程的task_struct的功能,以及將ID的內核表示形式和用戶空間可見的數值進行轉換的功能。

2.1、PID命名空間的表示方式

??在pid_namespace.h文件內有如下定義:

struct pid_namespace { 	struct idr idr; 	struct rcu_head rcu; 	unsigned int pid_allocated; 	struct task_struct *child_reaper; 	struct kmem_cache *pid_cachep; 	unsigned int level; 	struct pid_namespace *parent;#ifdef CONFIG_BSD_PROCESS_ACCT 	struct fs_pin *bacct;#endif 	struct user_namespace *user_ns; 	struct ucounts *ucounts; 	int reboot;	/* group exit code if this pidns was rebooted */ 	struct ns_common ns;} __randomize_layout;

??每個PID命名空間都具有一個進程,其發揮的作用相當于全局的init進程。 init的一個目的是對孤兒進程調用wait4,命名空間局部的init變體也必須完成該工作。 child_reaper保存了指向該進程的task_struct的指針。

??parent是指向父命名空間的指針, level表示當前命名空間在命名空間層次結構中的深度。初始命名空間的level為0,該命名空間的子空間level為1,下一層的子空間level為2,依次遞推。level的計算比較重要,因為level較高的命名空間中的ID,對level較低的命名空間來說是可見的。從給定的level設置,內核即可推斷進程會關聯到多少個ID。

2.2、PID的管理

2.2.1、PID的數據結構

??PID的管理圍繞兩個數據結構展開: struct pid是內核對PID的內部表示,而struct upid則表示特定的命名空間中可見的信息。兩個結構的定義在文件pid.h內,分別如下:

/*  * What is struct pid?  *  * A struct pid is the kernel's internal notion of a process identifier.  * It refers to inpidual tasks, process groups, and sessions.  While  * there are processes attached to it the struct pid lives in a hash  * table, so it and then the processes that it refers to can be found  * quickly from the numeric pid value.  The attached processes may be  * quickly accessed by following pointers from struct pid.  *  * Storing pid_t values in the kernel and referring to them later has a  * problem.  The process originally with that pid may have exited and the  * pid allocator wrapped, and another process could have come along  * and been assigned that pid.  *  * Referring to user space processes by holding a reference to struct  * task_struct has a problem.  When the user space process exits  * the now useless task_struct is still kept.  A task_struct plus a  * stack consumes around 10K of low kernel memory.  More precisely  * this is THREAD_SIZE + sizeof(struct task_struct).  By comparison  * a struct pid is about 64 bytes.  *  * Holding a reference to struct pid solves both of these problems.  * It is small so holding a reference does not consume a lot of  * resources, and since a new struct pid is allocated when the numeric pid  * value is reused (when pids wrap around) we don't mistakenly refer to new  * processes.  *//*  * struct upid is used to get the id of the struct pid, as it is  * seen in particular namespace. Later the struct pid is found with  * find_pid_ns() using the int nr and struct pid_namespace *ns.  */struct upid { 	int nr; 	struct pid_namespace *ns;};struct pid{ 	refcount_t count; 	unsigned int level; 	spinlock_t lock; 	/* lists of tasks that use this pid */ 	struct hlist_head tasks[PIDTYPE_MAX]; 	struct hlist_head inodes; 	/* wait queue for pidfd notifications */ 	wait_queue_head_t wait_pidfd; 	struct rcu_head rcu; 	struct upid numbers[1];};

??對于struct upid, nr表示ID的數值, ns是指向該ID所屬的命名空間的指針。所有的upid實例都保存在一個散列表中。 pid_chain用內核的標準方法實現了散列溢出鏈表。struct pid的定義首先是一個引用計數器count。 tasks是一個數組,每個數組項都是一個散列表頭,對應于一個ID類型。這樣做是必要的,因為一個ID可能用于幾個進程。所有共享同一給定ID的task_struct實例,都通過該列表連接起來。 PIDTYPE_MAX表示ID類型的數目:

enum pid_type{ 	PIDTYPE_PID, 	PIDTYPE_TGID, 	PIDTYPE_PGID, 	PIDTYPE_SID, 	PIDTYPE_MAX,};

2.2.2、PID與進程的聯系

??一個進程可能在多個命名空間中可見,而其在各個命名空間中的局部ID各不相同。 level表示可以看到該進程的命名空間的數目(換言之,即包含該進程的命名空間在命名空間層次結構中的深度),而numbers是一個upid實例的數組,每個數組項都對應于一個命名空間。注意該數組形式上只有一個數組項,如果一個進程只包含在全局命名空間中,那么確實如此。由于該數組位于結構的末尾,因此只要分配

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
无码欧美毛片一区二区三在线视频| 日韩精品无码一本二本三本色| 国产精品99无码一区二区| 视频一区麻豆国产传媒| 大鷄巴久久久久久久久久| TOUGHTESTED硬汉系列| 老熟女高潮一区二区三区| 亲孑伦视频一区二区三区| 亚洲精品国产精品乱码视色| 色8激情欧美成人久久综合电| 麻花传媒MV与其它传媒公司比较| 国语对白国产成人AⅤ片| 番剧初恋不可能是亲姐姐| 久久寂寞少妇成人内射| 人妻中出受孕 中文字幕在线| 久久国产精品二国产精品| 国产无遮挡又黄又大又爽| 国产成人精品一区二区三区| 爱情岛论坛线路一官方网站| 亚洲男人AV天堂午夜在| 国产自偷在线拍精品热乐播AV| 欧美猛少妇色XXXXⅩBBBB| 中文在线っと好きだっ最新版 | 精品一区二区三区影院在线午夜| 亚洲小说图区综合在线| 午夜男女爽爽影院免费视频下载| 色狠狠久久AV五月综合| 亚洲AV狠狠爱一区二区三区| 午夜福利理论片在线观看| 无码精品一区二区三区视频色欲网| 天黑黑影院免费观看视频在线播放| 日韩无码av一区二区| 日本熟妇xxxx| 熟女高潮喷水一区二区三区| 肉欲麻豆天美传媒| 调教小奴高潮惩罚PLAY道具| 无码内射中文字幕岛国片| 亚洲午夜久久久影院伊人| Z〇ZOZ〇女人另类ZOZ〇| 别揉我奶头~嗯~啊~视频| 纯肉高H爽文粗大| 国产CHINESE男男GAYGAY网站| 国产SUV精品一区二区四区三区| 激情久久AV一区AV二区AV三| 久久久久久精品免费免费SSS| 久久AV高清无码| 人妻三级日本香港三级极| 色婷婷五月综合亚洲小说| 亚洲国产精品一区第二页| 一本久道中文无码字幕AV| 自拍偷自拍亚洲精品10P| 9612黄桃网站进入页面直播| おとまりせくす中文在线| 成人无码黄动漫在线播放| 国产成人久久久精品二区三区| 国产乱子伦视频在线播放| 激情偷乱人伦小说视频在线| 青草青草视频2免费观看| 亚洲国产成人久久综合| 在线A级毛片无码免费真人| AV无码电影一区二区三区| 吃奶呻吟打开双腿做受是免费视频 | 99久久精品无码一区二区三区 | 野花在线高清视频| 丰满妇女BBWBBWBBWBB| 国产凸凹视频一区二区| 欧美性受XXXX88喷潮| 天干天干天啪啪夜爽爽色| 中文曰本熟女久久| 国产又爽又黄又刺激的视频| 久久亚洲中文字幕伊人久久大| 欧美性猛烈XXXX极品少妇| 亚洲乱亚洲乱少妇无码| 公交车伦流澡到高潮HNP| 豪妇荡乳1一5白玉兰免费下载| 久久综合狠狠综合久久| 婷婷亚洲综合五月天小说| 99精品国产在热久久婷婷| 国产00高中生在线无套进入| 精品不卡一区二区| 欧美精品乱码视频一二专区| 熟妇人妻精品一区二区视频免费的| 又大又大粗又长又硬又爽| 成人网站WWW污污污网站| 里面也请好好疼爱第三季| 亚洲AV无码一区二区三区性色 | 男男黄Gay片免费网站www| 日子我妈妈毛片儿电影| 中字无码AV电影在线观看网站| 黑人玩弄人妻一区二区三区| 欧美 日韩 国产 亚洲 色| 天堂中文最新版在线中文| 亚洲欭美日韩颜射在线| 成人免费无码大片A毛片抽搐色欲 成人免费无码大片A毛片抽搐 | 麻豆亚洲AV永久无码精品久久| 亚洲国产精品悠悠久久琪琪| 国产精品后入内射日本在线观看| 日本真人边吃奶边做爽动态图| 8x8x熟妇一区二区三区| 久久综合狠狠综合久久| 亚洲精品国产成人精品| 国产亚洲日韩一区二区三区| 天天玩天天玩天天玩| 大胆极品美軳人人体| 人人妻人人爽人人添少妇| 99久久久精品免费观看国产| 榴莲草莓视频黄丝瓜芭乐秋葵| 人妻洗澡被强公日日澡| 82岁老人找20多岁小伙子| 麻豆人人妻人人妻人人片AV| 夜夜高潮夜夜爽高清完整版1| 狠狠躁夜夜躁人爽碰88A| 亚瑟国产精品久久| OLDGRAANNY日本老熟妇| 女人和拘做受全过程| 曰本女人牲交全视频播放毛片| 久久精品国产亚洲AV影院| 亚洲高清国产拍精品熟女| 国精产品一线二线三线| 亚洲AV成人片无码色欲AV自慰| YY111111少妇影院无码老司机| 欧美成人免费观看在线看| 亚洲成AV人片在线观看| 俺去俺来也WWW色官网| 欧美片内射欧美美美妇| CAOPORN最新地址| 精品人妻一区二区三区浪潮在线| 三级国产三级在线| 吃瓜网最新官网地址| 三个人C了我半小时| 夫妇交换性三中文字幕| 少妇久久久被弄到高潮| 最新高清无码专区| 内射骚妇高清AV电影| 亚洲欧洲精品成人久久曰| 国产激情一区二区三区视频免樱桃| 免费无码AV一区二区三区| 亚洲暴爽AV人人爽日日碰| 国产A V无码专区亚洲AV| 少妇太爽丰满一区二区| 国产黄 色 网 站 成 人免费| 无码人妻毛片丰滿熟婦区毛片色欲 | 日韩乱码人妻无码系列中文字幕| 成人欧美一区二区三区黑人 | 公主很忙(N)甜烟| 无码人妻一区二区三区免费看| 国产美足白丝榨精在线观看sm | 狠狠色丁香九九婷婷综合| 亚洲区综合区小说区激情区| 老妇擦她毛荫荫的玥户| 亚洲国产成人精品无码区在线观看 | 成为全校公交车的日常生活| 熟妇人妻午夜寂寞影院| 国产群交视频一区二区三区铁牛| 日本强伦姧人妻久久影片| 777亚洲熟妇自拍无码区| 人妻ay无码一区二区三区| 坐公交忘穿内裤被挺进老 | JAPANESE55丰满成熟| 老太婆BBW搡BBBB搡搡搡搡| 4399理论片午午伦夜理片| 久久久噜噜噜久噜久久| 亚洲国产中文在线二区三区免 | 一本一道AV无码中文字幕麻豆| 免费十大软件大全下载安装| 办公室撕开奶罩揉吮奶头H文| 女人扒开屁股桶爽30分钟| 成年无码AV片在线狼人| 无码一区二区三区视频| 国产成人久久综合一区| 亚洲AⅤ永久无码精品| 久久精品亚洲中文无东京热| 亚洲日韩看片成人无码| 皇上御花园HLH| 在线观看免费A∨网站| 人妻熟妇乱又伦精品视频| 国产精品毛片一区二区三区| 乌克兰少妇XXXX做受野外| 国产成人无码专区| 亚洲国产精品嫩草影院久久 | 黑人精品一区二区三区| 中文字幕乱偷无码AV先锋蜜桃 | 国产妓女牲交A毛片| 亚洲国产精品无码久久久秋霞1| 奶头又大又白喷奶水AV| 国产98在线 | 免费、| 亚洲精品国偷自产在线| 欧洲多毛裸体XXXXX| 国产一区二区三区自产| 中文字幕人妻一区二区三区| 熟女少妇一区二区三区| 久久久久久国产精品美女| 草莓丝瓜向日葵黄瓜榴莲IOS| 日本久久三级电影院| 国语对白刺激在线视频国产网红| 51成品网站W灬源码1688| 无码人妻精品一区二区三区免费| 乱码人妻一区二区三区| 国产成人亚洲综合无码DVD| 越南少妇BBV叉叉叉|