汽車電子嵌入式開發系列50篇(五)-OS操作系統的進程與線程
進程與線程
對于操作系統來說,一個任務就是一個進程(Process),比如打開一個瀏覽器就是啟動一個瀏覽器進程,打開一個記事本就啟動了一個記事本進程,打開兩個記事本就啟動了兩個記事本進程,打開一個 Word 就啟動了一個 Word 進程。
有些進程還不止同時干一件事,比如Word,它可以同時進行打字、拼寫檢查、打印等事情。在一個進程內部,要同時干多件事,就需要同時運行多個“子任務”,我們把進程內的這些“子任務”稱為線程(Thread)。
類比:
進程 = 工廠
線程 = 工廠里各個流水線
注意:一個進程可能對應多個端口號,一個端口對應一個進程。
進程
進程可以認為是程序執行時的一個實例。進程是系統進行資源分配的獨立實體,且每個進程擁有獨立的地址空間。(即 資源的分配和調度的一個獨立單元)
進程控制塊(Process Control Block, PCB):保存運行期間進程的數據,PCB 是進程存在的唯一標志。
進程 = 程序 + 數據 + PCB
一個進程無法直接訪問另一個進程的變量和數據結構,如果希望讓一個進程訪問另一個進程的資源,需要使用進程間通信,比如:管道、文件、套接字等。
進程的五種基本狀態及其轉換:
創建狀態:進程正在被創建,尚未轉到就緒狀態,創建進程需要申請一個空白的 PCB,并向 PCB 寫一些控制和管理進程的信息,然后由系統分配資源,將進程轉入就緒狀態。
就緒狀態:進程已處于準備執行的狀態,獲得了除處理機以外的一切所需資源。
執行狀態:進程在處理機上運行。在單處理機環境下,每一時刻最多只有一個進程運行。
阻塞狀態:進程正在等待某一事件(服務請求)而暫停運行,如 等待某資源變為可用(不包括處理機)或等待輸入輸出 I/O 完成,即使處理機空閑,該進程也不能運行。
結束狀態:進程正從系統中消失,這可能是進程正常結束或其他原因中斷退出運行,當進程需要結束運行時,系統首先必須置該進程為結束狀態,然后再進一步處理資源釋放和回收。
注意:后備隊列在外存中,而就緒隊列在內存中。
進程同步與互斥
PV 操作是一種實現進程互斥與同步的有效方法。PV操作與信號量的處理相關,P 表示通過(荷蘭語 passeren)的意思,V 表示釋放(荷蘭語 vrijgeven)的意思。
具體來源可以查看PV操作的來源
互斥與同步:
互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即 訪問是無序的。
同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。
在操作系統中,信號量S是一整數。
當 S≥0 時,S 表示可供并發進程使用的資源實體數;
當 S<0 時,S 表示正在等待使用資源實體的進程數。
建立一個信號量必須說明此信號量所代表的意義并且賦初值。
除賦初值外,信號量僅能通過PV操作來訪問。
信號量 S(semaphore) 代表“資源數”
P 操作的主要動作是:通過(荷蘭語 passeren)(即 讓進程使用資源)
S 減 1;
類比:“占用了一個資源”
若相減結果仍大于或等于 0,則進程繼續執行;
類比:“若占用一個資源后,還有多余的資源或者剛好用完資源,那么就代表該進程有資源可以利用,進程也就可以繼續執行”
若相減結果小于 0,則該進程被阻塞(掛起),之后放入等待該信號量的等待隊列中,然后轉入進程調度。
類比:“若占用一個資源后,還欠別人資源,那么就代表該進程根本就沒有資源可以用了,所以先欠著,掛個號,等待”
V 操作的主要動作是:釋放(荷蘭語 vrijgeven)(即 讓進程釋放資源)
S 加 1;
類比:“資源占用完了,物歸原主,釋放資源”
若相加結果大于 0,則進程繼續執行;
類比:“若釋放資源后,資源數大于 0,就代表庫存里的資源充裕,奉還資源后,還有資源可以給你利用,那就繼續占用資源,繼續執行”
若相加結果小于或等于 0,則從該信號的等待隊列中釋放一個等待進程(喚醒,等待→就緒),然后再返回原進程繼續執行 或轉入進程調度。
類比:“若一個進程結束,釋放資源后,資源數還是欠別人的或者為 0,就代表庫存里的資源很緊張,資源剛一釋放就被其他進程一搶而空,所以自己就不能用了,得先來后到,把資源給下一個進程用,讓下一個進程就緒。
如果執行不需要此資源,那么等自己執行完后(有的執行并不一定需要此資源)把處理機讓給下一個進程用;
如果執行需要此資源,那么轉入進程調度,重新排隊,等等再執行,把處理機讓給下一個進程用,讓下一個進程執行。”
注意:PV 操作對于每一個進程來說,都只能進行一次,而且必須成對使用。
代碼化如下:
P 操作:
↓CloseCode↓
V 操作:
↓CloseCode↓
進程通信
根據交換信息量的多少和效率的高低,進程通信分為如下低級通信和高級通信。
低級通信:只能傳遞狀態和整數值(控制信息)。(如 同步互斥工具:PV 操作)
由于進程的互斥和同步,需要在進程間交換一定的信息,故不少學者將它們也歸為進程通信。
特點:傳送信息量小,效率低,每次通信傳遞的信息量固定,若傳遞較多信息則需要進行多次通信。
編程復雜:用戶直接實現通信的細節,容易出錯。
高級通信:提高信號通信的效率,傳遞大量數據,減輕程序編制的復雜度。
提供三種方式:
共享內存模式
消息傳遞模式
共享文件模式
在通信進程之間存在一塊可直接訪問的共享空間,通過對這片共享空間進行寫/讀操作,實現進程之間的信息交換。
在對共享空間進行寫/讀操作時,需要同步互斥工具(如 P操作、V操作),對共享空間的寫/讀進行控制。
類比:
進程 = 物品
共享空間 = 錢
用錢進行交換,而不用物物交換
在消息傳遞模式中,進程間的數據交換是以格式化的消息(Message)為單位的。
進程通過系統提供的發送消息和接收消息兩個原語進行數據交換。
若通信進程之間不存在可直接訪問的共享空間,則必須利用操作系統提供的信息傳遞方法實現進程通信。
可分為直接和間接兩種通信方式:
直接:將消息發送給接收進程,并將它掛在接收進程的信息緩沖隊列中,接收進程從消息緩沖隊列中取得消息。
間接:將消息發送給某個中間實體(信箱),接受進程從中間實體中取得消息,又稱為信箱通信方式。
類比:
甲給乙寫信
直接:甲直接把信交給乙
間接:甲通過郵差把信交給乙
共享文件:用于連接一個發送進程和一個接收進程,以實現它們之間通信的文件,就是共享文件,又名 pipe(管道)文件。
向管道提供輸入的發送進程,以字節流形式將大量的數據送入管道;
而接收管道輸出的接收進程,則從管道中接收數據。
為了協調雙方的通信,管道機制必須提供互斥、同步和確定對方存在三方面的協調能力。
共享內存和消息隊列,FIFO,管道傳遞消息的區別:
消息隊列,FIFO,管道的消息傳遞方式一般為:
服務器得到輸入
通過管道,消息隊列寫入數據,通常需要從進程拷貝到內核。
客戶從內核拷貝到進程
然后再從進程中拷貝到輸出文件
上述過程通常要經過4次拷貝,才能完成文件的傳遞。
共享內存只需要:
從輸入文件到共享內存區
從共享內存區輸出到文件
上述過程不涉及到內核的拷貝,所以花的時間較少,共享內存最快。
參考:https://blog.csdn.net/m0_37806112/article/details/81671429
線程
對線程最基本的理解就是“輕量級進程”,它是一個基本的 CPU 執行單元,也是程序執行流的最小單元,由線程 ID、程序計數器、寄存器集合和堆棧組成。(即 CPU 調度的基本單元)
線程控制塊(Thread Control Block, TCB):保存運行期間線程的數據,TCB 是線程存在的唯一標志。
線程屬于進程,是進程的一個實體,是被系統獨立和分配的基本單位。
線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可以與同屬一個進程的其他線程共享進程所擁有的全部資源。
一個進程可以創建和撤銷另一個線程,同一個進程中的多個線程之間可以并發執行。
區別
進程是資源分配和調度的一個獨立單元;
而線程是 CPU 調度的基本單元。
同一個進程中可以包括多個線程,并且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進程至少包括一個線程。
進程的創建調用 fork 或者 vfork,而線程的創建調用 pthread_create;
進程結束后它擁有的所有線程都將銷毀,而線程的結束不會影響同個進程中的其他線程的結束。
線程是輕量級的進程,它的創建和銷毀所需要的時間比進程小很多,所有操作系統中的執行功能都是創建線程去完成的。
線程中執行時一半都要進行同步和互斥,因為它們共享同一進程的所有資源。
線程有自己的私有屬性 TCB、線程 id、寄存器、硬件上下文;
而進程也有自己的私有屬性進程控制塊 PCB,
這些私有屬性是不被共享的,用來表示一個進程或一個線程的標志。
交通智能體 任務調度 嵌入式
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。