Section 2 - 進(jìn)程的描述與控制 - PART - 2

進(jìn)程的描述與控制

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

                typedef struct message_buffer{
                    int sender; // 發(fā)送消息的進(jìn)程名稱或標(biāo)識符
                    int size;  // 發(fā)送消息的長度
                    char *text; // 發(fā)送消息的正文
                    struct message_buffer *next; // 指向下一個(gè)消息緩存區(qū)的指針
                }
                
              • 在進(jìn)程PCB中設(shè)計(jì)通信的數(shù)據(jù)結(jié)構(gòu)

                typedef struct processcontrol_block {
                    struct message_buffer *mq; //消息隊(duì)列隊(duì)里的首指針
                    semaphore mutex; // 消息隊(duì)列互斥信號量,初值為1
                    semaphore sm; // 消息隊(duì)列資源信號量
                }
                
            • 發(fā)送原語send
              • 申請一個(gè)消息緩存區(qū),將發(fā)送區(qū)內(nèi)容(發(fā)送消息正文,進(jìn)程標(biāo)識符等)復(fù)制到這個(gè)緩存區(qū);找到接受區(qū)的PCB,執(zhí)行互斥操作P(mutex),把緩存區(qū)掛到接受進(jìn)程消息隊(duì)列的尾部,執(zhí)行V(mutex),然后執(zhí)行V(sm),即消息數(shù)加1
            • 接受原語receive
            • 執(zhí)行P(sm),查看是否有信件,執(zhí)行互斥操作P(mutex),從消息隊(duì)列中摘下第一個(gè)消息,執(zhí)行V(mutex),把消息緩存區(qū)內(nèi)容復(fù)制到接收區(qū),釋放消息緩存區(qū)
Snip20170113_1.png
        - 管道通信系統(tǒng)
            - 發(fā)送進(jìn)程(寫進(jìn)程)通過一個(gè)管道(*管道:連接一個(gè)讀進(jìn)程和一個(gè)寫進(jìn)程之間實(shí)現(xiàn)通信的共享文件*)以字符流形式將大量的數(shù)據(jù)送入管道,接受進(jìn)程(讀進(jìn)程)從管道接受數(shù)據(jù)
  • 7.線程的基本概念
    • 引入線程的目的
      • 使多個(gè)程序能并發(fā)執(zhí)行
      • 改善資源利用率,提高系統(tǒng)吞吐量
      • 減少程序并發(fā)執(zhí)行時(shí),所付出的時(shí)空開銷
      • 使OS具有更好的并發(fā)性
    • 線程的定義
      • 線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位。線程基本上自己不擁有系統(tǒng)資源,只擁有少部分在運(yùn)行中必不可少的資源,但他可與同屬一個(gè)進(jìn)程中的其他線程共享進(jìn)程所擁有的全部資源
      • 一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程
      • 同一個(gè)進(jìn)程中的多個(gè)線程可以并發(fā)執(zhí)行
      • 當(dāng)一個(gè)線程改變了存儲(chǔ)器中的一個(gè)數(shù)據(jù)項(xiàng)時(shí),當(dāng)其他線程訪問這一項(xiàng)時(shí),能夠看到修改后的結(jié)果
      • 若一個(gè)線程為讀操作打開一個(gè)文件時(shí),同一個(gè)進(jìn)程中其他線程也能從該文件中讀
    • 線程的屬性
      • 線程是輕型實(shí)體?;旧喜粨碛邢到y(tǒng)資源,只有一點(diǎn)必不可少的、能保證獨(dú)立運(yùn)行的資源
      • 線程是獨(dú)立調(diào)度和分配的基本單位
      • 可并發(fā)執(zhí)行。一個(gè)進(jìn)程中的多個(gè)線程可并發(fā)執(zhí)行;不同進(jìn)程中的線程也能并發(fā)執(zhí)行
      • 共享進(jìn)程資源。同一個(gè)進(jìn)程中的多個(gè)線程,都可以共享該進(jìn)程所擁有的資源
Snip20170113_2.png
- 多線程
    - 指OS支持在一個(gè)進(jìn)程中執(zhí)行多個(gè)線程的能力
    - 傳統(tǒng)的進(jìn)程中只有一個(gè)線程在執(zhí)行
        - MS-DOS 是支持單用戶進(jìn)程和單線程的OS
        - UNIX支持多用戶進(jìn)程,但只支持每個(gè)進(jìn)程一個(gè)線程(即多進(jìn)程單線程)
    - 單進(jìn)程多線程的例子:JAVA運(yùn)行環(huán)境
    - 多進(jìn)程多線程的例子:Windows 2000
- 多線程OS中*進(jìn)程*的屬性
    -   作為系統(tǒng)資源分配的單位
    -   可包括多個(gè)線程。至少包括一個(gè)線程,這些線程可并發(fā)執(zhí)行。OS中所有線程都只能屬于某一個(gè)特定的進(jìn)程
    -   進(jìn)程并不是一個(gè)可執(zhí)行的實(shí)體了,線程是獨(dú)立運(yùn)行的基本單位
- 線程間的同步
    -    互斥鎖
        -    比較簡單的、用于實(shí)現(xiàn)線程間對資源互斥訪問的機(jī)制
    -    條件變量
        -    為避免互斥鎖造成的死鎖問題,在創(chuàng)建互斥鎖時(shí)就聯(lián)系著一個(gè)條件變量
        -    單純的互斥鎖用于短期鎖定,用來保證互斥進(jìn)入CS
        -    條件變量用于線程的長期等待,知道所等資源的可用  
    -    信號量機(jī)制
        -    私用信號量
        -    公用信號量
    -    多讀、單寫鎖
-   線程的實(shí)現(xiàn)方式
    -  內(nèi)核支持線程KST(kernel Supported Threads)的實(shí)現(xiàn):如Apple的MAC OS
    -  用戶級線程ULT(User Level Threads):一些數(shù)據(jù)庫管理系統(tǒng)
    -  組合方式:把ULT和KST兩種方式進(jìn)行組合,提供了組合方式ULT/KST線程
Snip20170113_4.png
Snip20170113_5.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容