程式和進程是作業系統中的重要概念,程式是可啟動並執行一組指令,程式以二進位代碼的形式儲存在存放裝置中。作業系統運行程式後,該程式在記憶體中的映像就是進程,進程是活動的程式。
1、程式
程式是指一組指示電腦或其他具有資訊處理能力裝置每一步動作的指令。Linux系統下的應用程式主要由兩種特殊類型的檔案代表,分別是可執行檔和指令碼程式。可執行檔是能夠被電腦直接執行的程式,相當於Windows系統中的exe檔案。使用C和C++語言設計的程式編譯後即是可執行檔。Linux系統不要求可執行檔使用特定的副檔名,檔案是否能被執行由檔案的系統屬性來決定。
系統可執行檔存放在:/binroot可執行檔存放在:/usr/bin使用者可執行檔存放在:/usr/local/bin(一般是使用者安裝的軟體)
其實linux下的可執行程式沒有向windows那樣,分的很開,不會有副檔名的限制,一個編譯好的檔案ffff,在終端使用./ffff,就可以執行了或者使用sudo ./ffff,大家不妨自己試一下
2、進程
進程是一個具有獨立功能的程式關於某個資料集合的一次可以並發執行的運行活動,是處於活動狀態的程式。進程作為構成系統的基本元件,不僅是系統內部獨立啟動並執行實體,而且是獨立競爭資源的實體。在Linux系統中,使用者建立進程時會先在系統的進程表中為進程建立獨一無二的編碼,即PID。PID是一個正整數,取值範圍在2到32768之間。進程建立時會順序挑選下一個未使用的編號數字作為自己的PID,如果他們已經經過一圈的迴圈,新的編碼重新從2開始。數字1一般是為特殊進程init保留的,它負責管理其他的進程。
用top命令可以看到當前的進程,pid,cpu佔用率等資訊。
三個用於進程式控制制的主要函數為:fork,exec和waitpid。
3、線程
線程是在共用記憶體空間中並發的多道執行路徑,他們共用一個進程的資源,如檔案描述符和訊號處理。作業系統在兩個進程間進行切換時,要對前一個進程進行保護現場操作,對後一個進程進行還原現場操作。反覆進行環境切換會帶來極大的系統開銷,CPU必須為此分配一定的刻度。線程則無需進行環境切換,因為多個線程共用同一個進程的上下文。多個線程也共用同一個進程的CPU刻度,進程的狀態並為因線程切換而改變。
4、線程與線程id
通常情況下,一個進程只有一個控制線程,同一時刻只執行一組機器指令,對於有些問題,如果不同部分各使用一個控制線程,那麼整個問題解決起來就容易的多,而且多個控制線程也能利用多處理器系統的並行性。在進程內的所有線程共用一個地址空間,檔案描述符,棧以及進程相關的屬性,因為他們能訪問同一個儲存空間區,所以各線程在訪問共用資料時候,採取同步措施以免不一致。
與進程相同,線程也有ID,但是線程ID只在他屬於的進程內部起作用,一個進程中的線程ID在另一個進程中沒有意義,當一個進程對多線程操作時,我們用線程ID引用相應線程。控制線程的函數與控制進程的函數類似,在進程模型建立很久之後,執行緒模式才被引入到系統中,兩個模式存在相互複雜的關係。