進(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ì)堵塞
- 通信鏈路:為了在發(fā)送進(jìn)程和接受進(jìn)程間實(shí)現(xiàn)通信,需建立一條通信鏈路在兩個(gè)進(jìn)程間,建立鏈路有兩種方式:
- 直接消息傳遞系統(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ū)
- 消息緩存隊(duì)列通信機(jī)制中的數(shù)據(jù)結(jié)構(gòu)
- 直接通信方式:發(fā)送進(jìn)程利用OS提供的發(fā)送原語,直接將消息發(fā)送給接受進(jìn)程
- 低級進(jìn)程通信:交換信息量較少,特點(diǎn)為
- 進(jìn)程通信是指進(jìn)程之間的信息交換,根據(jù)交換信息量的多少分為:

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