进程简述
1.為什么需要多進(jìn)程,為何需要并發(fā)
有了并發(fā)技術(shù),就是可以在同一時(shí)間同時(shí)執(zhí)行多條任務(wù)的技術(shù),程序不僅可以規(guī)規(guī)矩矩的一條線執(zhí)行,可以多條線同時(shí)執(zhí)行,這樣就可以實(shí)現(xiàn)更加強(qiáng)大的功能,提供更多的服務(wù),所以并發(fā)是必不可少的。
2.何謂進(jìn)程調(diào)度
在linux中,首先,為每個(gè)進(jìn)程指派一定的運(yùn)行時(shí)間,這個(gè)時(shí)間通常很短,短到以毫秒為單位,然后依照某種規(guī)則,從眾多進(jìn)程中挑選一個(gè)投入運(yùn)行,其他的進(jìn)程暫時(shí)等待,當(dāng)這個(gè)正在運(yùn)行的進(jìn)程時(shí)間耗盡,或執(zhí)行完畢退出,或因某種原因暫停,linux就會(huì)重新進(jìn)行調(diào)度,挑選下一個(gè)進(jìn)程投入運(yùn)行。因?yàn)槊總€(gè)進(jìn)程占用的時(shí)間片都很短,從使用者的角度看,就好像多個(gè)進(jìn)程同時(shí)運(yùn)行一樣。
3.kill,killall,pkill,xkill的區(qū)別
kill的應(yīng)用是和ps 或pgrep 命令結(jié)合在一起使用的;
kill 的用法:
kill [信號(hào)代碼] ? 進(jìn)程ID
注:信號(hào)代碼能省略;我們常用的信號(hào)代碼是 -9 ,表示強(qiáng)制終止;
對(duì)于僵尸進(jìn)程,能用kill -9 來強(qiáng)制終止退出;
比如一個(gè)程式已完全死掉,如果kill 不加信號(hào)強(qiáng)度是沒有辦法退出,最佳的辦法就是加信號(hào)強(qiáng)度 -9?
killall 通過程式的名字,直接殺死所有進(jìn)程,咱們簡(jiǎn)單說一下就行了。
用法:killall 正在運(yùn)行的程式名
killall 也和ps或pgrep 結(jié)合使用,比較方便;通過ps或pgrep 來查看哪些程式在運(yùn)行;
pkill 和killall 應(yīng)用方法差不多,也是直接殺死運(yùn)行中的程式;如果你想殺掉單個(gè)進(jìn)程,請(qǐng)用kill 來殺掉。
應(yīng)用方法:
#pkill ? ?正在運(yùn)行的程式名
xkill 是在桌面用的殺死圖像界面的程式。比如當(dāng)firefox 出現(xiàn)崩潰不能退出時(shí),點(diǎn)鼠標(biāo)就能殺死firefox 。當(dāng)xkill運(yùn)行時(shí)出來和個(gè)人腦骨的圖標(biāo),哪個(gè)圖像程式崩潰一點(diǎn)就OK了。如果你想終止xkill ,就按右鍵取消;
xkill 調(diào)用方法:
[vivian@localhost vivian]$ xkill
4.linux進(jìn)程的三態(tài)是哪些
1.就緒狀態(tài),Ready, 當(dāng)進(jìn)程已分配到除cpu以外的所有必要的資源,只要獲得處理器便可以立即執(zhí)行,這時(shí)的進(jìn)程狀態(tài)稱為就緒狀態(tài)。
2.執(zhí)行狀態(tài),Running, 當(dāng)進(jìn)程已獲得處理器,其程序正在處理器上執(zhí)行,此時(shí)的進(jìn)程狀態(tài)稱為執(zhí)行狀態(tài)。
3.阻塞狀態(tài),Blocked, 正在執(zhí)行的過程,由于等待某個(gè)進(jìn)程發(fā)生而無法執(zhí)行時(shí),便放棄處理機(jī)而處于阻塞狀態(tài)。引起進(jìn)程阻塞的事件可以有多種,如等待I/O完成,申請(qǐng)緩沖區(qū)不能滿足,等待信號(hào)等。
5.三種狀態(tài)是如何轉(zhuǎn)換的
1.就緒->執(zhí)行。 處于就緒狀態(tài)的進(jìn)程,當(dāng)進(jìn)程調(diào)度程序?yàn)橹峙淞颂幚砥骱?#xff0c;該進(jìn)程就緒狀態(tài)轉(zhuǎn)變成執(zhí)行狀態(tài)。
2.執(zhí)行->就緒。 處于執(zhí)行狀態(tài)的進(jìn)程在其執(zhí)行過程中,因分配給它的一個(gè)時(shí)間片已用完而不得不讓出處理器,于是進(jìn)程就從執(zhí)行狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)。
3.執(zhí)行->阻塞。 正在執(zhí)行的進(jìn)程因等待某種事情發(fā)生而無法繼續(xù)執(zhí)行時(shí),便從執(zhí)行狀態(tài)變成阻塞狀態(tài)。
4.阻塞->就緒。 處于阻塞狀態(tài)的進(jìn)程,若其等待的事情已經(jīng)發(fā)生,于是進(jìn)程由阻塞狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)。
6.進(jìn)程調(diào)度用來做什么?
(1)進(jìn)程調(diào)度記錄者系統(tǒng)中所有進(jìn)程的有關(guān)情況和狀態(tài)特征
(2)進(jìn)程調(diào)度負(fù)責(zé)從就緒隊(duì)列中選取一個(gè)就緒進(jìn)程、分配給CPU并決定它運(yùn)行多長(zhǎng)時(shí)間。
(3)在進(jìn)程的開始和結(jié)速階段,進(jìn)程調(diào)度實(shí)施處理機(jī)的分配與回收、修改PCB表項(xiàng)等。
7.什么時(shí)候發(fā)生進(jìn)程調(diào)度?
(1)當(dāng)新進(jìn)程建立時(shí),調(diào)度算法可以合理地選擇運(yùn)行父進(jìn)程或者子進(jìn)程。
(2)在有進(jìn)程退出時(shí),必須從就緒隊(duì)列中引入新進(jìn)程,如果就緒隊(duì)列為空,通常運(yùn)行系統(tǒng)提供的空閑進(jìn)程。
(3)當(dāng)一個(gè)進(jìn)程因?yàn)镮/O阻塞或其他原因阻塞時(shí),必須選擇另一個(gè)進(jìn)程。
(4)在分時(shí)系統(tǒng)中,如果時(shí)間片用完,也要進(jìn)行調(diào)度。
8.進(jìn)程調(diào)度算法
(1)先到先服務(wù)(FCFS)算法。FCFS算法就是每次從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程,把CPU分配給它。
(2)時(shí)間片輪轉(zhuǎn)(TRR)算法。TRR算法主要用于分時(shí)系統(tǒng)中的進(jìn)程調(diào)度。每當(dāng)執(zhí)行進(jìn)程調(diào)度時(shí),總是從就緒隊(duì)列隊(duì)首選出進(jìn)程,讓它在CPU上運(yùn)行一個(gè)時(shí)間片的時(shí)間,當(dāng)進(jìn)程用完它的時(shí)間片之后,系統(tǒng)計(jì)時(shí)器發(fā)出時(shí)鐘中斷,該進(jìn)程停止并被放到就緒隊(duì)列的隊(duì)尾,然后CPU分配給下一個(gè)進(jìn)程,重復(fù)以上過程。就像我們打牌一樣,輪到你,你才能出牌,然后下手的人依次出牌,轉(zhuǎn)一圈后,又回到你出牌,如此往復(fù)。
(3)高優(yōu)先級(jí)優(yōu)先調(diào)度算法。該算法的原則是“重要的事先辦”,利用優(yōu)先級(jí)調(diào)度算法時(shí),給每一個(gè)進(jìn)程確定一個(gè)優(yōu)先級(jí),調(diào)度時(shí),從就緒隊(duì)列中選出優(yōu)先級(jí)最該的進(jìn)程,把CPU分配給它。但這有一個(gè)問題,如果在進(jìn)程運(yùn)行過程中出現(xiàn)比當(dāng)前進(jìn)程優(yōu)先級(jí)更高的進(jìn)程怎么辦?這就涉及到‘搶占式優(yōu)先級(jí)’和‘非搶占式優(yōu)先級(jí)’。非搶占式優(yōu)先級(jí)類似于“你打完電話,他再打電話”,當(dāng)前進(jìn)程會(huì)一執(zhí)行下去,直到任務(wù)完成后再讓出CPU。搶占式優(yōu)先級(jí)類似于“不等你說完,他就搶過電話”。當(dāng)前進(jìn)程遇到更高優(yōu)先級(jí)的進(jìn)程時(shí),CPU被強(qiáng)行剝奪分配給給高優(yōu)先級(jí)的進(jìn)程。
9.什么是優(yōu)先級(jí)反轉(zhuǎn)
優(yōu)先級(jí)反轉(zhuǎn)是指一個(gè)低優(yōu)先級(jí)的任務(wù)持有一個(gè)被高優(yōu)先級(jí)任務(wù)所需要的共享資源,高優(yōu)先級(jí)任務(wù)因資源缺乏而處于阻塞狀態(tài),一直等到低優(yōu)先級(jí)任務(wù)釋放資源為止,而低優(yōu)先級(jí)獲得的cpu時(shí)間少,如果此時(shí)有優(yōu)先級(jí)處于兩者之間的任務(wù),并且不需要那個(gè)共享資源,則該中優(yōu)先級(jí)的任務(wù)反而超過這兩個(gè)任務(wù)而獲得cpu資源。如果高優(yōu)先級(jí)等待資源時(shí)不是阻塞等待,而是忙循環(huán),則可能永遠(yuǎn)無法獲得資源,因?yàn)榇藭r(shí)低優(yōu)先級(jí)進(jìn)程無法與高優(yōu)先級(jí)爭(zhēng)奪cpu資源,從而無法執(zhí)行,進(jìn)而無法釋放資源,造成的后果就是高優(yōu)先級(jí)任務(wù)無法獲得資源而繼續(xù)運(yùn)行。
10.如何避免僵尸進(jìn)程
父進(jìn)程 通過wait和waitpid等函數(shù)等待子進(jìn)程結(jié)束,這會(huì)導(dǎo)致父進(jìn)程掛起。
如果父進(jìn)程很忙,那么可以用signal函數(shù)為SIGCHLD安裝handler,因?yàn)樽舆M(jìn)程結(jié)束后,父進(jìn)程會(huì)受到該信號(hào),可以在handler中調(diào)用wait回收。
如果父進(jìn)程不關(guān)心進(jìn)程什么時(shí)候結(jié)束,那么可以用signal(SIGCHLD, SIG_IGN)通知內(nèi)核,自己對(duì)進(jìn)程的結(jié)束不感興趣,那么子進(jìn)程結(jié)束后,內(nèi)核會(huì)回收,并不再給父進(jìn)程發(fā)送信號(hào)。
還有一些技巧,就是fork兩次,父進(jìn)程fork一個(gè)子進(jìn)程,然后繼續(xù)工作,子進(jìn)程fork一個(gè)孫進(jìn)程后退出,那么孫進(jìn)程被init接管,孫進(jìn)程結(jié)束后,init會(huì)回收,不過子進(jìn)程的回收還要自己做。
總結(jié)
- 上一篇: (time.h) 自己用
- 下一篇: PCB学习第一节内容整理