清華大學《操作系統》(十八):管程于信號量

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

一、信號量

1、信號量(semaphore):是操作系統提供的一種協調共享資源訪問的方法

①信號是一種抽象數據結構

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

②信號量的特性

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

2、信號量的實現

二、信號量使用

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

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

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

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

3、生產者—消費者問題

生產者——>緩沖區——>消費者

①問題描述

  • 一個或多個生產者在生成數據后放在一個緩沖區里;
  • 單個消費者從緩沖區取出數據處理;
  • 任何時刻只能有一個生產者或消費者可訪問緩沖區

②問題分析:

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

③信號量描述各個約束

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

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


三、管程

管程是一種用于多線程互斥訪問共享資源的程序結構,采用面向對象的方法,簡化線程間的同步控制,保證任意時刻最多只有一個線程執行管程代碼,管程與臨界區的區別是在管程中的線程可臨時放棄管程的互斥訪問,等待事件出現時恢復,而臨界區只有線程退出臨界區才能放棄互斥訪問。

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

條件變量(condition variab)

  1. 條件變量是管程內的等待機制:進入管程的線程因資源被占用而進入等待狀態;每個條件變量表示一種等待原因,對應一個等待隊列;
  2. wait() 操作:將自己阻塞在等待隊列中,喚醒一個等待者或釋放管程的互斥訪問;
  3. signal()操作:將自己隊列中的一個線程喚醒;如果等待隊列為空,則等同空操作;

調用管程解決消費者生產者問題?

count記錄了當前BUFFER的數據個數?

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454130.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Iptalbes自動封殺暴力破解(Qmail郵件系統)者的IP地址

今天發現Qmail郵件系統的maillog里面有大量的“user not found”信息&#xff0c;通過下面的日志不難發現&#xff0c;是來自同一IP的很多不同的用戶連接Qmail郵件系統認證失敗的信息。黑客試圖通過這種方式來破解Qmail郵件系統的用戶名和密碼&#xff0c;從而來發送大量的垃圾…

安裝Postman

在web和移動端開發時&#xff0c;常常會調用服務器端的restful接口進行數據請求&#xff0c;為了調試&#xff0c;一般會先用工具進行測試&#xff0c;通過測試后才開始在開發中使用。 這里介紹一下如何在chrome瀏覽器利用postman應用進行restful api接口請求測試。 因為&#…

python紅樓夢詞頻統計_用 Python 分析《紅樓夢》(2)-阿里云開發者社區

6 詞頻統計完成分詞以后&#xff0c;詞頻統計就非常簡單了。我們只需要根據分詞結果把片段切分開&#xff0c;去掉長度為一的片段(也就是單字)&#xff0c;然后數一下每一種片段的個數就可以了。這是出現次數排名前 20 的單詞&#xff1a;(括號內為頻數)可以跟之前只統計出現次…

清華大學《操作系統》(二十):死鎖和進程通信

一、死鎖 死鎖&#xff1a;一組阻塞的進程&#xff08;兩個或多個&#xff09;&#xff0c;持有一種資源&#xff0c;等待獲取另一個進程所占有的資源&#xff0c;而導致誰都無法執行。 可重復使用的資源&#xff1a; 在一個時間只能一個進程使用&#xff0c;且不能被刪除。…

python操作redis實例_Java,php,Python連接并操作redis實例

1、Java連接并操作redis在Eclipse里新建一個java project&#xff0c;導入jedis-*.jar包。示例代碼&#xff0c;其他對應的操作類型見&#xff1a;http://my.oschina.net/u/2391658/blog/705069import redis.clients.jedis.Jedis;//示例代碼public class RedisTest {public sta…

java: cannot execute binary file 如果遇到這個錯,一般是操作系統位數出問題了。

[roottestserver usr]# java/jdk1.6.0_12/bin/java-bash: java/jdk1.6.0_12/bin/java: cannot execute binary file后來檢驗&#xff0c;檢查了一段時間&#xff0c;沒有問題&#xff0c;最后有高人提示經驗證&#xff0c;是64位版本移到32位上。本文轉自 jxwpx 51CTO博客&…

div 自適應高度

自適應高度 &#xff0c;設置最小高度&#xff1b;通常情況下&#xff0c;沒有設置高度&#xff0c;div默認自適應高度且無最低高度 1 div{ 2 _height:200px; /* css 注解&#xff1a; 僅IE6設別此屬性&#xff0c;假定最低高度是200px &#xff0c;設置高度200px&#xff0c…

GCC使用詳情

1.前言 GCC編譯器的手冊(GCC MANUAL)的英文版已經非常全面&#xff0c;并且結構也非常完善了&#xff0c;只是一直都沒有中文的版本&#xff0c;我這次閱讀了GCC編譯器的主要內容&#xff0c;對手冊的內容進行了結構性的了解&#xff0c;認為有必要對這次閱讀的內容進行整理&am…

清華大學《操作系統》(二十二):文件系統

文件系統和文件&#xff1a; 文件系統是操作系統中管理持久性數據的子系統&#xff0c;提供數據存儲和訪問功能&#xff0c;組織、檢索、讀寫訪問數據。文件是具有符號名&#xff0c;由字節序列構成的數據項集合&#xff0c;是文件系統的基本數據單位&#xff0c;文件名是文件…

卡巴綠殺6 By Moshow魔手

卡巴綠殺6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【這是卡巴斯基綠色移動版本推薦用于u盤】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下無毒)擁有全球最全的病毒庫)擁有最快的全球剿毒反應速度) 基于穩定…

python將字符串寫入csv_用Python將字符串值寫入CSV文件

我有一個很大的數據集&#xff0c;在第二列有句子和他們的情緒狀態。我開發了代碼來將它們讀作numpy數組。我需要的是&#xff0c;如果一個句子的情感是中性的&#xff0c;那么返回為真&#xff0c;否則返回假。if-else條件返回的每個結果都應寫入CSV文件。但是這里它只在CSV文…

加載靜態文件,父模板的繼承和擴展

用url_for加載靜態文件<script src"{{ url_for(static,filenamejs/login.js) }}"></script>flask 從static文件夾開始尋找可用于加載css, js, image文件繼承和擴展把一些公共的代碼放在父模板中&#xff0c;避免每個模板寫同樣的內容。base.html子模板繼…

清華大學《操作系統》(二十三):I/O子系統

常見設備接口類型&#xff1a; 1、字符設備&#xff1a;鍵盤鼠標、串口 a.以字節為單位順序訪問 b.I/O命令通常使用文件訪問接口和語義 2、塊設備&#xff1a;磁盤、磁帶、光驅 a.均勻的數據塊訪問 b.I/O命令通常使用文件系統接口&#xff0c;也可以使用內存映射訪問 3、網絡…

百度地圖 Android SDK - 個性化地圖

什么是百度個性化地圖Android SDK&#xff1f; 百度個性化地圖Android SDK是一套基于Android 2.2及以上版本號設備的應用程序接口&#xff0c;您能夠通過該套接口實現主要的地圖功能&#xff0c;而且能夠定制地圖樣式&#xff0c;實現個性化地圖。 該接口提供下面功能&#xff…

mysql讀寫分離_MySQL基于amoeba讀寫分離實驗

主從復制只是一個同步數據的方式讀寫分離&#xff1a;只在主的上面寫&#xff0c;只在從的上面讀讀寫分離方案&#xff1a;【1】基于程序代碼內部 (生產環境中應用最廣泛&#xff0c;性能最好&#xff0c;需要開發人員來實現)【2】基于中間代理層的實現amoeda 是阿里巴巴使用的…

Django models模型

Django models模型 一. 所謂Django models模型&#xff0c;是指的對數據庫的抽象模型&#xff0c;models在英文中的意思是模型&#xff0c;模板的意思&#xff0c;在這里的意思是通過models&#xff0c;將數據庫的借口抽象成python自己的一個類。然后在python Django框架其他代…

Page.FindControl方法找不到指定控件的原因

在ASP.NET 2.0中&#xff0c;引入了MasterPage的機制&#xff0c;在當前頁使用MasterPage的情況下&#xff0c;放在 ContentPlaceholder1這樣的內容頁的控件無法用Page.FindControl來查找&#xff0c;原因何在&#xff1f;MSDN對FindControl的解釋&#xff1a;在當前的命名容器…

ATT匯編語言與GCC內嵌匯編簡介

AT&T匯編語言與GCC內嵌匯編簡介 1 AT&T 與INTEL的匯編語言語法的區別 1.1大小寫 1.2操作數賦值方向 1.3前綴 1.4間接尋址語法 1.5后綴 1.6指令 2 GCC內嵌匯編 2.1簡介 2.2內嵌匯編舉例 2.3語法 2.3.1匯編語句模板 2.3.2輸出部分 2.3.3輸入部分 2.3.4限制字符 2.3.5破…

Python內存管理以及垃圾回收機制

垃圾回收&#xff1a;用通俗點的語言解釋就是內存管理和垃圾回收的過程. 大管家refchain 在Python的C源碼中有一個名為refchain的環狀雙向鏈表&#xff0c;這個鏈表就比較厲害了&#xff0c;因為Python程序中一旦創建對象都會把這個對象添加到refchain這個鏈表中。也就是說他…

pythonfillcolor_openpyxl 填充顏色(單元格)

如果需要填充某個單元格的顏色需要3步&#xff1a;# 1-加載庫文件from openpyxl import Workbookfrom openpyxl.styles import PatternFill#2-新建一個工作簿wb Workbook()ws wb.active#隨便賦個值d4 ws[D4]d4 43d4.value#3-設置樣式&#xff0c;并且加載到對應單元格fill …