操作系統【一】進程同步和信號量

基本概念

進程異步性特征:各并發執行的進程以各自獨立的,不可預知的速度向前推進。

進程同步又稱作直接制約關系,他是指為完成某種任務而建立的兩個或者多個進程,這些進程因為需要在某些位置上協調他們的工作順序而產生的制約關系。(源于進程需要相互合作)

但是因為進程本身的異步性,因此需要操作系統進行處理。

兩種資源共享方式:互斥共享、同時共享
臨界資源:一個時間段內只允許一個進程使用的資源
進程互斥:當某一個進程訪問某臨界資源時,另一個想要訪問臨界資源的進程必須等待。

do
{進入區臨界區退出區剩余區
}while(true)
  • 進入區:判斷能夠進入臨界區,如果可以進入,則設置正在訪問臨界資源的標志,阻止其他進程進入臨界區
  • 臨界區/段:訪問臨界資源的代碼
  • 退出區:解除正在訪問臨界資源的標志
  • 剩余區:其他處理

實現進程互斥應該遵循的原則:

  • 空閑讓進:臨界區空閑時可以允許一個進程進入臨界區
  • 忙則等待:如果已經有進程進入臨界區則其他試圖進入臨界區的進程必須等待
  • 優先等待:對于請求訪問的進程,應該保證能在有限時間內進入臨界區(保證不會饑餓)
  • 讓權等待:如果進程不能進入臨界區,應該立即釋放處理機,防止進程忙等待

實現進程互斥的軟件實現

單標志法

每個進程進入臨界區的權限只能被另一個進程賦予
在這里插入圖片描述違背空閑讓進、讓權等待

雙標志先檢查法

在這里插入圖片描述flag數組的訪問因為進程的異步性有可能導致違反忙則等待原則

雙標志后檢查法

在這里插入圖片描述可能違背空閑讓進、有限等待原則

Peterson算法

在這里插入圖片描述
違背讓權等待的原則,可能需要“忙等”。但是比前面幾種方法好。

進程互斥的硬件實現

中斷屏蔽方法

利用“開/關中斷指令”實現。即在某進程開始訪問臨界區到結束訪問為止都不允許被中斷,也就不能發生進程切換,因此也不可能發生兩個同時訪問臨界區的情況。

優點:簡單、高效
缺點:不適用多處理機;只適用操作系統內核進程,不適用于用戶進程(因為開/關中斷指令只能運行在內核態)

TestAndSet指令(TS)

也叫做TestAndSetLock(TSL)

在這里插入圖片描述上鎖和檢查操作變成了原子操作
優點:實現簡單;適用多機處理環境
缺點:不滿足讓權等待原則

Swap指令

也叫做Exchange指令,或者簡稱XCHG指令
在這里插入圖片描述優點:實現簡單,適合多機系統
缺點:不滿足讓權等待

信號量機制

信號量其實就是一個變量,可以用一個信號量來表示系統中某種資源的數量4
原語:一種特殊的程序段,其執行只能一氣呵成,不可被中斷。(用來解決檢查和上鎖無法一氣呵成的問題)

信號量S
Wait(S) P操作
Signal(S) V操作

整型信號量

對信號量的操作只能有三種,初始化、P、V

在這里插入圖片描述不滿足讓權等待原則,會發生忙等

記錄型信號量

在這里插入圖片描述
S.value<0時表示該類資源已經分配遠比,因此該進程自我阻塞。

當進行V操作發現S.value<=0時,表示在將這個資源還給系統之前有進程在阻塞等待資源,因此喚醒一個進程。

滿足進程互斥的所有原則

信號量機制實現進程互斥

在這里插入圖片描述

信號量機制實現進程同步

為了保證進程執行的順序:

  • 設置同步信號量S,初始化為0
  • 在需要首先進行的操作后執行V(S)操作
  • 在條件滿足情況下執行的操作前執行P(S)操作
    如果有多個約束關系就設置多個信號量

信號量機制實現前驅關系

對于每條邊設置一個信號量,然后同進程同步(這也是一種進程同步)

在這里插入圖片描述

生產者-消費者問題

系統中有一組生產者進程和一組消費者進程,生產者進程每次生產一個產品放入緩沖區,消費者進程每次從緩沖區中取出一個產品并適用。

生產者、消費者共享一個初始為空、大小為n的緩沖區

對臨界資源的訪問必須互斥訪問,緩沖區也是一種臨界資源(否則多個進程同時向緩沖區寫入數據可能造成數據的覆蓋)

PV操作題目分析:

  • 關系分析,找出題目中描述的各個進程,分析他們之間的同步、互斥關系
  • 確定P、V操作的大體順序:因為生產者每次要消耗一個空閑緩沖區,并且生產一個產品。消費者每次要消耗一個產品,并釋放一個空閑緩沖區。
  • 設置信號量

在這里插入圖片描述對于臨界資源的訪問一定要滿足訪問條件以后再進行訪問,否則有可能導致死鎖。即先滿足進程同步條件再進行互斥操作

平時設計的時候要盡可能縮小互斥訪問PV操作覆蓋的區域,即盡可能減少臨界區中的操作,不僅是為了避免死鎖,同時還是為了提高進程的并行性。

多生產者-多消費者問題

多類生產者和多類消費者

在這里插入圖片描述

當緩沖區資源只為1的時候我們有可能可以不專門設置訪問緩沖區的互斥信號量。不過出于良好的習慣我們還是在訪問緩沖區的時候專門加上互斥信號量。需要注意的是對互斥信號量的P操作一定要在進程同步的P操作之后,否則會引起死鎖。

我們在分析的時候理解為事件的行為(對資源的占用等等),而不是進程之間的行為。

吸煙者問題

在這里插入圖片描述在這里插入圖片描述

讀者-寫者問題

在這里插入圖片描述在這里插入圖片描述

潛在的問題:只要有都進程還在讀,寫進程就要一直阻塞等待,可能“餓死”。因此,這種算法中讀進程是優先的。

在這里插入圖片描述

哲學家進餐問題

在這里插入圖片描述
每個哲學家進程需要同時持有兩個臨界資源才能開始吃飯,所以需要避免資源分配不當導致死鎖。

  • 最多只允許四個哲學家進餐
  • 對于奇數號的哲學家必須先拿左邊的筷子,偶數號的哲學家必須先拿右邊的筷子
  • 只允許一個哲學家拿筷子
    在這里插入圖片描述

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

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

相關文章

計算機網絡【四】數據鏈路層基本概念+點到點通信(PPP協議)

數據鏈路層基本概念 路由器是網絡層設備 數據鏈路層&#xff1a;數據管道&#xff0c;傳輸的是數據包加上發送地址&#xff0c;接收地址&#xff0c;校驗的數據幀 數據鏈路層的信道類型&#xff1a; 點到點信道&#xff1a;使用一對一的點到點通信方式&#xff08;兩個設備…

Linux網絡編程——tcp并發服務器(poll實現)

https://blog.csdn.net/lianghe_work/article/details/46535859想詳細徹底地了解poll或看懂下面的代碼請參考《Linux網絡編程——I/O復用之poll函數》 代碼&#xff1a;#include <string.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#…

二分查找的最大比較次數

二分查找很簡單&#xff0c;可是對于一個區間長度為n的數組&#xff0c;最大的比較次數為多少呢&#xff1f; 對于標準的二分查找&#xff0c;我們每次從區間[l,r)中取一個值&#xff0c;和中間值mid(lr)>>1進行比較&#xff0c;然后將數組分為[l,mid) [mid1,r)&#xf…

Linux網絡編程——I/O復用函數之epoll

https://blog.csdn.net/lianghe_work/article/details/46544567一、epoll概述epoll 是在 2.6 內核中提出的&#xff0c;是之前的 select() 和 poll() 的增強版本。相對于 select() 和 poll() 來說&#xff0c;epoll 更加靈活&#xff0c;沒有描述符限制。epoll 使用一個文件描述…

操作系統【三】內存管理基礎+連續內存分配

內存的基礎知識 內存分為按字節編址&#xff08;8位&#xff09;和字編制&#xff08;不同計算機不一樣&#xff0c;64位計算機就是64位&#xff0c;即8個字節&#xff09; 相對地址邏輯地址 絕對地址物理地址 從邏輯地址到物理地址的轉換由裝入解決。 裝入的三種方式 絕對…

MSG_PEEK標志

https://blog.csdn.net/aspnet_lyc/article/details/28937229 MSG_PEEK標志可以用來讀取套接字接收隊列中可讀的數據&#xff0c;一些情況會用到它&#xff0c;比如為了避免不阻塞而先檢查套接字接收隊列中可讀的數據長度&#xff0c;再采取相應操作。當然&#xff0c;不阻塞也…

快速排序詳解+各種實現方式

快速排序的思想大體來說比較簡單&#xff0c;就是從數組中挑選一個數字當做樞紐&#xff0c;然后將比樞紐大的和比樞紐小的分別放在樞紐的兩邊&#xff0c;再遞歸地對兩邊進行操作&#xff0c;從而進行分治解決問題。平均情況下快速排序是復雜度為O(nlogn)O(nlogn)O(nlogn)&…

C++的單例模式與線程安全單例模式(懶漢/餓漢)

https://www.cnblogs.com/qiaoconglovelife/p/5851163.html1 教科書里的單例模式我們都很清楚一個簡單的單例模式該怎樣去實現&#xff1a;構造函數聲明為private或protect防止被外部函數實例化&#xff0c;內部保存一個private static的類指針保存唯一的實例&#xff0c;實例的…

計算矩陣的逆和行列式的值(高斯消元+LU分解)

計算矩陣的逆 選主元的高斯消元法 樸素的高斯消元法是將矩陣A和單位矩陣放在一起&#xff0c;通過行操作&#xff08;或者列操作&#xff09;將A變為單位矩陣&#xff0c;這個時候單位矩陣就是矩陣A的逆矩陣。從上到下將A變為上三角矩陣的復雜度為O(n3n^3n3)&#xff0c;再從下…

Linux網絡編程——tcp并發服務器(epoll實現)

https://blog.csdn.net/lianghe_work/article/details/46551871通過epoll實現tcp并發回執服務器&#xff08;客戶端給服務器發啥&#xff0c;服務器就給客戶端回啥&#xff09; 代碼如下&#xff1a;#include <string.h>#include <stdio.h>#include <stdlib.h&g…

證明AVL樹的上界和下界

對于n個節點的AVL樹&#xff0c;其高度最低的時候肯定為葉子節點只在最后一層和倒數第二層的時候。即對于2k?1<n≦2k1?12^k-1< n\leqq 2^{k1}-12k?1<n≦2k1?1的時候下界都為kkk。因此下界為h┌log2(n1)┐?1h\ulcorner log_2(n1)\urcorner-1h┌log2?(n1)┐?1 對…

淺談dup和dup2的用法

https://blog.csdn.net/u012058778/article/details/78705536一、dup和dup2函數 這兩個函數都可以來復制一個現有的文件描述符&#xff0c;他們的聲明如下&#xff1a;#include <unistd.h>int dup(int fd);int dup2(int fd, int fd 2); 123 關于dup函數&#xff0c;當我…

C++ cin 實現循環讀入

習慣了使用while(~scanf("%d",x)){}來實現循環讀入&#xff0c;但是有時候使用泛型編程的時候就必須使用C中的cin&#xff0c;但是當我想要實現循環讀入的時候卻發現有些困難。 我們可以看一下下面這個簡單的例子&#xff1a; #include <iostream>using name…

BFPTR算法詳解+實現+復雜度證明

BFPTR算法是由Blum、Floyed、Pratt、Tarjan、Rivest這五位牛人一起提出來的&#xff0c;其特點在于可以以最壞復雜度為O(n)O(n)O(n)地求解top?ktop-ktop?k問題。所謂top?ktop-ktop?k問題就是從一個序列中求解其第k大的問題。 top?ktop-ktop?k問題有許多解決方法&#xff…

C++子類對象隱藏了父類的同名成員函數(隱藏篇)

https://blog.csdn.net/alpha_love/article/details/75222175#include <iostream>#include <stdlib.h>#include <string>using namespace std;/*** 定義人類: Person* 數據成員: m_strName* 成員函數: attack()*/class Person{public:Person(){cout<<&…

隨機化快速排序+快速選擇 復雜度證明+運行測試

對于快速排序和快速選擇我之前的文章已經有詳細的說明&#xff0c;需要了解的同學可以移步 傳送門&#xff1a;快速排序&#xff5c;快速選擇(BFPTR) 所謂隨機化其實就是選擇樞紐的時候使用隨機數選擇而已&#xff0c;實現起來很簡單。但是我們使用隨機數如何保證復雜度呢&am…

C++子類父類成員函數的覆蓋和隱藏實例詳解

https://www.jb51.net/article/117380.htm函數的覆蓋覆蓋發生的條件&#xff1a; &#xff08;1&#xff09; 基類必須是虛函數&#xff08;使用virtual 關鍵字來進行聲明&#xff09; &#xff08;2&#xff09;發生覆蓋的兩個函數分別位于派生類和基類 &#xff08;3&#xf…

【Linux基礎】Linux的5種IO模型詳解

引入 為了更好的理解5種IO模型的區別&#xff0c;在介紹IO模型之前&#xff0c;我先介紹幾個概念 1.進程的切換 &#xff08;1&#xff09;定義 為了控制進程的執行&#xff0c;內核必須有能力掛起正在CPU上運行的進程&#xff0c;并恢復以前掛起的某個進程的執行。即從用戶…

計算機網絡【五】廣播通信+以太網

局域網的拓撲 廣域網使用點到點通信 局域網使用廣播通信 可以隨意向網絡中添加設備。 總線網星形網&#xff0c;使用集線器。現在多使用星形網絡。環狀網樹形網 其中匹配電阻用來吸收總線上傳播的信號。 共享通信媒體 靜態劃分信道 頻分復用、時分復用、波分復用、碼分復用…

聊聊Linux 五種IO模型

一篇《聊聊同步、異步、阻塞與非阻塞》已經通俗的講解了&#xff0c;要理解同步、異步、阻塞與非阻塞重要的兩個概念點了&#xff0c;沒有看過的&#xff0c;建議先看這篇博文理解這兩個概念點。在認知上&#xff0c;建立統一的模型。這樣&#xff0c;大家在繼續看本篇時&#…