進程的描述與控制
- 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),把消息緩存區內容復制到接收區,釋放消息緩存區
- 消息緩存隊列通信機制中的數據結構
- 直接通信方式:發送進程利用OS提供的發送原語,直接將消息發送給接受進程
- 低級進程通信:交換信息量較少,特點為
- 進程通信是指進程之間的信息交換,根據交換信息量的多少分為:
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