進程控制編程預習

1.爲什麼需要多進程,爲何需要併發

有了併發技術,就是可以在同一時間同時執行多條任務的技術,程序不僅可以規規矩矩的一條線執行,可以多條線同時執行,這樣就可以實現更加強大的功能,提供更多的服務,所以併發是必不可少的。


2.何謂進程調度

在linux中,首先,爲每個進程指派一定的運行時間,這個時間通常很短,短到以毫秒爲單位,然後依照某種規則,從衆多進程中挑選一個投入運行,其他的進程暫時等待,當這個正在運行的進程時間耗盡,或執行完畢退出,或因某種原因暫停,linux就會重新進行調度,挑選下一個進程投入運行。因爲每個進程佔用的時間片都很短,從使用者的角度看,就好像多個進程同時運行一樣。


3.kill,killall,pkill,xkill的區別

kill的應用是和ps 或pgrep 命令結合在一起使用的;
kill 的用法:
kill [信號代碼]   進程ID
注:信號代碼能省略;我們常用的信號代碼是 -9 ,表示強制終止;

對於殭屍進程,能用kill -9 來強制終止退出;
比如一個程式已完全死掉,如果kill 不加信號強度是沒有辦法退出,最佳的辦法就是加信號強度 -9 


killall 通過程式的名字,直接殺死所有進程,咱們簡單說一下就行了。
用法:killall 正在運行的程式名
killall 也和ps或pgrep 結合使用,比較方便;通過ps或pgrep 來查看哪些程式在運行;


pkill 和killall 應用方法差不多,也是直接殺死運行中的程式;如果你想殺掉單個進程,請用kill 來殺掉。
應用方法:
#pkill    正在運行的程式名


xkill 是在桌面用的殺死圖像界面的程式。比如當firefox 出現崩潰不能退出時,點鼠標就能殺死firefox 。當xkill運行時出來和個人腦骨的圖標,哪個圖像程式崩潰一點就OK了。如果你想終止xkill ,就按右鍵取消;
xkill 調用方法:
[vivian@localhost vivian]$ xkill


4.linux進程的三態是哪些

1.就緒狀態,Ready, 當進程已分配到除cpu以外的所有必要的資源,只要獲得處理器便可以立即執行,這時的進程狀態稱爲就緒狀態。

2.執行狀態,Running, 當進程已獲得處理器,其程序正在處理器上執行,此時的進程狀態稱爲執行狀態。

3.阻塞狀態,Blocked, 正在執行的過程,由於等待某個進程發生而無法執行時,便放棄處理機而處於阻塞狀態。引起進程阻塞的事件可以有多種,如等待I/O完成,申請緩衝區不能滿足,等待信號等。


5.三種狀態是如何轉換的

1.就緒->執行。 處於就緒狀態的進程,當進程調度程序爲之分配了處理器後,該進程就緒狀態轉變成執行狀態。

2.執行->就緒。 處於執行狀態的進程在其執行過程中,因分配給它的一個時間片已用完而不得不讓出處理器,於是進程就從執行狀態轉變爲就緒狀態。

3.執行->阻塞。 正在執行的進程因等待某種事情發生而無法繼續執行時,便從執行狀態變成阻塞狀態。

4.阻塞->就緒。 處於阻塞狀態的進程,若其等待的事情已經發生,於是進程由阻塞狀態轉變爲就緒狀態。


6.進程調度用來做什麼?
(1)進程調度記錄者系統中所有進程的有關情況和狀態特徵

(2)進程調度負責從就緒隊列中選取一個就緒進程、分配給CPU並決定它運行多長時間。

(3)在進程的開始和結速階段,進程調度實施處理機的分配與回收、修改PCB表項等。

7.什麼時候發生進程調度?
(1)當新進程建立時,調度算法可以合理地選擇運行父進程或者子進程。

(2)在有進程退出時,必須從就緒隊列中引入新進程,如果就緒隊列爲空,通常運行系統提供的空閒進程。

(3)當一個進程因爲I/O阻塞或其他原因阻塞時,必須選擇另一個進程。

(4)在分時系統中,如果時間片用完,也要進行調度。


8.進程調度算法
(1)先到先服務(FCFS)算法。FCFS算法就是每次從就緒隊列中選擇一個最先進入該隊列的進程,把CPU分配給它。

(2)時間片輪轉(TRR)算法。TRR算法主要用於分時系統中的進程調度。每當執行進程調度時,總是從就緒隊列隊首選出進程,讓它在CPU上運行一個時間片的時間,當進程用完它的時間片之後,系統計時器發出時鐘中斷,該進程停止並被放到就緒隊列的隊尾,然後CPU分配給下一個進程,重複以上過程。就像我們打牌一樣,輪到你,你才能出牌,然後下手的人依次出牌,轉一圈後,又回到你出牌,如此往復。

(3)高優先級優先調度算法。該算法的原則是“重要的事先辦”,利用優先級調度算法時,給每一個進程確定一個優先級,調度時,從就緒隊列中選出優先級最該的進程,把CPU分配給它。但這有一個問題,如果在進程運行過程中出現比當前進程優先級更高的進程怎麼辦?這就涉及到‘搶佔式優先級’和‘非搶佔式優先級’。非搶佔式優先級類似於“你打完電話,他再打電話”,當前進程會一執行下去,直到任務完成後再讓出CPU。搶佔式優先級類似於“不等你說完,他就搶過電話”。當前進程遇到更高優先級的進程時,CPU被強行剝奪分配給給高優先級的進程。


9.什麼是優先級反轉

優先級反轉是指一個低優先級的任務持有一個被高優先級任務所需要的共享資源,高優先級任務因資源缺乏而處於阻塞狀態,一直等到低優先級任務釋放資源爲止,而低優先級獲得的cpu時間少,如果此時有優先級處於兩者之間的任務,並且不需要那個共享資源,則該中優先級的任務反而超過這兩個任務而獲得cpu資源。如果高優先級等待資源時不是阻塞等待,而是忙循環,則可能永遠無法獲得資源,因爲此時低優先級進程無法與高優先級爭奪cpu資源,從而無法執行,進而無法釋放資源,造成的後果就是高優先級任務無法獲得資源而繼續運行。


10.如何避免殭屍進程

父進程 通過wait和waitpid等函數等待子進程結束,這會導致父進程掛起。

如果父進程很忙,那麼可以用signal函數爲SIGCHLD安裝handler,因爲子進程結束後,父進程會受到該信號,可以在handler中調用wait回收。

如果父進程不關心進程什麼時候結束,那麼可以用signal(SIGCHLD, SIG_IGN)通知內核,自己對進程的結束不感興趣,那麼子進程結束後,內核會回收,並不再給父進程發送信號。

還有一些技巧,就是fork兩次,父進程fork一個子進程,然後繼續工作,子進程fork一個孫進程後退出,那麼孫進程被init接管,孫進程結束後,init會回收,不過子進程的回收還要自己做。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章