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