Shell
- Shell是操做系統與用戶交互的界面。表現爲經過控制檯執行用戶命令。自己不執行命令,僅僅是組織和管理命令。
- 腳本:相似程序的方式執行一系列的邏輯順序的命令序列完成複雜的功能和人機交互。保存在文件中,是shell命令的集合。
系統調用
- 定義:操做系統內核爲應用程序提供的服務/函數
- 特色:
- 通常涉及核心操做和硬件資源
- 運行於核態
- 函數具備惟一ID
- 產生中斷,且爲自願中斷
進程管理
- 定義:是程序在某個數據集合上的一次運行活動。程序的一次運行即爲一個進程。
- 特性:
- 分類:
按使用資源權限
- 系統進程:系統內核相關進程
- 用戶進程:運行於用戶態的進程
按對CPU依賴性
- 偏CPU進程:計算型
- 偏I/O進程:
- 進程狀態
- 就緒態:得到了除CPU以外全部資源,一般有多個進程處於就緒態,有一個就緒隊列。
- 運行態:得到CPU,正在運行
- 等待態:
進程控制塊
進程由程序、數據、進程控制塊組成。
進程控制塊是描述和管理進程的一種數據結構,包括如下內容:shell
進程互斥和同步
- 同步:進程經過協做共同完成同一任務而形成的直接制約關係,如生產者-消費者模式
- 互斥:進程間競爭系統資源而形成的間接制約關係,同一時間內只有一個進程能夠訪問系統資源。
- 臨界資源和臨界區
- 臨界資源:同一時間只能有一個進程訪問的資源
- 臨界區:進程訪問臨界資源的程序片斷
- 實現同步互斥的方法:原子操做、鎖、信號量。
- 信號量同步機制
- 信號量是一種特殊的變量,只能被兩種操做修改,即P、V操做。
- P操做:s=s-1;if(s < 0) block();一個進程得到資源訪問權,s-1,當s小於0時說明資源不能再被更多進程訪問了,會將進程變爲等待狀態,加入等待隊列。P操做用於申請資源。
- V操做:s=s+1;if(s<=0) wakeup();一個進程釋放了該資源的訪問,此時會喚醒一個正在等待的進程。若是s大於0則表示沒有進程等待該資源。V操做用於釋放資源。
- P、V操做實現互斥
- 將信號量s值設爲1,表示同一時間只有一個進程能使用資源。
- P、V操做實現同步
- 使用兩個信號量表示緩衝區的讀寫,實現生產者-消費者模式。
- 死鎖
- 通俗來說死鎖就是進程1先佔用了A資源,申請B資源,而進程2先佔有了B資源,申請A資源,這樣就會形成兩個進程都在等待對方已佔用的資源而一直循環下去的狀況。
- 死鎖產生條件:
(1)資源互斥,同一時間只有一個進程能訪問
(2)資源不可剝奪,除非進程主動放棄
(3)資源的保持和請求,進程在佔有某一資源後還能申請其餘資源
(4)對資源的循環等待。
(1)預防:即對資源進行適當的限制
(2)檢測:在運行過程當中隨時檢測死鎖條件,並設法避開
(3)恢復:發生死鎖後以最小代價退出死鎖狀態。
一般預防會使得程序運行效率下降,沒法充分利用資源。檢測則會耗費大量的系統開銷,效率低。通常系統都採用恢復措施。Linux系統也可能會發生死鎖現象,可是機率極低,所以系統採用「鴕鳥策略」,並不去檢測和解除死鎖,而是忽略。緩存
進程通訊
進程有本身獨立的地址空間,所以進程間須要交換數據時須要經過某種手段,這就是進程通訊。安全
- 通訊方式:信號量、信號、管道、共享內存、消息
- 高級通訊:消息、管道、共享內存。能夠傳遞大量數據
- 低級通訊:信號量、信號。只能傳遞少許數據。
- 同步通訊:管道、共享內存。通訊雙方須要共同參與到整個通訊過程當中,步調協調地完成數據交換。如同打電話同樣,雙方必須同時在線,即時交談。
- 異步通訊:信號量、信號、消息。雙方進程不用考慮對方進程,發完或者接受完數據就好。如同發郵件,沒必要關心對方是什麼時候接收。
- 信號量:
- 信號: 進程間能夠發送控制信息,通常只有幾個字節數據,通知進程某個事件發生。
- 管道:兩個進程之間數據傳輸通道,一個發,一個接,同步的傳遞字節流。管道是經過文件系統實現的。Linux將管道看作是一種特殊的文件系統,而實際上它是一個虛擬文件的形式實現內存高速緩存區。管道文件創建後由兩個進程共享,一個寫,一個讀。
- 消息隊列:消息是結構化的數據。
- 共享內存:在內存中開闢一個進程共享的存儲段,將這個區間映射到不一樣進程的地址空間中。一旦涉及到共享就要考慮同步問題,保證共享數據的安全性,所以實現較爲複雜。
線程
- 爲何須要線程?
進程能夠併發執行,可是進程內最是串行執行的,沒能充分利用CPU資源。此外,進程的建立和切換對於資源的開銷都比較大,影響了系統的總體效率。爲了提升系統運行的效率,提出了線程這個概念。
- 進程和線程比較
- 資源分配方面:進程是資源分配的最小單位,每個進程都有本身獨立的地址空間,以及相關的資源。而線程則共享進程內的地址空間和資源。所以進程的創建開銷較大。
- CPU調度方面:線程是CPU調度的最小單位。進程在切換時,須要保存現場,即整個進程的運行環境,須要的開銷較大。而線程的切換則只須要保存少許寄存器,開銷小,於是切換速度快。
- 通訊方面:因爲進程有本身獨立的地址空間,其餘進程沒法訪問,所以通訊須要系統提供的進程通訊機制完成。而線程共享進程內的資源,通訊較爲簡單。
- Linux線程
- Linux線程實現較爲獨特,它沒有專門的線程概念,其實是把線程當作進程來處理的,只不過該進程要和其餘進程共享地址空間等資源。所以Linux線程也稱爲「輕量級進程」(LWP)。
- 建立線程有clone()函數完成,於fork函數不一樣的是,它須要指定共享的資源。