C4Labs Linux講座


由於主持人是jserv,所以是C4Labs開學以來第一次爆滿(?)。比起分享,這次的meeting更像是推坑用讀書會,書目為linux kernel development 3rd 。這本書不像OS恐龍書,它假定你對基本觀念有一部分的認知了,而多著墨在怎麼去用那些觀念,所以可能不適合新手入門,而且它的圖真的很少。

今天是第一次開講,所以只就幾個章節做了簡單的流覽。jserv分享還蠻有趣的,對於這次的會議內容,將談談作業系統的基本觀念與排程

程式 x 程序 x 執行緒

進入排程之前,先讓我們釐清一件事:

Program:沒有反應,就只是個程式碼的集合。
Process:執行中程式的實體。
Thread:Process的紀錄器,告訴你這個Process幹了什麼。

一個Program能產生多的Process,每點一次程式,就會產生一個行程,多開就是這麼回事。而每一個行程,都有一個獨立自主的小空間(記憶體區塊),除了自己以外,沒有人能把它幹掉,同樣的,當這個行程掛掉時,別的行程也不會受到影響。

執行緒既為紀錄器,也是CPU分時的最小單位。一個行程通常有很多執行緒,這其實近似多工的概念。想像一個情形,如果只有一個執行緒,行程內所有的事就得都由他一手包辦,他可能要讀入檔案,又可能又呈現畫面給使用者,但是CPU一次只能分配給一個執行緒使用,這意味著我們必須等這個執行緒讀完檔案,才會有時間來回應使用者,如果前者曠日廢時,我們通常會認為是當機了。多執行緒則把工作分攤開,我們可以有一個執行緒專職回報,告訴使用者這個行程做了什麼,而其他執行緒繼續埋頭苦幹。

但有一點要注意,多執行緒是近似分工,只是讓工作能同時啟動,真正在做事的還是處理器,如果只有一個執行緒,一個處理器,那你把它分成4個執行緒也不會比較快。事實上,在多執行緒中處理器只是快速的切換執行緒,以達到工作差不多快的效果。

排程入門

排程,其實就是切換行程的學問。Linux的排程是基於分時,也就是把CPU時間切成許多片段,每一個片段可供一個行程來使用,當程式的時間配額額滿時,就會進行行程切換的操作。而判斷執行順序是來自優先權,它可能是透過一個演算法得出的,每個行程都會有個優先權,排程器(Scheduler)會透過它得知什麼時候該執行什麼程式。

我們先考慮三種行程:

  • Interactive process :會不斷跟使用者互動,需要偵測按鍵立即回覆使用者
  • Batch process:不需要和使用者互動,常在背景執行
  • Real-time process:即時性的,像是影音軟體

Linux的排程器實做了一個啟發式演算法,可以依據過去行程的行為,來決定各個行程的優先順序 。

此外,Linux 採取搶佔式多任務處理,也就是說當一個行程處於可執行狀態時,核心會將他的優先權和當前執行行程的優先權進行比對,若前者較大,中斷目前的行程,讓排程器挑出應當執行的行程。此外先佔也會發生在當前行程的時間配額額滿的時候,此時,一個鑑別旗標TIF_NEED_RESCHED 會被設立,讓計時器中止及調用排程器。