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

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一起分析Linux經(jīng)典技巧之進(jìn)程ID號(hào)

本篇文章給大家?guī)?lái)了linux中進(jìn)程ID號(hào)分析的相關(guān)知識(shí),Linux進(jìn)程總是會(huì)分配一個(gè)號(hào)碼用于在其命名空間中唯一地標(biāo)識(shí)它們。該號(hào)碼被稱作進(jìn)程ID號(hào),簡(jiǎn)稱PID,下面就一起來(lái)看一下相關(guān)問(wèn)題,希望對(duì)大家有幫助。

一起分析Linux經(jīng)典技巧之進(jìn)程ID號(hào)

??本文中的代碼摘自 Linux內(nèi)核5.15.13版本。

??Linux進(jìn)程總是會(huì)分配一個(gè)號(hào)碼用于在其命名空間中唯一地標(biāo)識(shí)它們。該號(hào)碼被稱作進(jìn)程ID號(hào),簡(jiǎn)稱PID。用fork或clone產(chǎn)生的每個(gè)進(jìn)程都由內(nèi)核自動(dòng)地分配了一個(gè)新的唯一的PID值。

一、進(jìn)程ID

1.1、其他ID

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

??1、 處于某個(gè)線程組(在一個(gè)進(jìn)程中,以標(biāo)志CLONE_THREAD來(lái)調(diào)用clone建立的該進(jìn)程的不同的執(zhí)行上下文,我們?cè)诤笪臅?huì)看到)中的所有進(jìn)程都有統(tǒng)一的線程組ID( TGID)。如果進(jìn)程沒有使用線程,則其PID和TGID相同。線程組中的主進(jìn)程被稱作組長(zhǎng)( group leader)。通過(guò)clone創(chuàng)建的所有線程的task_struct的group_leader成員,會(huì)指向組長(zhǎng)的task_struct實(shí)例。

??2、另外,獨(dú)立進(jìn)程可以合并成進(jìn)程組(使用setpgrp系統(tǒng)調(diào)用)。進(jìn)程組成員的task_struct的pgrp屬性值都是相同的,即進(jìn)程組組長(zhǎng)的PID。進(jìn)程組簡(jiǎn)化了向組的所有成員發(fā)送信號(hào)的操作,這對(duì)于各種系統(tǒng)程序設(shè)計(jì)應(yīng)用(參見系統(tǒng)程序設(shè)計(jì)方面的文獻(xiàn),例如[ SR05])是有用的。請(qǐng)注意,用管道連接的進(jìn)程包含在同一個(gè)進(jìn)程組中。

??3、 幾個(gè)進(jìn)程組可以合并成一個(gè)會(huì)話。會(huì)話中的所有進(jìn)程都有同樣的會(huì)話ID,保存在task_struct的session成員中。 SID可以使用setsid系統(tǒng)調(diào)用設(shè)置。它可以用于終端程序設(shè)計(jì)。

1.2、全局ID和局部ID

??名空間增加了PID管理的復(fù)雜性。 PID命名空間按層次組織。在建立一個(gè)新的命名空間時(shí),該命名空間中的所有PID對(duì)父命名空間都是可見的,但子命名空間無(wú)法看到父命名空間的PID。但這意味著某些進(jìn)程具有多個(gè)PID,凡可以看到該進(jìn)程的命名空間,都會(huì)為其分配一個(gè)PID。 這必須反映在數(shù)據(jù)結(jié)構(gòu)中。我們必須區(qū)分局部ID和全局ID。

??1、 全局ID是在內(nèi)核本身和初始命名空間中的唯一ID號(hào),在系統(tǒng)啟動(dòng)期間開始的init進(jìn)程即屬于初始命名空間。對(duì)每個(gè)ID類型,都有一個(gè)給定的全局ID,保證在整個(gè)系統(tǒng)中是唯一的。

??2、 局部ID屬于某個(gè)特定的命名空間,不具備全局有效性。對(duì)每個(gè)ID類型,它們?cè)谒鶎俚拿臻g內(nèi)部有效,但類型相同、值也相同的ID可能出現(xiàn)在不同的命名空間中。

1.3、ID實(shí)現(xiàn)

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

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

??這兩項(xiàng)都是pid_t類型,該類型定義為__kernel_pid_t,后者由各個(gè)體系結(jié)構(gòu)分別定義。通常定義為int,即可以同時(shí)使用232個(gè)不同的ID。

二、管理PID

??一個(gè)小型的子系統(tǒng)稱之為PID分配器( pid allocator)用于加速新ID的分配。此外,內(nèi)核需要提供輔助函數(shù),以實(shí)現(xiàn)通過(guò)ID及其類型查找進(jìn)程的task_struct的功能,以及將ID的內(nèi)核表示形式和用戶空間可見的數(shù)值進(jìn)行轉(zhuǎn)換的功能。

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

??在pid_namespace.h文件內(nèi)有如下定義:

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;

??每個(gè)PID命名空間都具有一個(gè)進(jìn)程,其發(fā)揮的作用相當(dāng)于全局的init進(jìn)程。 init的一個(gè)目的是對(duì)孤兒進(jìn)程調(diào)用wait4,命名空間局部的init變體也必須完成該工作。 child_reaper保存了指向該進(jìn)程的task_struct的指針。

??parent是指向父命名空間的指針, level表示當(dāng)前命名空間在命名空間層次結(jié)構(gòu)中的深度。初始命名空間的level為0,該命名空間的子空間level為1,下一層的子空間level為2,依次遞推。level的計(jì)算比較重要,因?yàn)閘evel較高的命名空間中的ID,對(duì)level較低的命名空間來(lái)說(shuō)是可見的。從給定的level設(shè)置,內(nèi)核即可推斷進(jìn)程會(huì)關(guān)聯(lián)到多少個(gè)ID。

2.2、PID的管理

2.2.1、PID的數(shù)據(jù)結(jié)構(gòu)

??PID的管理圍繞兩個(gè)數(shù)據(jù)結(jié)構(gòu)展開: struct pid是內(nèi)核對(duì)PID的內(nèi)部表示,而struct upid則表示特定的命名空間中可見的信息。兩個(gè)結(jié)構(gòu)的定義在文件pid.h內(nèi),分別如下:

/*  * 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];};

??對(duì)于struct upid, nr表示ID的數(shù)值, ns是指向該ID所屬的命名空間的指針。所有的upid實(shí)例都保存在一個(gè)散列表中。 pid_chain用內(nèi)核的標(biāo)準(zhǔn)方法實(shí)現(xiàn)了散列溢出鏈表。struct pid的定義首先是一個(gè)引用計(jì)數(shù)器count。 tasks是一個(gè)數(shù)組,每個(gè)數(shù)組項(xiàng)都是一個(gè)散列表頭,對(duì)應(yīng)于一個(gè)ID類型。這樣做是必要的,因?yàn)橐粋€(gè)ID可能用于幾個(gè)進(jìn)程。所有共享同一給定ID的task_struct實(shí)例,都通過(guò)該列表連接起來(lái)。 PIDTYPE_MAX表示ID類型的數(shù)目:

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

2.2.2、PID與進(jìn)程的聯(lián)系

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
40岁大乳的熟妇在线观看| А√天堂中文在线| 无人区码二码三码四码区别| 国产一本一道久久香蕉| 吃奶呻吟打开双腿做受动态图 | 国产成人精品一区二区视频| www.comAV在线观看| 永久免费不卡在线观看黄网站| 亚洲CHINESE男同志GAY| 天天摸夜夜添添到高潮水汪汪| 欧美亚洲一区二区三区| 免费韩国漫画网站观看| 久久久午夜成人噜噜噜| 交换朋友夫妻客厅互换4韩国| 国产精品亚韩精品无码A在线| 成人无码一区二区三区| XXX片黑人又大又粗又长| 18禁无遮拦无码国产在线播放| 亚洲熟妇AV一区二区三区| 亚洲丰满少妇XXXXX高潮对白| 无码中文字幕加勒比高清| 亚洲VA韩国VA欧美VA| 有人有在线观看的片吗WWW| 亚洲一线产区二线产区区别| 天天躁日日躁狠狠躁日日躁| 亚洲AV无码乱码国产精品老妇 | 国产区精品福利在线社区| 国产成人欧美精品视频| 出租房里的交互高康张睿| 国产色婷婷五月精品综合在线 | CHINESE国产AVVIDEOXXXX实拍| 40岁成熟女人牲交片20分钟| 丰满人妻少妇无码喷水| 国产成人精品久久久久| 精品久久久久久亚洲精品| 精品人妻系列无码人妻不卡| 女人被狂躁C到高潮视频| 欧美VA亚洲VA在线观看| 欧美黑人巨大最猛性XXXXX| 欧美日韩人妻精品| 人妻少妇看A偷人无码精品| 日本中文字幕一区二区高清在线| 日产无人区一线二线三线小说 | 亚洲国产精品久久久久网站| 亚洲精品自产拍在线观看| 亚洲熟女www一区二区三区| Y111111国产精品久久久| 国产日产亚洲系列最新| 奶头被民工们吸得又红又肿怎么办| 女人三A级毛片视频| 无码人妻丰满熟妇片毛片| 亚洲AV极品无码专区亚洲AV| 亚洲精品无码久久久| 在线精品国产一区二区三区| 996久久国产精品线观看| 草草影院CCYY国产日本欧美| 国产成人AV片无码免费| 看全色黄大色黄女片爽在线看 | 色噜噜狠狼综合在线视频| 天天爱天天做天天爽| 尹人香蕉久久99天天拍| 国产精品成人无码免费| 狠狠88综合久久久久综合网| 久久久久久精品免费免费软件| 男人扒开女人的腿做爽爽视频| 无码中文字幕AV免费放软件 | 亚洲无线观看国产高清| 福利一区福利二区| 国产在线无码一区二区三区| 轻点灬大JI巴太粗太长了| 少妇无码一区二区二三区| 亚洲AV无码一区二区二三区下载 | 国产日韩精品欧美一区喷水| 欧美性猛交一区二区| 亚洲欧美精品视频| 7M精品福利视频导航| 厨房里我扒了岳的内裤| 乱人伦人妻中文字幕不卡| 日本XXXⅩ69XXXX护土| 无人区一码二码三码四码区别在哪| 亚洲精品无码乱码成人| 国产AV丝袜熟女AV一区| 精品熟人妻一区二区三区四区不卡| 男生和女生在一起差差差| 色偷偷色噜噜狠狠网站30根| 亚洲国产精品久久青草无码| 丰满少妇高潮惨叫在线观看| 女上男下啪啪激烈高潮无遮盖| 亚洲人成网线在线播放| 国产片AV国语在线观麻豆| 日本护士毛茸茸XX| 亚洲VA韩国VA欧美VA| 乖宝真紧H嘶爽老子H| 久久国产高潮流白浆免费观看| 欧美激情视频一区| 亚洲愉拍自拍欧美精品APP| 国产女人喷潮视频免费| 撒尿特写XXXⅩ| 亚洲色无码专区一区| 国产偷V国产偷V亚洲高清| 少妇人妻好深好紧精品无码| 亚洲性色AV一区二区三区| 国产真人无遮挡作爱免费视频| 色妞色视频一区二区三区四区| 99久久精品费精品国产一区二| 国产午夜成人精品视频APP| 久久久久无码国产精品不卡| 亚洲AV美国AV产亚洲AV图片| 国产精品白丝久久AV网站| 日韩精品成熟妇人Av一区二区| BGMBGMBGM老头野外| 免费萌白酱国产一区二区三区| 亚洲中文字幕久久精品无码APP| 狠狠色合综情丁香五月| 亚洲AV成人无码久久精品澳门| chineSe老女人老熟妇hd| 蜜臀AV在线播放| 亚洲 丝袜 另类 校园 欧美| CHINESE激烈高潮HD| 男人放进女人里面叫什么| 涨乳催乳改造调教公主| 国产精品久久久久精品香蕉| 欧美精欧美乱码一二三四区| 中文字幕成熟丰满人妻| 国产午夜福利短视频在线观看| 无码欧亚熟妇人妻AV在线外遇 | 少妇搡BBBB搡BBB搡| 丰满的继牳3中文字幕系列| 日本免费一区二区三区四区五六区| WWW久久久天天COM| 人妻丰满熟妇AⅤ无码| 扒开双腿猛进入喷水高潮叫声 | 国产精品V欧美精品V日韩精品| 十八禁啪啪污污网站免费下载| 成人免费视频无码专区| 乱码一卡2卡3卡4卡精品| 曰批全过程免费视频观看| 美女直播全婐APP免费| 中文字幕在线亚洲日韩6页| 狠狠躁天天躁男人| 亚洲国产精品日韩AV不卡在线| 精品久久久久久无码人妻VR| 亚洲色欲综合一区二区三区小说 | 玉蒲团Ⅱ之性战奶水潘金莲小说| 麻豆传播媒体APP大全免费版| 最新国产AⅤ精品无码| 欧美极品性饥渴少妇大战黑人| SQUIRT VIDEO喷水抽| 色欲av成人蜜臀av不卡| 国产精品久久国产精麻豆99网站| 性色AV无码专区一ⅤA亚洲| 精品成人乱色一区二区| 四川少妇BBW搡BBBB槡BB| CHINA熟妇老熟女HD| 日本一二三四高清观看视频| 各处沟厕大尺度偷拍女厕嘘嘘| 天堂А√在线中文在线| 国内精品伊人久久久久777| 无码人妻 在线视频| 韩国毛片两个母亲电影在线播放| 天天狠天天透天天伊人| 国产女主播喷水视频在线观看| 亚洲国产区男人本色| 国产做国产爱免费视频| 无码精品人妻一区二区三区影院| 东京热一区二区三区无码视频| 人妻出轨无码AV| 国产A国产片国产| 亚洲V国产V天堂A无码二区| 久久综合亚洲色HEZYO国产| BGMBGMBGM老妇视频| 视频一区二区三区免费| 黑人上司与人妻激烈中文字幕| 永久免费看真人动漫网站| 琪琪午夜伦伦电影理论片| AV在线亚洲AV 是全亚洲| 牛鞭进入女人下身的视频| 成人无码A区在线观看视频| 小荡货奶真大水真多紧视频| 国产精品丝袜一区二区三区 | 亚洲AV中文无码字幕色三| 邻居一晚让我高潮3次正常吗| 亚洲色欲色欲色欲WWW| 欧美性大战久久久久久| 国产精品久久国产精品99盘| 亚洲人成网线在线播放| 欧美一区二区三区激情| 国产精品无码久久综合网| 又粗又大又硬毛片免费看| 日韩GAY小鲜肉啪啪18禁| 极品粉嫩小泬50P| 亚洲欧美妆和亚洲妆的区别| 欧美搡BBBBB搡BBBBB| 国产裸体美女永久免费无遮挡| 无码人妻一区二区三区四区AV| 久久九九久精品国产88| 中国在线观看免费高清完整版| 男女乱婬免费视频黑人| 国产成人啪精品视频免费APP| 亚洲熟妇A∨日韩熟妇在线|