日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

清华大学《操作系统》(十八):管程于信号量

發(fā)布時間:2023/12/20 windows 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 清华大学《操作系统》(十八):管程于信号量 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

信號量與管程也是進程間通信的方式。信號量是與鎖在同一層級實現(xiàn)的,是操作系統(tǒng)提供的一種協(xié)調(diào)共享資源訪問的方法。信號量由操作系統(tǒng)管理,操作系統(tǒng)作為管理者地位是高于進程的。

一、信號量

1、信號量(semaphore):是操作系統(tǒng)提供的一種協(xié)調(diào)共享資源訪問的方法

①信號是一種抽象數(shù)據(jù)結(jié)構(gòu)

  • 一個整型int(sem),可進行兩個原子操作
  • P(): sem–,如果sem<0,等待,否則繼續(xù),類似lock_acquire?
  • V(): sem++,如果sem<=0,說明當(dāng)前有等著的,喚醒掛在信號量上的進程,可以是一個,可以是多個

②信號量的特性

  • 信號量是被保護的整數(shù)變量。初始化完成后,只能通過P()V()操作修改;由操作系統(tǒng)保證,PV操作時原子操作。
  • P()可能阻塞,V()不會阻塞
  • 通常假定信號量是公平的,線程不會無線阻塞在P操作,可以假定信號量等待時按照先進先出排隊的。而自旋鎖是無法實現(xiàn)先進先出的,因為它需要占用CPU資源不停查詢鎖是否空閑,無法指定進入臨界區(qū)的順序。

2、信號量的實現(xiàn)

二、信號量使用

1、信號量分兩種類型:?

  • 二進制信號量:約等于鎖,取值0 or 1?
  • 資源信號量:資源數(shù)目任何非負值?
  • 兩者其實是等價的,可以基于一個構(gòu)造出另一個

信號量的使用有兩種情況:

  • 互斥訪問比如臨界區(qū)的互斥訪問控制、
  • 條件同步比如線程間的條件等待。互斥訪問如下圖

3、生產(chǎn)者—消費者問題

生產(chǎn)者——>緩沖區(qū)——>消費者

①問題描述

  • 一個或多個生產(chǎn)者在生成數(shù)據(jù)后放在一個緩沖區(qū)里;
  • 單個消費者從緩沖區(qū)取出數(shù)據(jù)處理;
  • 任何時刻只能有一個生產(chǎn)者或消費者可訪問緩沖區(qū)

②問題分析:

  • 任何時刻只能有一個線程操作緩沖區(qū)(互斥訪問);
  • 緩沖區(qū)空時,消費者必須等待生產(chǎn)者(條件同步);
  • 緩沖區(qū)滿時,生產(chǎn)者必須等待消費者(條件同步)

③信號量描述各個約束

  • 二進制信號量mutex
  • 資源信號量fullBuffers
  • 資源信號量emptyBuffers

如下圖是利用信號量實現(xiàn)的生產(chǎn)者消費者模型。生產(chǎn)者消費者模型的要求是同一時刻只能有一個生產(chǎn)者或消費者訪問緩沖區(qū),生產(chǎn)者只能在緩沖區(qū)有空間時才能往里塞數(shù)據(jù),消費者只有緩沖區(qū)有數(shù)據(jù)時才能從里面消費數(shù)據(jù)。


三、管程

管程是一種用于多線程互斥訪問共享資源的程序結(jié)構(gòu),采用面向?qū)ο蟮姆椒?#xff0c;簡化線程間的同步控制,保證任意時刻最多只有一個線程執(zhí)行管程代碼,管程與臨界區(qū)的區(qū)別是在管程中的線程可臨時放棄管程的互斥訪問,等待事件出現(xiàn)時恢復(fù),而臨界區(qū)只有線程退出臨界區(qū)才能放棄互斥訪問。

管程與臨界區(qū)結(jié)構(gòu)上差別在于多了共享數(shù)據(jù),共享數(shù)據(jù)作為條件變量,如果條件變量的數(shù)量為0則跟臨界區(qū)完全一樣。進入管程的線程因資源被占用而進入等待狀態(tài),每個條件變量表示一種等待原因,對應(yīng)著一個等待隊列。管程最重要的兩個操作:wait()和Signal(),wait將自身阻塞在等待隊列中,喚醒一個等待者或釋放管程的互斥訪問,Signal操作將等待隊列中的一個線程喚醒,如果等待隊列為空,則等同空操作。

條件變量(condition variab)

  • 條件變量是管程內(nèi)的等待機制:進入管程的線程因資源被占用而進入等待狀態(tài);每個條件變量表示一種等待原因,對應(yīng)一個等待隊列;
  • wait() 操作:將自己阻塞在等待隊列中,喚醒一個等待者或釋放管程的互斥訪問;
  • signal()操作:將自己隊列中的一個線程喚醒;如果等待隊列為空,則等同空操作;
  • 調(diào)用管程解決消費者生產(chǎn)者問題?

    count記錄了當(dāng)前BUFFER的數(shù)據(jù)個數(shù)?

    先在前后加鎖,因為要保證只有一個線程在臨界區(qū) lock在等待/睡眠的時候通過;lock->Acquire()管程進入和lock->Release()管程釋放;notfull.wait(&lock)釋放鎖。喚醒后獲得鎖。

    2、管程條件變量的釋放處理方式

    管程條件變量釋放處理方式有兩種如下圖。可以看到Hoare的管程方式是更符合實際使用效果的,但是Hansen管程實現(xiàn)方式少了一次進程上下文切換,因此真實OS中一般使用Hansen管程方式。

    總結(jié)

    以上是生活随笔為你收集整理的清华大学《操作系统》(十八):管程于信号量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。