行程管理何謂行程?就是執行中的程式。 在介紹行程管理之前,我們先提一下 CPU 的執行模式,基本上,許多 CPU 除了執行指令外,還會訂定數種優先等級,當 CPU 在不同的優先等級下執行相同的指令會得到不同的結果。 Intel x86 的保護模式定了四種等級,但是 Linux 只用到其中兩種,核心模式 (kernel mode) 及使用者模式 (user mode)。核心模式有較大的權限,可以任意存取週邊設備,通常作業系統核心都是以核心模式在執行,而使用者模式權限小,限制多,應用程式均以使用者模式執行。 當應用程式正常執行時,有下列幾個狀況會切換到核心模式(事實上就是 CPU 從正在執行的程式切換到作業系統核心碼),一是程式主動呼叫系統服務函式,例如程式想讀取硬碟裡的檔案,或是程式向系統要求多一點記憶體。二是用硬體要求 CPU 反應,例如你在鍵盤敲入一個字母,負責鍵盤的晶片要求處理這一筆資料,另一例是電腦內的時鐘每一固定時間會通知 CPU,告訴 CPU 說時間又過了一個 tick(在x86上,約0.01秒),CPU 就會切換到核心模式,執行與此事件相對應的核心碼,這時有許多要做,其中一項是計算目前這個程式己經執多久了,是否該換手執行讓下一個程式了,如果時間未到,核心事情處理完後會讓原先的程式繼續進行。幾乎每一種可能發生的事件,核心都早已備好對應的程式碼。三是程式作了不該作的事,例如讀取不屬於它的記憶體,或直接存取週邊設備,這時 CPU 也會轉到核心模式,讓作業系統核心決定如何處置這個有問題的程式,最普遍的處置就是停止這個程式的執行,把錯誤回報到終端機。 瞭解核心模式和使用者模式後,我們可以介紹行程管理了,之前我們並沒有對行程和程式作區分,在這一節必須作區分。例如執行一個從一數到十的程式,每秒數一下,須十秒的時間程式才能執行完畢,我在十一點時執行這個程式,在十一點過五秒又再執行一次這個程式(幸好 Linux 是多工作系統),當我執行這個程式時,作業系統會把對應的檔案讀進記憶體,作一些設定,然後讓 CPU 去執行它,第二次執行時作業系統會做同樣的事,但是當然會放在不同位址的記憶區塊(作業系統不會管這兩個程式是否同一個)。所以到了十一點過八秒時,和這個例子相關的有三個東西,第一是仍然躺在硬碟裡的程式碼,第二是數到八,在記憶中未執行完畢的那段與程式對應記憶區塊,第三是數到三的另一記憶區塊。為了作區分,躺在硬碟裡仍然稱為程式,在記憶體中執行的每一個體稱為行程,這裡有兩個行程,每個行程都是獨立的個體,有不同的變數值,可能也會有不同的狀態,例如第一個行程要到記憶體,第二個行程要不到等等。 作業系統核心中的行程管理主要目的就是管理這些正在執行或等待執行的行程們(躺在硬碟裡的程式歸檔案系統管),行程管理的核心是排程器,目的是為行程們安排 CPU 的時間。在 Linux 中行程也分等級,共三個等級 SCHED_FIFO, SCHED_RR 和 SCHED_OTHER。前兩種等級有優先權,設計給即時應用軟體使用的,當沒有前兩個等級的行程時,第三等級的行程才有機會執行,這個等級的行程是以類似輪流的方式執行,事實上它們也是互相比等級,等級最高的會選為下一個執行的對象,但是高等級執行完後等級會重算,通常等級會降下來,所以會輪到當初次高等級的行程執行。等級的算法有一個簡單的公式,在函式 goodness() 中,它位於 /usr/src/Linux/kernel/sched.c 中,改這個公式是 hacker 喜歡的把戲,可以試試看系統如何變化。 |