汽車電子嵌入式開發系列50篇(五)-OS操作系統的進程與線程

      網友投稿 639 2022-05-29

      進程與線程

      對于操作系統來說,一個任務就是一個進程(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↓

      進程通信

      根據交換信息量的多少和效率的高低,進程通信分為如下低級通信和高級通信。

      汽車電子嵌入式開發系列50篇(五)-OS操作系統的進程與線程

      低級通信:只能傳遞狀態和整數值(控制信息)。(如 同步互斥工具: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小時內刪除侵權內容。

      上一篇:【Python成長之路】裝逼的一行代碼:快速共享文件
      下一篇:Java享元模式(FlyWeight)
      相關文章
      亚洲日本VA午夜在线影院| 亚洲Aⅴ在线无码播放毛片一线天| 亚洲福利秒拍一区二区| 亚洲乱码日产精品a级毛片久久 | 丁香五月亚洲综合深深爱| 亚洲中文字幕无码久久| 国产精品亚洲专区在线观看| 亚洲一级片在线播放| 精品亚洲成在人线AV无码| 亚洲人配人种jizz| 亚洲日韩在线视频| 亚洲三级视频在线| 亚洲一级毛片在线播放| 欧洲 亚洲 国产图片综合| 亚洲精品国产suv一区88| 亚洲av无码一区二区三区在线播放| 亚洲国产美女精品久久久| 亚洲成av人在线观看网站| 亚洲 综合 国产 欧洲 丝袜 | 亚洲色最新高清av网站| 亚洲精品理论电影在线观看| 自拍偷自拍亚洲精品偷一| 亚洲精品无码久久毛片 | 亚洲一级毛片免费观看| 亚洲色偷偷综合亚洲av78 | 内射无码专区久久亚洲| 国产精品亚洲不卡一区二区三区 | 亚洲色偷拍另类无码专区| 亚洲AV无码一区东京热久久| 亚洲日本一区二区| 亚洲人成毛片线播放| 亚洲成a人片在线不卡一二三区 | 亚洲国产高清在线| 亚洲2022国产成人精品无码区| 亚洲精品免费视频| 久久久久精品国产亚洲AV无码| 亚洲性无码AV中文字幕| 国产精品久久久久久亚洲小说| 久久久久亚洲av成人无码电影| 亚洲色无码专区在线观看| 精品亚洲成a人片在线观看|