清华大学《操作系统》(十八):管程于信号量
信號(hào)量與管程也是進(jìn)程間通信的方式。信號(hào)量是與鎖在同一層級(jí)實(shí)現(xiàn)的,是操作系統(tǒng)提供的一種協(xié)調(diào)共享資源訪問(wèn)的方法。信號(hào)量由操作系統(tǒng)管理,操作系統(tǒng)作為管理者地位是高于進(jìn)程的。
一、信號(hào)量
1、信號(hào)量(semaphore):是操作系統(tǒng)提供的一種協(xié)調(diào)共享資源訪問(wèn)的方法
①信號(hào)是一種抽象數(shù)據(jù)結(jié)構(gòu)
- 一個(gè)整型int(sem),可進(jìn)行兩個(gè)原子操作
- P(): sem–,如果sem<0,等待,否則繼續(xù),類(lèi)似lock_acquire?
- V(): sem++,如果sem<=0,說(shuō)明當(dāng)前有等著的,喚醒掛在信號(hào)量上的進(jìn)程,可以是一個(gè),可以是多個(gè)
②信號(hào)量的特性
- 信號(hào)量是被保護(hù)的整數(shù)變量。初始化完成后,只能通過(guò)P()V()操作修改;由操作系統(tǒng)保證,PV操作時(shí)原子操作。
- P()可能阻塞,V()不會(huì)阻塞
- 通常假定信號(hào)量是公平的,線程不會(huì)無(wú)線阻塞在P操作,可以假定信號(hào)量等待時(shí)按照先進(jìn)先出排隊(duì)的。而自旋鎖是無(wú)法實(shí)現(xiàn)先進(jìn)先出的,因?yàn)樗枰加肅PU資源不停查詢鎖是否空閑,無(wú)法指定進(jìn)入臨界區(qū)的順序。
2、信號(hào)量的實(shí)現(xiàn)
二、信號(hào)量使用
1、信號(hào)量分兩種類(lèi)型:?
- 二進(jìn)制信號(hào)量:約等于鎖,取值0 or 1?
- 資源信號(hào)量:資源數(shù)目任何非負(fù)值?
- 兩者其實(shí)是等價(jià)的,可以基于一個(gè)構(gòu)造出另一個(gè)
信號(hào)量的使用有兩種情況:
- 互斥訪問(wèn)比如臨界區(qū)的互斥訪問(wèn)控制、
- 條件同步比如線程間的條件等待?;コ庠L問(wèn)如下圖
3、生產(chǎn)者—消費(fèi)者問(wèn)題
生產(chǎn)者——>緩沖區(qū)——>消費(fèi)者
①問(wèn)題描述
- 一個(gè)或多個(gè)生產(chǎn)者在生成數(shù)據(jù)后放在一個(gè)緩沖區(qū)里;
- 單個(gè)消費(fèi)者從緩沖區(qū)取出數(shù)據(jù)處理;
- 任何時(shí)刻只能有一個(gè)生產(chǎn)者或消費(fèi)者可訪問(wèn)緩沖區(qū)
②問(wèn)題分析:
- 任何時(shí)刻只能有一個(gè)線程操作緩沖區(qū)(互斥訪問(wèn));
- 緩沖區(qū)空時(shí),消費(fèi)者必須等待生產(chǎn)者(條件同步);
- 緩沖區(qū)滿時(shí),生產(chǎn)者必須等待消費(fèi)者(條件同步)
③信號(hào)量描述各個(gè)約束
- 二進(jìn)制信號(hào)量mutex
- 資源信號(hào)量fullBuffers
- 資源信號(hào)量emptyBuffers
如下圖是利用信號(hào)量實(shí)現(xiàn)的生產(chǎn)者消費(fèi)者模型。生產(chǎn)者消費(fèi)者模型的要求是同一時(shí)刻只能有一個(gè)生產(chǎn)者或消費(fèi)者訪問(wèn)緩沖區(qū),生產(chǎn)者只能在緩沖區(qū)有空間時(shí)才能往里塞數(shù)據(jù),消費(fèi)者只有緩沖區(qū)有數(shù)據(jù)時(shí)才能從里面消費(fèi)數(shù)據(jù)。
三、管程
管程是一種用于多線程互斥訪問(wèn)共享資源的程序結(jié)構(gòu),采用面向?qū)ο蟮姆椒?#xff0c;簡(jiǎn)化線程間的同步控制,保證任意時(shí)刻最多只有一個(gè)線程執(zhí)行管程代碼,管程與臨界區(qū)的區(qū)別是在管程中的線程可臨時(shí)放棄管程的互斥訪問(wèn),等待事件出現(xiàn)時(shí)恢復(fù),而臨界區(qū)只有線程退出臨界區(qū)才能放棄互斥訪問(wèn)。
管程與臨界區(qū)結(jié)構(gòu)上差別在于多了共享數(shù)據(jù),共享數(shù)據(jù)作為條件變量,如果條件變量的數(shù)量為0則跟臨界區(qū)完全一樣。進(jìn)入管程的線程因資源被占用而進(jìn)入等待狀態(tài),每個(gè)條件變量表示一種等待原因,對(duì)應(yīng)著一個(gè)等待隊(duì)列。管程最重要的兩個(gè)操作:wait()和Signal(),wait將自身阻塞在等待隊(duì)列中,喚醒一個(gè)等待者或釋放管程的互斥訪問(wèn),Signal操作將等待隊(duì)列中的一個(gè)線程喚醒,如果等待隊(duì)列為空,則等同空操作。
條件變量(condition variab)
調(diào)用管程解決消費(fèi)者生產(chǎn)者問(wèn)題?
count記錄了當(dāng)前BUFFER的數(shù)據(jù)個(gè)數(shù)?
先在前后加鎖,因?yàn)橐WC只有一個(gè)線程在臨界區(qū) lock在等待/睡眠的時(shí)候通過(guò);lock->Acquire()管程進(jìn)入和lock->Release()管程釋放;notfull.wait(&lock)釋放鎖。喚醒后獲得鎖。
2、管程條件變量的釋放處理方式
管程條件變量釋放處理方式有兩種如下圖??梢钥吹紿oare的管程方式是更符合實(shí)際使用效果的,但是Hansen管程實(shí)現(xiàn)方式少了一次進(jìn)程上下文切換,因此真實(shí)OS中一般使用Hansen管程方式。
總結(jié)
以上是生活随笔為你收集整理的清华大学《操作系统》(十八):管程于信号量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: padding和卷积的区别_Tensor
- 下一篇: RHadoop实践系列文章