Introduction to processes and threads(執行緒與程式的區別)

JUAN425發表於2014-08-10

Processes 和 threads 是任何一個multitasking operating system(多工作業系統, 例如UNIX, ox10, windows等等)中十分fundamental 的concept。

Process 翻譯過來就是程式。 Thread翻譯過來就是執行緒。 下面對這兩個概念之間的不同之處簡要分析。 

在作業系統中, 我們有很多的tools 可以去 manipulate and shut down processes to look at Threads and Thread priorities and try to see how your  system is functioning。





為了深入的理解程式和執行緒的區別, 我們首先需要了解CPU是如何工作的   的背景知識。

簡單點, 我們先來說說單核CPU(single-core CPU )是如何執行命令的。

首先, 對於下面的一個程式, 單核CPU的工作過程如下。

a simple program(only 4 steps):



CPU 當然不會執行上述用高階語言編寫的指令。 CPU執行的是二進位制指令。 我們將上述的指令用Compiler翻譯為機器語言(二進位制)。 為了便於檢視, 我們用16進製表示:



注意, 對於不同的CPU, 上述編譯得到的二進位制程式碼指令集(instruction set) 是不同的。 例如Pentium CPU的機器指令和 ARM的CPU的機器程式碼指令就有很大的不同。 所以編譯的時候一定選擇好針對的CPU(或者作業系統), 然後將高階語言編譯為對應的機器程式碼。


一個基本的CPU執行指令的系統如下(注意系統記憶體(又稱RAM)。 我的只有3GB, 但是硬碟卻很大達到幾百G。 一定要注意RAM和Hard disc 的區別。 我們的電腦的CPU是從RAM直接取得指令去執行的,RAM是從硬碟中取得指令的。  程式卻固化在硬碟中, 掉電當然不丟失。)。

注意BUS 是匯流排。 有三種, ABS(地址匯流排), DBS(資料匯流排), CBS(控制匯流排)。 CPU 與外部的所有的聯絡 都靠著三種匯流排。 包括從RAM中取指令, 讀寫等等。




為了執行我們的上述程式的指令(二進位制形式), 我們的二進位制指令需要存在RAM(又稱系統記憶體, 或者直接簡稱記憶體)中。

如下圖, 我們的program的binary code 從disk 中取出, 已經在RAM中等待CPU取出去執行, 如下:


CPU取指令的時候, 儘管匯流排取得我們program的binary code, 一行一行的取, 儲存在CPU的類似與queue中, 這個類似與queue的東西被稱為pipeline(管道)(pipeline具有很多的stages, 但是這裡不考慮, 最終 我們的程式是從Queue中(即pipeline)一行行執行的):



指令從RAM中取出, 提前放在Pipeline 中。 然後CPU有很多的components 去執行pipeline中的指令。 這些component包括Math processor(加減等等科學運算), Execution EngineD等等。

另外注意, CPU是在時鐘的控制下工作的。 時鐘越快, 執行指令的速度越快。 上面我們假設CPU的clock 為2GHZ。


這就是single core CPU執行程式(Program)的過程。


下面我們再來看看Multi-Threaded application。

事實上, 我們可以將上述的的那個簡單的program視為一個Thread。 可能這個Program(或者說Thread)組成了一個application(應用)。 例如, windows系統中, Word就是一個application(應用):


我們可以將一個Program(或者又稱為application)為unit of execution(執行單元), 又被稱為一個thread(執行緒)。


如上圖。 我們說我們有一個單執行緒的應用(single thread application)。


上述的單執行緒是早期的MS-DOS作業系統的命令列時代下使用的。 

很快的, 隨著Windows 的開發, MAc作業系統等等, 我們的作業系統 基本上是Multitasking operating system(多工作業系統)。 此時我們可以同時開啟多個applications, 舉個例子, 我們開啟了WORD應用, 又同時開啟了EXCEL應用等等。 這些應用都在等待CPU 去執行。 顯然, 我們只有一個CPU, 也就決定著我們在特定的時間內只能執行一個application的指令。  但是我們有兩個Threads(一個是WORD , 一個是EXCEL等等)。

雖然實際上CPU不可能同時的執行這兩個application(或者說Thread), 但是我們希望對於user來說, it appears to the user that they are being excuted at the same time。  我們知道CPU的晶振很大的。 所以CPU執行指令的速度很快。 基本上1ms 可以執行幾百萬條指令。 當然能夠對於使用者(人)看起來 CPU在同時為我們執行多個application。


這裡涉及到了time slice(時間切片)的概念。 這是由scheduler 控制何時有那個執行緒的指令進入CPU的pipeline, 從而被CPU執行。 也就是多長時間切換到下一個執行緒。  scheduler不是硬體。 而是一個software component。 當我們將time slice 設定為1ms 的時候, 那麼1ms 後, 會切換下一個thread, 依次類推下去。

這也是當前multitasking operating system的工作原理。



上述的多工作業系統的工作方式是preemptive (先發制人的, 有先買權的)的。 因為scheduler 總是首先將CPU的使用權交給一個application, 然後在拿回控制權, 交給下一個application等等。

上述多工作業系統的好處就是當一個application crash 的時候, 並不會導致作業系統的crash。 我們的CPU仍熱在執行沒有crash的程式。 例如當EXCEl crash的時候, 我們只需要close Excel 即可(關閉(hit the close button)從而避免time loses。 scheduler 不再非配給這個application的時間。 否則仍然會分配給它)。 並不影響其他的應用是否工作。





除了上述的概念, Thread也有優先順序。 優先順序(就是一個number)越高的Thread的會首先被執行。 例如下圖:



通常Scheduler具有優先順序的自動boost的機制。 例如上述假如Execel 的優先順序為10, 那麼EXecel 先被CPU執行。 假如EXEcel 在執行的過程中突然crash了, 而且我們沒有手動關閉這個application, 那麼我們的scheduler會慢慢的增大Word的優先順序。 直至Word的優先順序等於EXCEL的了(具有同等的執行優先順序了),於是Scheduler開始給WORD分配time slice, 直至執行結束。





今天, 許多的程式(Program)(或者被稱為應用, 或者被稱為process(程式)) 都是MultiThread(多執行緒)的了。

舉個例子,微軟的windows 系統中的 WOED 程式(應用)就是一個MultiThread application(多執行緒應用)了。 我們稱WORD 為一個process(程式)。

注意process is a name for program. 而且今天的大部分程式都是MultiThreaded(多執行緒)。

例如對於WORD, 具有如下的多個執行緒:

(1)keyboard input thread: 等待使用者通過鍵盤輸入文字

(2)print  thread: 將使用者的輸入內容顯示在螢幕上。  當print 功能被啟動的時候, 你並不希望等待print完成以後在輸入, 你想要將CPU的使用權交給keyboard以等待使用者輸入。

(3) save file thread:

等等。



現在我們在說說CPU的一些概念。

今天的CPU已經和20年前的CPU有很大的區別了。 因為我們有了Multitasking OS(多工的作業系統), 以及相應的MultiThreaded application(多執行緒的應用)。 

所以今天的CPU設計的時候需要更好的解決這些問題了。

對於single CPU 使用的技術是hyper Thread.ing。

我們已經知道CPU中有pipeline, pipeline類似與queue, 儲存著被等待   CPU內部的其他components   執行     的命令。

hyper Threading 就是duplicate part of the pipeline, 然後這樣就可以有多個執行緒的指令進入不同的pipeline 被執行了:




更好的解決Multithreading application 的辦法就是使用多核CPU(注意仍然是一個CPU(single CPU))。 只不過這一個CPU具有多個duplicated pipeline

 and execution engine的CPUcomponents:



最好的, the best solution 是使用多個CPU(Multiple CPUs) 處理MultiThreaded application(多執行緒的應用), 當然這也是最昂貴的。

同一個board 上有多個CPU, 又稱為SMP(symmetric multiple CPUs):




總結上述的內容, 給出如下解答:

Thread 可以執行在一個shared memory上, 不同的process 執行在獨立的記憶體空間中。 參見stack overfow 的解答(個人覺得有點問題, 應該是不同的Thread可以執行在不同記憶體空間, 也可以執行在shared memrory 上吧。 這也就有了Multithread 的概念。 一個程式(process, 亦可以稱為Program)可能是有多個程式吧(可見Thread應該process的subset吧))


























相關文章