你真的瞭解什麼是進程嗎?

一. 進程和線程

進程

咱們的操做系統裏面會有不少應用,好比手機裏面的各類應用,每個應用都有一個或多個進程,並且每一個應用運行時又會用到不少不一樣的資源。進程就幫助咱們隔離了不一樣的資源,利用各類資源幫助應用管理着各類狀態,所以,咱們常常說進程是資源分配的最小單位多線程

多進程的目的是爲了知足用戶的須要,同時對多個資源進行處理,簡單來講就是同時作多個事情。併發

線程

進程擁有了資源以後,就須要去利用它們,因此就須要線程的幫忙了,每一個進程都至少須要一個線程做爲執行單位,同時也能夠開啓新的線程執行。另外,一個 CPU 核心一個時刻只能運行一個線程,多個線程之間須要不斷進行調度,所以咱們常常說線程是CPU調度的最小單位工具

有了線程以後,進程間能夠併發,並且一個進程內部的多個線程之間也是能夠併發的。操作系統

而多線程的目的就是爲了充分利用併發帶來的效率上的提升。線程

二. 進程的狀態和轉換是怎樣的?

對於一個 CPU 核心,一個時刻只能運行一個線程(所以也只能運行一個進程),爲了實現併發運行,引入了分時的概念,即將時間分爲多個時間片,不一樣的時間片執行不一樣的線程,以實現一個時間段內運行多個線程cdn

圖片來源:https://www.jianshu.com/p/d254b138de03

運行狀態

進程正在 CPU 上運行,對於 CPU 的單個核心來講,一個時刻最多隻能有一個進程處於運行狀態blog

→ 就緒態:當分派給當前進程的時間片用完之後,該進程就必須讓出 CPU,變回就緒態等待下一次進程調度分派時間片;或者,若是是可剝奪的操做系統,有更高優先級的進程進入就緒態時,也須要讓出 CPU接口

→ 阻塞態:當進程請求某一資源(如外設)的使用和分配或等待某一事件的發生(如I/O操做的完成)時,它就從運行狀態轉換爲阻塞狀態。隊列

就緒狀態

準備運行,已經得到了出 CPU 之外的全部須要的資源,等待 CPU 分派時間片進程

→ 運行態:當前進程被分派了 CPU 時間片後,也就得到 CPU 資源(分派處理機時間片),可使用 CPU 了,於是進入運行態

阻塞狀態(等待狀態)

由於要等待某個資源或者某個事件的發生而被阻塞所以暫停運行。

就緒狀態是指進程缺乏 CPU 資源;而等待狀態是指須要除了 CPU 之外的其餘資源或者某個事件

→ 就緒態:當進程等待的事件到來時,如I/O操做結束或中斷結束,或者得到了等待的資源,中斷處理程序就會把該進程的狀態轉換爲就緒狀態

三. 進程通訊的幾種方式

1. PV 操做

一種低級的通訊方式。在操做系統這種多線程,多進程環境中,咱們要密切關注資源的同步互斥問題

  • 同步:指對共享資源的一系列操做要有順序性,一致性,要對資源進行有序訪問,以保證數據的正確性,先完成這一個操做,才能繼續執行下一個操做
  • 互斥:指一次只能有一個線程對共享資源進行操做

爲了解決共享資源的同步互斥問題,咱們將具體的資源的數量抽象爲信號量 Semaphore,經過 P 操做和 V 操做分別對信號量進行減和增。

  • P 操做經過減小信號量來佔用多餘的資源,當資源資源不足時,則會阻塞線程。
  • V 操做增長信號量釋放已經使用完的資源,並恢復正在等待資源的阻塞狀態的線程。

若是咱們將信號量看做爲資源設置的資源鎖,那麼 P 操做至關於加鎖操做,而 V 操做至關於解鎖操做 。


隨着操做系統的發展,用於進程之間實現通訊的機制也在發展,並已由早期的低級進程通訊機制發展爲能傳送大量數據的高級通訊工具機制。

2. 共享存儲

在通訊的進程之間存在一塊可直接訪問的共享空間,經過對這片共享空間進行寫/讀操做實現進程之間的信息交換。

固然,在對共享空間進行寫讀操做時,也須要使用同步互斥工具(如 P操做、V操做),對共享空間的寫讀進行控制。

3. 消息傳遞

通訊的進程之間不存在可直接訪問的共享空間,則必須利用操做系統提供的消息傳遞方法實現進程通訊。

  • 直接通訊方式:指發送進程利用操做系統所提供的發送命令,直接把消息發送給目標進程,接收進程直接利用接收命令取得信息。同時,還有一種消息緩衝隊列通訊機制也是直接通訊方式。
  • 間接通訊方式:發送進程把消息發送到某個中間實體(信箱)中暫存,接收進程從中間實體中取得消息。這種通訊方式又稱爲信箱通訊方式。

4. 管道通訊

利用一個「管道」實現進程間的通訊。這個管道是一個鏈接讀進程和寫進程的共享文件。

寫進程以字符流的方式將數據輸入到這個共享文件中,供讀進程讀取。固然這一系列操做也須要管道提供同步和互斥的能力。

四. 進程的同步機制

如何實現同步

  • 互斥機制:對資源的訪問,一個時間段只能有一個進程對其進行訪問
  • 信號量機制:將資源的數量定義爲信號量,經過 pv 操做控制進程對資源的訪問
  • 管程機制:將共享的資源和對於這些共享資源的操做封裝起來,造成一個具備必定接口的功能模塊,進程能夠調用管程來實現進程級別的併發控制,同時對管程的操做是互斥的

同步機制應遵循的規則

  • 空閒讓進:當沒有進程處於臨界區的時候,應該許可其餘進程進入臨界區的申請
  • 忙則等待:當前若是有進程處於臨界區,若是有其餘進程申請進入,則必須等待,保證對臨界區的互斥訪問
  • 有限等待:對要求訪問臨界資源的進程,須要在有限時間內進入臨界區,防止出現死等
  • 讓權等待:當進程沒法進入臨界區的時候,須要釋放處理機,也就是轉換爲阻塞狀態