Section 2 - 進程的描述與控制 - PART - 2

進程的描述與控制

  • 6.進程的通信-高級通信
    • 進程通信是指進程之間的信息交換,根據交換信息量的多少分為:
      • 低級進程通信:交換信息量較少,特點為
        • 效率低
        • 通信對用戶不透明
      • 高級進程通信:交換信息量較多,效率高,又分為
        • 共享存儲器系統:互相通信的進程通過共享某些數據結構或者存儲區讀寫來交換數據,前者是低級通信(基于共享數據結構的通信方式),只適用于少量數據的交換,后者是高級通信(基于共享存儲區的通信方式),通過在內存中劃分一塊共享存儲區,諸進程通過這個共享存儲區來進行讀寫數據實現進程通信
        • 消息傳遞系統:指進程之間以消息為單位,程序員通過通信原語,在進程間實現數據交換,按照實現方式的不同分為
          • 直接通信方式:發送進程利用OS提供的發送原語,直接將消息發送給接受進程
            • 要求:發送進程和接受進程都以顯示方式提供對方的標識符
            • OS提供的通信原語
              • Send(Receiver,message)
              • Receiver(Sender,message)
          • 間接通信方式:發送進程和接受進程通過共享一個中間實體(信箱)來實現進程通信。系統提供的若干條原語:
            • 信箱創建和撤銷原語
            • 兩條通信原語:①Send(Mailbox,message) 將消息發送給指定郵箱②Receive(mailbox,message)從指定郵箱接受消息
            • 信箱的分類:①私用郵箱(進程是自己創建)②公用郵箱(OS創建)③共享郵箱(某進程創建,但指定為共享的)
            • 發送進程和接受進程之間,存在四種相對關系:①一對一關系:發送進程和接受進程之間建立一條專用的通信鏈路②多對一關系:允許提供服務的進程與多個用戶進程進行交互,也稱為客戶/服務器交互(C/S interaction)③一對多關系:允許一個發送進程與多個接受進程進行交互,使發送進程可用廣播方式,發送消息④多對多關系:允許建立一個公用郵箱,讓多個進程都能向郵箱中投遞消息,也能取走自己的消息
          • 消息傳遞系統實現中的若干問題
            • 通信鏈路:為了在發送進程和接受進程間實現通信,需建立一條通信鏈路在兩個進程間,建立鏈路有兩種方式:
              • 顯示建立鏈路(發送進程需要在通信前用顯示"建立連接"原語命令請求OS為之建立一條通信鏈路,用完后就拆掉鏈路)
              • 隱式建立鏈路(發送進程只需要利用OS提供的發送原語,OS會自動為之創建一條鏈路)
              • 通信鏈路的鏈接方式:①點-點②多點
              • 通信方式:①單向通信鏈路:只允許發送進程向接受進程發送消息,或者相反②雙向通信鏈路:允許進程A和進程B同時互發消息
              • 通信鏈路的容量:①無容量②有容量
            • 消息格式
              • 消息頭
              • 消息正文
            • 進程的同步方式
              • 發送進程和接受進程均堵塞:緊密同步,無緩沖
              • 發送進程不堵塞,接受進程堵塞:應用廣
              • 發送和接受進程均不堵塞:較常見,即發送和接受進程都在忙自己事情,僅當發生某事件使他無法繼續進程,才會堵塞
          • 直接消息傳遞系統實例
            • 消息緩存隊列通信機制中的數據結構
              • 消息緩存區

                typedef struct message_buffer{
                    int sender; // 發送消息的進程名稱或標識符
                    int size;  // 發送消息的長度
                    char *text; // 發送消息的正文
                    struct message_buffer *next; // 指向下一個消息緩存區的指針
                }
                
              • 在進程PCB中設計通信的數據結構

                typedef struct processcontrol_block {
                    struct message_buffer *mq; //消息隊列隊里的首指針
                    semaphore mutex; // 消息隊列互斥信號量,初值為1
                    semaphore sm; // 消息隊列資源信號量
                }
                
            • 發送原語send
              • 申請一個消息緩存區,將發送區內容(發送消息正文,進程標識符等)復制到這個緩存區;找到接受區的PCB,執行互斥操作P(mutex),把緩存區掛到接受進程消息隊列的尾部,執行V(mutex),然后執行V(sm),即消息數加1
            • 接受原語receive
            • 執行P(sm),查看是否有信件,執行互斥操作P(mutex),從消息隊列中摘下第一個消息,執行V(mutex),把消息緩存區內容復制到接收區,釋放消息緩存區
Snip20170113_1.png
        - 管道通信系統
            - 發送進程(寫進程)通過一個管道(*管道:連接一個讀進程和一個寫進程之間實現通信的共享文件*)以字符流形式將大量的數據送入管道,接受進程(讀進程)從管道接受數據
  • 7.線程的基本概念
    • 引入線程的目的
      • 使多個程序能并發執行
      • 改善資源利用率,提高系統吞吐量
      • 減少程序并發執行時,所付出的時空開銷
      • 使OS具有更好的并發性
    • 線程的定義
      • 線程是進程中的一個實體,是被系統獨立調度和分派的基本單位。線程基本上自己不擁有系統資源,只擁有少部分在運行中必不可少的資源,但他可與同屬一個進程中的其他線程共享進程所擁有的全部資源
      • 一個線程可以創建和撤銷另一個線程
      • 同一個進程中的多個線程可以并發執行
      • 當一個線程改變了存儲器中的一個數據項時,當其他線程訪問這一項時,能夠看到修改后的結果
      • 若一個線程為讀操作打開一個文件時,同一個進程中其他線程也能從該文件中讀
    • 線程的屬性
      • 線程是輕型實體?;旧喜粨碛邢到y資源,只有一點必不可少的、能保證獨立運行的資源
      • 線程是獨立調度和分配的基本單位
      • 可并發執行。一個進程中的多個線程可并發執行;不同進程中的線程也能并發執行
      • 共享進程資源。同一個進程中的多個線程,都可以共享該進程所擁有的資源
Snip20170113_2.png
- 多線程
    - 指OS支持在一個進程中執行多個線程的能力
    - 傳統的進程中只有一個線程在執行
        - MS-DOS 是支持單用戶進程和單線程的OS
        - UNIX支持多用戶進程,但只支持每個進程一個線程(即多進程單線程)
    - 單進程多線程的例子:JAVA運行環境
    - 多進程多線程的例子:Windows 2000
- 多線程OS中*進程*的屬性
    -   作為系統資源分配的單位
    -   可包括多個線程。至少包括一個線程,這些線程可并發執行。OS中所有線程都只能屬于某一個特定的進程
    -   進程并不是一個可執行的實體了,線程是獨立運行的基本單位
- 線程間的同步
    -    互斥鎖
        -    比較簡單的、用于實現線程間對資源互斥訪問的機制
    -    條件變量
        -    為避免互斥鎖造成的死鎖問題,在創建互斥鎖時就聯系著一個條件變量
        -    單純的互斥鎖用于短期鎖定,用來保證互斥進入CS
        -    條件變量用于線程的長期等待,知道所等資源的可用  
    -    信號量機制
        -    私用信號量
        -    公用信號量
    -    多讀、單寫鎖
-   線程的實現方式
    -  內核支持線程KST(kernel Supported Threads)的實現:如Apple的MAC OS
    -  用戶級線程ULT(User Level Threads):一些數據庫管理系統
    -  組合方式:把ULT和KST兩種方式進行組合,提供了組合方式ULT/KST線程
Snip20170113_4.png
Snip20170113_5.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容