Linux進程精講
進程相關概念
程序和進程
程序,是指編譯好的二進制文件,在磁盤上,不占用系統資源(cpu、內存、打開的文件、設備、鎖....)
進程,是一個抽象的概念,與操作系統原理聯系緊密。進程是活躍的程序,占用系統資源。在內存中執行。(程序運行起來,產生一個進程)
程序 → 劇本(紙) 進程 → 戲(舞臺、演員、燈光、道具...)
同一個劇本可以在多個舞臺同時上演。同樣,同一個程序也可以加載為不同的進程(彼此之間互不影響)
如:同時開兩個終端。各自都有一個bash但彼此ID不同。
並發
並發,在操作系統中,一個時間段中有多個進程都處於已啟動運行到運行完畢之間的狀態。但,任一個時刻點上仍只有一個
例如,當下,我們使用計算機時可以邊聽音樂邊聊天邊上網。 若籠統的將他們均看做一個進程的話,為什麽可以同時運行呢,因為並發。
分時復用cpu
單道程序設計
所有進程一個一個排對執行。若A阻塞,B只能等待,即使CPU處於空閑狀態。而在人機交互時阻塞的出現時必然的。所有這種模型在系統資源利用上及其不合理,在計算機發展歷史上存在不久,大部分便被淘汰了。
多道程序設計
在計算機內存中同時存放幾道相互獨立的程序,它們在管理程序控制之下,相互穿插的運行。多道程序設計必須有硬件基礎作為保證。
時鐘中斷即為多道程序設計模型的理論基礎。 並發時,任意進程在執行期間都不希望放棄
在多道程序設計模型中,多個進程輪流使用CPU (分時復用CPU資源)。而當下常見CPU為納秒級,1秒可以執行大約10億條指令。由於人眼的反應速度是毫秒級,所以看似同時在運行。
1s = 1000ms, 1ms = 1000us, 1us = 1000ns 1000000000
實質上,並發是宏觀並行,微觀串行! -----推動了計算機蓬勃發展,將人類引入了多媒體時代。
CPU和MMU
中央處理器(CPU)
內存管理單元MMU
進程控制塊 PCB
我們知道,每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體。
/usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct 結構體定義。其內部成員有很多,我們重點掌握以下部分即可:
* 進程id。系統中每個進程有唯一的id,在C語言中用pid_t類型表示,其實就是一個非負整數。
* 進程的狀態,有就緒、運行、掛起、停止等狀態。
* 進程切換時需要保存和恢復的一些CPU寄存器。
* 描述虛擬地址空間的信息。
* 描述控制終端的信息。
* 當前工作目錄(Current Working Directory)。
* umask掩碼。
* 文件描述符表,包含很多指向file結構體的指針。
* 和信號相關的信息。
* 用戶id和組id。
* 會話(Session)和進程組。
* 進程可以使用的資源上限(Resource Limit)。
進程狀態
進程基本的狀態有5種。分別為初始態,就緒態,運行態,掛起態與終止態。其中初始態為進程準備階段,常與就緒態結合來看。
Linux進程精講