2/07/2017

Processes and Threads

相信這兩者差別,只要是做系統的人應該都會很了解。但對於我而言,卻相當模糊。記得有次在跟老外同學閒聊的時候,他問我這兩者的差別是在哪 ? 在當下我突然發現,要講給人懂是一件很困難的事,尤其是在對某個東西半理解狀態,更難解釋。所以這篇文章就來淺淺的探討有關這兩者間的區別。

在現今每個人幾乎都有智慧型手機,而且可以同時執行超多程式,像是你在玩遊戲的同時,能夠接收到朋友的訊息、郵件或其它通知訊息。就跟在用桌機或筆電一樣,可以同時開啟好幾個應用程式。簡單來說,Process 就是 Program,就是一個應用程式,像是在手機上的 App,電腦上的 MicroSoft Word;而  Thread 就是這個 Process 裡面的一個單位執行緒 ( Unit of execution) ,如果打開了 MicroSoft Word (Process),裡面的就有很多個Threads 在跑,像是 keyboard, print, save ...etc,就這是所謂的 Multiple-thread application。

Background
在談到Process和thread,或是說運行一個App,有三個非常重要的東西來負責管理:CPU, Memory (RAM), Memory controller。Memory controller 是一個介於CPU和RAM的界面,負責傳輸Data到CPU。當我們寫好一個程式,然後compile成binary code,這些binary code就會存放在RAM,接著透過 controller 把 data 傳到CPU。CPU內部有一個 queue line,也就是pipe line,依照FILO的原則放進這line當中來等待執行。

Multiple-thread application
那到底是如何實現multiple thread和multiple process ? 以Linux為例子,每一個process都會有PID, memory space, priority 和 schedule,依據priority和schedule來切換所有processes,這切換時間就叫 time slot,通常是在 1ms。

而一個process又有多個threads,這些threads 一般都是來靠 "鎖" (Lock) 來管理。如果這鎖沒管理好,很容易造成這個process當掉,更嚴重則是系統崩潰。像是我們常聽到 "死鎖" (Dead Lock) 就是因為 Thread 1 等待 Thread 2,而 Thread 2 又等待 Thread 1 釋放鎖而造成死循環。所以如何設計好這些threads 對於一個program or process 是非常重要的。

2/02/2017

What are advantages of knowing C language if you don't even know it ?

今天在Quora上面看到有人提問說 : 到底了解C語言有什麼好處 ?

這問題讓我印像滿深刻的。在我就讀期間,為了要找一份實習工作,我不得不從embedded system領域轉換成Web development。剛開始的確有點不太適應,總覺得很多寫法都不一樣。到後面才了解其實不是對Javascript不適應,正確來說是對Web和DOM概念不熟悉才是。

不管是Java或是Javascript,如果對C有一定程度熟悉的話,掌握它們的基本語法其實用不到二天的時間。就像上面有人舉了這個例子 :

試著用Javascript去run下這行code :


1
2
3
4
5
6
7
8
9
var myNumber = 4;
var myArray = [4];
makeChanges( myNumber, myArray );
console.log( myNumber + " and " +  myArray); 

function makeChanges( aNumber, anArray ) {
 aNumber++;
 anArray[0]++;
}

你會得到 "4 and 5" 的結果。如果了解C,一定馬上就知道為什麼一個任意數值並不會因為call function 被改變,而array會。

因為C有pointer,而pointer的作用其實跟array是一樣的。如果它們被當作某一個function的參數時,這時就等同於把這個值(被指向或是一個陣列)的地址一起傳送過去。所以這個function真正做的事 : 訪問這個變數的地址,改變這個地址的值。

可是任意數值並沒有。雖然一開始它們己經被賦予了某個值,存放在某個記憶體位址,可是當它們被當作做某個function的參數時,這function是沒辦法訪問這個變數的地址,它能改變的值只能作用於這個function的執行緒裡面,並不能影響其它執行緒的訪問。所以在跳出該function的時候,另一個執行緒訪問同樣的變數其實並不受任何影響。簡單來說,makeChanges所訪問aNumber的地址和外部訪問的myNumber的記憶體位址其實是完全不一樣的。

所以大家才會說,pointer其實是無所不在的,只是被藏起來罷了,因為它真的不好理解。但就如上面有人說 :

電腦硬體是很難以理解的。我們越不去看它,寫出一個程式去叫電腦做些事是越容易。 但我們越深入了解它,我們就更加理解真正要處理問題和原因是什麼。