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

一. 進程和線程

進程

我們的操作系統裏面會有很多應用,比如手機裏面的各種應用,每一個應用都有一個或多個進程,而且每個應用運行時又會用到很多不同的資源。進程就幫助我們隔離了不同的資源,利用各種資源幫助應用管理着各種狀態,因此,我們經常說進程是資源分配的最小單位

多進程的目的是爲了滿足用戶的需要,同時對多個資源進行處理,簡單來說就是同時做多個事情。

線程

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

有了線程之後,進程間可以併發,而且一個進程內部的多個線程之間也是可以併發的。

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

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

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

運行狀態

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

→ 就緒態:當分派給當前進程的時間片用完以後,該進程就必須讓出 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 操作控制進程對資源的訪問
  • 管程機制:將共享的資源和對於這些共享資源的操作封裝起來,形成一個具有一定接口的功能模塊,進程可以調用管程來實現進程級別的併發控制,同時對管程的操作是互斥的

同步機制應遵循的規則

  • 空閒讓進:當沒有進程處於臨界區的時候,應該許可其他進程進入臨界區的申請
  • 忙則等待:當前如果有進程處於臨界區,如果有其他進程申請進入,則必須等待,保證對臨界區的互斥訪問
  • 有限等待:對要求訪問臨界資源的進程,需要在有限時間內進入臨界區,防止出現死等
  • 讓權等待:當進程無法進入臨界區的時候,需要釋放處理機,也就是轉換爲阻塞狀態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章