亚洲国产第一_开心网五月色综合亚洲_日本一级特黄特色大片免费观看_久久久久久久久久免观看

Hello! 歡迎來到小浪云!


【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制


1. 前文鋪墊

進(jìn)程狀態(tài)是task_struct內(nèi)的一個(gè)整數(shù);進(jìn)行:進(jìn)程在調(diào)度隊(duì)列中,進(jìn)程的狀態(tài)都是running,阻塞:等待某種設(shè)備或者資源就緒。進(jìn)程是一個(gè)隊(duì)列,設(shè)備也是一個(gè)隊(duì)列,當(dāng)我們讀磁盤,讀網(wǎng)卡的時(shí)候,如果對(duì)應(yīng)設(shè)備未就緒那么進(jìn)程就要阻塞等待了。進(jìn)程狀態(tài)變化的表現(xiàn)之一就是要在不同的隊(duì)列中進(jìn)行流動(dòng),本質(zhì)都是數(shù)據(jù)結(jié)構(gòu)的增刪查改!

理解內(nèi)核鏈表

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

如果一個(gè)類里面有多個(gè)next,prve,那么就可以把任何一個(gè)task_struct即屬于運(yùn)行隊(duì)列,又屬于全局鏈表,還可以把它放到二叉樹中等。

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

2. 進(jìn)程狀態(tài)

一個(gè)進(jìn)程可以有幾個(gè)狀態(tài)(在Linux內(nèi)核里,進(jìn)程有時(shí)候也叫做任務(wù))。

下面的狀態(tài)在kernel源代碼里定義:代碼語言:JavaScript代碼運(yùn)行次數(shù):0運(yùn)行復(fù)制

/**The task state array is a strange "bitmap" of*reasons to sleep. Thus "running" is zero, and*you can test for combinations of others with*simple bit tests.*/static const char *const task_state_array[] = { "R (running)", /*0 */ "S (sleeping)", /*1 */ "D (disk sleep)", /*2 */ "T (stopped)", /*4 */ "t (tracing stop)", /*8 */ "X (dead)", /*16 */ "Z (zombie)", /*32 */};

R 運(yùn)行或可運(yùn)行 (Running 或 Runnable)狀態(tài)描述: 進(jìn)程正在CPU上執(zhí)行,或在運(yùn)行隊(duì)列中等待調(diào)度。觸發(fā)場(chǎng)景: 進(jìn)程處于活動(dòng)狀態(tài),正在執(zhí)行或準(zhǔn)備執(zhí)行。S 可中斷睡眠(Interruptible Sleep)狀態(tài)描述: 進(jìn)程在等待事件完成(如I/O操作、信號(hào)),可被信號(hào)中斷。觸發(fā)場(chǎng)景: 例如調(diào)用 sleep()、read() 等阻塞操作時(shí)。D 不可中斷睡眠(Uninterruptible Sleep)狀態(tài)描述: 進(jìn)程等待不可中斷的操作(如硬件I/O),不響應(yīng)信號(hào)。觸發(fā)場(chǎng)景: 常見于磁盤I/O或某些內(nèi)核操作,需等待操作完成。T 停止(Stopped)狀態(tài)描述: 進(jìn)程被信號(hào)(如 SigsTOP、SIGTSTP)暫停,需 SIGCONT 恢復(fù)。觸發(fā)場(chǎng)景: 手動(dòng)暫停進(jìn)程(如按 Ctrl+Z)或調(diào)試時(shí)。Z 僵尸(Zombie)狀態(tài)描述: 進(jìn)程已終止,但父進(jìn)程未調(diào)用 wait() 回收資源。觸發(fā)場(chǎng)景: 父進(jìn)程未正確處理子進(jìn)程退出,導(dǎo)致殘留進(jìn)程描述符。t 追蹤狀態(tài)(Tracing Stop)狀態(tài)描述: 進(jìn)程被調(diào)試器(如 gdb)跟蹤時(shí)暫停,屬于停止?fàn)顟B(tài)的一種。觸發(fā)場(chǎng)景: 調(diào)試器設(shè)置斷點(diǎn)或單步執(zhí)行時(shí)。X 死亡(Dead)狀態(tài)描述: 子進(jìn)程結(jié)束之后,父進(jìn)程獲取子進(jìn)程信息之前。觸發(fā)場(chǎng)景: 父進(jìn)程已回收子進(jìn)程狀態(tài),短暫存在后消失。2.1 進(jìn)程狀態(tài)查看

命令: ps aux / ps axj

2.2 僵尸進(jìn)程

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

僵死狀態(tài)(Zombies)是一個(gè)比較特殊的狀態(tài)。當(dāng)進(jìn)程退出并且父進(jìn)程(使用wait()系統(tǒng)調(diào)用)沒有讀取到子進(jìn)程退出的返回代碼時(shí)就會(huì)產(chǎn)生僵死(尸)進(jìn)程。僵死進(jìn)程會(huì)以終止?fàn)顟B(tài)保持在進(jìn)程表中,并且會(huì)一直在等待父進(jìn)程讀取退出狀態(tài)代碼。只要子進(jìn)程退出,父進(jìn)程還在運(yùn)行,但父進(jìn)程沒有讀取子進(jìn)程狀態(tài),子進(jìn)程進(jìn)入Z狀態(tài)。2.3 僵尸進(jìn)程危害進(jìn)程的退出狀態(tài)必須被維持下去,因?yàn)樗嬖V關(guān)心它的進(jìn)程(父進(jìn)程),你交給我的任務(wù),我 辦的怎么樣了。可父進(jìn)程如果一直不讀取,那子進(jìn)程就一直處于Z狀態(tài)?是的!維護(hù)退出狀態(tài)本身就是要用數(shù)據(jù)維護(hù),也屬于進(jìn)程基本信息,所以保存在task_struct(PCB)中,換句話說,Z狀態(tài)?直不退出,PCB一直都要維護(hù)?是的!那一個(gè)父進(jìn)程創(chuàng)建了很多子進(jìn)程,就是不回收,是不是就會(huì)造成內(nèi)存資源的浪費(fèi)?是的!因?yàn)?a href="http://www.nydupiwu.com/help/index.php/tag/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84">數(shù)據(jù)結(jié)構(gòu)對(duì)象本身就要占用內(nèi)存,c語言中定義一個(gè)結(jié)構(gòu)體變量(對(duì)象),是要在內(nèi)存的某個(gè)位置進(jìn)行開辟空間,那就會(huì)存在內(nèi)存泄漏?是的! 如何避免呢?我們后期講。2.4 孤兒進(jìn)程我們先來創(chuàng)建一段代碼

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

代碼運(yùn)行后,子進(jìn)程一直運(yùn)行,父進(jìn)程運(yùn)行5秒后退出

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

這個(gè)1號(hào)進(jìn)程是誰呢?top一下,我們可以看到它是systemd

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

我們繼續(xù)查一下這個(gè)systemd

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

為什么子進(jìn)程會(huì)被1(systemd)號(hào)進(jìn)程領(lǐng)養(yǎng)呢?如果不領(lǐng)養(yǎng)會(huì)出現(xiàn)什么問題呢? 答案是如果不被領(lǐng)養(yǎng),那么這個(gè)子進(jìn)程就進(jìn)入僵尸進(jìn)程,有可能會(huì)造成內(nèi)存泄漏父進(jìn)程為什么不會(huì)變成孤兒進(jìn)程或者僵尸進(jìn)程呢? 答案是父進(jìn)程也有自己的父進(jìn)程,父進(jìn)程的父進(jìn)程就是bash一旦進(jìn)程變成孤兒進(jìn)程,它就會(huì)被1號(hào)進(jìn)程領(lǐng)養(yǎng),變成后臺(tái)進(jìn)程,這時(shí)候Ctrl c就殺不掉它了,我們只能使用kill來殺死。3. 進(jìn)程優(yōu)先級(jí)3.1 概念cpu資源分配的先后順序,就是指進(jìn)程的優(yōu)先級(jí)(priority)。目標(biāo)資源稀缺,導(dǎo)致要通過優(yōu)先級(jí)確認(rèn)誰先誰后的問題。優(yōu)先權(quán)高的進(jìn)程有優(yōu)先執(zhí)行權(quán)利。配置進(jìn)程優(yōu)先級(jí)對(duì)多任務(wù)環(huán)境的linux很有用,可以改善系統(tǒng)性能。還可以把進(jìn)程運(yùn)行到指定的CPU上,這樣一來,把不重要的進(jìn)程安排到某個(gè)CPU,可以大大改善系統(tǒng)整體性能。優(yōu)先級(jí) vs 權(quán)限:優(yōu)先級(jí)是能得到資源,先后的問題,權(quán)限是能否得到資源的問題

??優(yōu)先級(jí)其實(shí)也是一種數(shù)字,是task_struct中的一種屬性,數(shù)字值越低,優(yōu)先級(jí)越高 ,基于時(shí)間片的分時(shí)操作系統(tǒng),優(yōu)先級(jí)未來可能變化,但變化的幅度不能太大

3.2 查看系統(tǒng)進(jìn)程命令ps -al,其中a表示所有,l表示詳細(xì)信息。我們上上面代碼中的父進(jìn)程不再退出,父子進(jìn)程一直運(yùn)行,再運(yùn)行代碼

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

linux系統(tǒng)中,每個(gè)用戶都有一個(gè)UID,linux中識(shí)別用戶就是用UID識(shí)別的。

UID:代表執(zhí)行者的身份PID:代表這個(gè)進(jìn)程的代號(hào)PPID:代表這個(gè)進(jìn)程是由哪個(gè)進(jìn)程發(fā)展衍生出來的,亦即父進(jìn)程的代號(hào)PRI:代表這個(gè)進(jìn)程可被執(zhí)行的優(yōu)先級(jí),其值越小越早被執(zhí)行。進(jìn)程優(yōu)先級(jí)默認(rèn):80NI:代表這個(gè)進(jìn)程優(yōu)先級(jí)的修正數(shù)據(jù),nice值 ??進(jìn)程真實(shí)的優(yōu)先級(jí) = PRI(默認(rèn)) + NI ??PRI(new) = PRI(old) + nice所以,調(diào)整進(jìn)程優(yōu)先級(jí),在Linux下,就是調(diào)整進(jìn)程nice值nice其取值范圍是-20至19,一共40個(gè)級(jí)別。Linux進(jìn)程優(yōu)先級(jí)范圍[60,99]查UID,命令ls -ln

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

sp用戶對(duì)應(yīng)的UID就是1001,文件創(chuàng)建的時(shí)候會(huì)把這個(gè)UID保存起來表明這個(gè)文件是誰創(chuàng)建的,進(jìn)程創(chuàng)建的時(shí)候也會(huì)把UID保存起來表明進(jìn)程是誰創(chuàng)建的。 ? 所以當(dāng)我們?cè)L問一個(gè)文件時(shí),系統(tǒng)怎么識(shí)別出我們是擁有者,所屬組,或者other呢,我們?cè)L問文件時(shí)本質(zhì)就是進(jìn)程在訪問文件,進(jìn)程怎么知道我們是誰呢?答案是是誰啟動(dòng)的這個(gè)進(jìn)程,進(jìn)程就知道這個(gè)人的UID,這個(gè)文件是誰創(chuàng)建的這個(gè)文件的UID就有了,所以一個(gè)進(jìn)程將來拿著它的UID和文件的UID做對(duì)比,相等了就是擁有者,不相等查下一個(gè),兩個(gè)都不相等就是 other。 ??linux系統(tǒng)中,訪問任何資源都是進(jìn)程訪問,進(jìn)程就代表用戶。

3.3 查看進(jìn)程優(yōu)先級(jí)的命令

用top命令更改已存在進(jìn)程的nice:

top 進(jìn)入top后按“r”?>輸入進(jìn)程PID?>輸入nice值 其他調(diào)整優(yōu)先級(jí)的命令:nice,renice linux調(diào)整優(yōu)先級(jí)的系統(tǒng)調(diào)用 3.4 補(bǔ)充概念-競(jìng)爭(zhēng)、獨(dú)立、并行、并發(fā)競(jìng)爭(zhēng)性: 系統(tǒng)進(jìn)程數(shù)目眾多,而CPU資源只有少量,甚至1個(gè),所以進(jìn)程之間是具有競(jìng)爭(zhēng)屬性的。為了高效完成任務(wù),更合理競(jìng)爭(zhēng)相關(guān)資源,便具有了優(yōu)先級(jí)獨(dú)立性: 多進(jìn)程運(yùn)行,需要獨(dú)享各種資源,多進(jìn)程運(yùn)行期間互不干擾并行: 多個(gè)進(jìn)程在多個(gè)CPU下分別,同時(shí)進(jìn)行運(yùn)行,這稱之為并行并發(fā): 多個(gè)進(jìn)程在?個(gè)CPU下采用進(jìn)程切換的方式,在一段時(shí)間之內(nèi),讓多個(gè)進(jìn)程都得以推進(jìn),稱之為并發(fā)

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

4. 進(jìn)程切換

先談兩個(gè)問題:

循環(huán)進(jìn)程是如何運(yùn)行的 我們平時(shí)在vs中寫一個(gè)while(1)的死循環(huán),一旦跑起來我們就會(huì)發(fā)現(xiàn)系統(tǒng)會(huì)變卡了,但是不會(huì)卡死。 a.一旦一個(gè)進(jìn)程占有CPU,會(huì)把自己的代碼跑完嗎?不會(huì)!(除非這個(gè)代碼很短)每個(gè)進(jìn)程系統(tǒng)都會(huì)為它分配一個(gè)叫做時(shí)間片的東西。所以每一個(gè)進(jìn)程擁有CPU資源都不是永久性的,而是臨時(shí)性的。 b.死循環(huán)進(jìn)程不會(huì)打死進(jìn)程,因?yàn)樗姥h(huán)進(jìn)程不會(huì)一直占用CPU!cpu,寄存器 cpu執(zhí)行一個(gè)進(jìn)程的時(shí)候就和PCB的關(guān)系不大了,cpu重點(diǎn)是訪問的是進(jìn)程的代碼和數(shù)據(jù),所以cpu會(huì)訪問當(dāng)前進(jìn)程的代碼和數(shù)據(jù),為了能夠處理一條一條的代碼和數(shù)據(jù),所以cpu中會(huì)存在很多的寄存器,每個(gè)寄存器在cpu內(nèi)部都有著臨時(shí)保存數(shù)據(jù)的任務(wù),所以當(dāng)進(jìn)程再跑時(shí),寄存器就會(huì)被填上臨時(shí)值,有的是計(jì)算結(jié)果,浮點(diǎn)數(shù)計(jì)算有沒有錯(cuò)誤等。 結(jié)論: a.寄存器就是cpu內(nèi)部的臨時(shí)空間 b. 寄存器 != 寄存器里面的數(shù)據(jù)


進(jìn)程如何切換? CPU上下文切換:其實(shí)際含義是任務(wù)切換,或者CPU寄存器切換。當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài),也就是CPU寄存器中的全部?jī)?nèi)容。這些內(nèi)容被保存在任務(wù)自己的中,入工作完成后就把下一個(gè)將要運(yùn)行的任務(wù)的當(dāng)前狀況從該任務(wù)的中重新裝入CPU寄存器,并開始下一個(gè)任務(wù)的運(yùn)行,這一過程就是context switch

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

進(jìn)程切換最核心的就是保存和恢復(fù)當(dāng)前進(jìn)程的硬件上下文數(shù)據(jù),即cpu內(nèi)寄存器的內(nèi)容。

保存在哪里? 保存到進(jìn)程的task_struct里面如何區(qū)分新的進(jìn)程和已經(jīng)調(diào)度過的進(jìn)程? 在task_struct中增加一個(gè)標(biāo)記位。5.Linux2.6內(nèi)核進(jìn)程O(1)調(diào)度隊(duì)列

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

一個(gè)CPU擁有一個(gè)runqueue如果有多個(gè)CPU就要考慮進(jìn)程個(gè)數(shù)的負(fù)載均衡問題優(yōu)先級(jí)普通優(yōu)先級(jí):100?139(我們都是普通的優(yōu)先級(jí),想想nice值的取值范圍,可與之對(duì)應(yīng)!)實(shí)時(shí)優(yōu)先級(jí):0?99(不關(guān)心)活動(dòng)隊(duì)列時(shí)間片還沒有結(jié)束的所有進(jìn)程都按照優(yōu)先級(jí)放在該隊(duì)列nr_active:總共有多少個(gè)運(yùn)行狀態(tài)的進(jìn)程queue[140]:一個(gè)元素就是一個(gè)進(jìn)程隊(duì)列,相同優(yōu)先級(jí)的進(jìn)程按照FIFO規(guī)則進(jìn)行排隊(duì)調(diào)度,所以,數(shù)組下標(biāo)就是優(yōu)先級(jí)!從該結(jié)構(gòu)中,選擇一個(gè)最合適的進(jìn)程,過程是怎么的呢? a. 從0下標(biāo)開始遍歷queue[140] b. 找到第一個(gè)非空隊(duì)列,該隊(duì)列必定為優(yōu)先級(jí)最高的隊(duì)列 c. 拿到選中隊(duì)列的第一個(gè)進(jìn)程,開始運(yùn)行,調(diào)度完成! d. 遍歷queue[140]時(shí)間復(fù)雜度是常數(shù)!但還是太低效了!bitmap[5]:一共140個(gè)優(yōu)先級(jí),一共140個(gè)進(jìn)程隊(duì)列,為了提高查找非空隊(duì)列的效率,就可以用5*32個(gè)比特位表示隊(duì)列是否為空,這樣,便可以大 大提高查找效率。

【Linux篇】進(jìn)程狀態(tài)(僵尸進(jìn)程,孤兒進(jìn)程),優(yōu)先級(jí)與調(diào)度機(jī)制

過期隊(duì)列過期隊(duì)列和活動(dòng)隊(duì)列結(jié)構(gòu)一模一樣過期隊(duì)列上放置的進(jìn)程,都是時(shí)間片耗盡的進(jìn)程當(dāng)活動(dòng)隊(duì)列上的進(jìn)程都被處理完畢之后,對(duì)過期隊(duì)列的進(jìn)程進(jìn)行時(shí)間片重新計(jì)算active指針和expired指針active指針永遠(yuǎn)指向活動(dòng)隊(duì)列expired指針永遠(yuǎn)指向過期隊(duì)列活動(dòng)隊(duì)列上的進(jìn)程會(huì)越來越少,過期隊(duì)列上的進(jìn)程會(huì)越來越多,因?yàn)檫M(jìn)程時(shí)間片到期時(shí)一直都存在的。在合適的時(shí)候,只要能夠交換active指針和expired指針的內(nèi)容,就相當(dāng)于有具有了一批新的活動(dòng)進(jìn)程!

linux真是算法調(diào)度:O(1)調(diào)度算法 再次理解nice值:nice值是為了保證老進(jìn)程的優(yōu)先級(jí)不被強(qiáng)制改變,原本進(jìn)程的優(yōu)先級(jí)不改變,加上一個(gè)nice值,當(dāng)本次調(diào)度完重新放入過期隊(duì)列時(shí),更新優(yōu)先級(jí),鏈入到指定位置。

相關(guān)閱讀