作業系統知識點回顧 互斥和同步

2021-10-12 10:23:03 字數 3067 閱讀 4987

1.同步

指在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的某種先後次序來執行,這種先後次序依賴於要完成的特定的任務。如果用對資源的訪問來定義的話,同步是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

2.互斥

指散布在不同程序之間的若干程式片斷,當某個程序執行其中乙個程式片段時,其它程序就不能執行它們之中的任一程式片段,只能等到該程序執行完這個程式片段後才可以執行。如果用對資源的訪問來定義的話,互斥某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

3.多執行緒同步和互斥有幾種實現方法

執行緒間的同步方法大體可分為兩類:使用者模式和核心模式。顧名思義,核心模式就是指利用系統核心物件的單一性來進行同步,使用時需要切換核心態與使用者態,而使用者模式就是不需要切換到核心態,只在使用者態完成操作。

使用者模式下的方法有:原子操作(例如乙個單一的全域性變數),臨界區。

核心模式下的方法有:事件,訊號量,互斥量。

臨界區:通過對多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問。

互斥量:為協調共同對乙個共享資源的單獨訪問而設計的。

訊號量:為控制乙個具有有限數量使用者資源而設計。

事 件:用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。

4.死鎖

定義: 如果一組程序中的每乙個程序都在等待僅由該組程序中的其他程序才能引發的事件,那麼該組程序就是死鎖的。或者在兩個或多個併發程序中,如果每個程序持有某種資源而又都等待別的程序釋放它或它們現在保持著的資源,在未改變這種狀態之前都不能向前推進,稱這一組程序產生了死鎖。通俗地講,就是兩個或多個程序被無限期地阻塞、相互等待的一種狀態。

產生死鎖的必要條件:

互斥條件 (mutual exclusion):資源不能被共享,只能由乙個程序使用。

請求與保持條件 (hold and wait):已經得到資源的程序可以再次申請新的資源。

非搶占條件 (no pre-emption):已經分配的資源不能從相應的程序中被強制地剝奪。

迴圈等待條件 (circular wait):系統中若干程序組成環路,該環路中每個程序都在等待相鄰程序正占用的資源。

訊號量:用於程序間傳遞訊號的乙個整數。在訊號兩上只可以進行三種操作,即初始化,遞增,遞減。這三種操作分別都是原子操作。遞減作用於阻塞乙個程序,遞增作用於解除乙個程序的阻塞。訊號量也稱為計數訊號量或一般訊號量。

訊號量是不要求忙等的同步互斥工具。一種訊號量表示一種資源。訊號量的值表示可用資源的個數。

當資源不可用時,程序將阻塞(避免忙等)(加入阻塞佇列),直到另一程序釋放資源時才被喚醒。

訊號量 s 只能被下面的兩個原語訪問:

semwait (s) 也稱作 p (s) 操作,wait (s) —— 本程序請求分配乙個資源

semsignal (s) 也稱作 v (s) 操作,signal (s) —— 本程序釋放乙個資源

注意:semwaits (s)、semsignal (s) 操作必須 成對出現。

用於 互斥時,位於同一程序內,臨界區前後。

用於 同步時,交錯出現於兩個合作程序內。

多個 semwait () 的次數 不能顛倒,否則可能導致死鎖。用於同步的 semwait (s1) 應出現在用於互斥的 semwait (s2) 之前。

多個 semsignal () 操作的次序可任意。

【訊號量**示例】

struct	semaphore ;

void semwait(semaphore s)}

void semsignal(semaphore s)

}

總結:v 原語操作的本質在於:乙個程序使用完臨界資源後,釋放臨界資源,使 s 加 1,以通知其它的程序,這個時候如果 s<=0,表明有程序阻塞在該類資源上,因此要從阻塞佇列裡喚醒乙個程序來 「轉手」 該類資源。

【用訊號量實現互斥】

const int n = /*程序數 */;

semaphore s =1;/*s的初值=1*/

void p(int i)

}void main()

// s=1 時:有乙個臨界資源可用,乙個程序可進入臨界區。

// s=0 時:臨界資源已分配,乙個程序已進入臨界區。

// s<0 時:臨界區已被占用,|s | 個阻塞程序正在等待進入。

【用訊號量實現同步】

semaphore s =0;/*s的初值=0*/

process p1:

doprocess p2:

do// s>=0:可用資源個數(或可進入臨界區的程序個數)。

// s<0 : 該資源的等待佇列長度(阻塞程序個數)。

總結:同步是合作的併發程序需要按先後次序執行。

**1.定義

一組生產者程序和一組消費者程序共用乙個有 size of buffer 個緩衝區的緩衝池來交換資料(有限緩衝)。

2.資源,約束條件及訊號量的設定

緩衝池一次只能讓乙個程序訪問。(互斥):設一訊號量 s,初值為 1。

生產者需要空緩衝來傳送資料。(同步):設一訊號量 empty,初值為 size of buffer。

消費者需要滿緩衝來獲取資料。(同步):設一訊號量 full,初值為 0。

3.【**示例】

void producter()} 

void consumer()

}

說明:wait(s)和signal(s)是保證臨界區的互斥,而empty和full訊號量是保證生產者消費者執行緒的同步。

作業系統知識點回顧 Linux相關命令

1.目錄切換命令 2.目錄的操作命令 增刪改查 1 mkdir目錄名稱 增加目錄 2 ls或者ll ll 是 ls l 的別名,ll 命令可以看到該目錄下的所有目錄和檔案的詳細資訊 檢視目錄資訊 3 find目錄 引數 尋找目錄 查 4 mv目錄名稱 新目錄名稱 修改目錄的名稱 改 注意 mv 的語...

作業系統實驗 同步互斥

實習1 程序同步 實習要求 在windows 2000 環境下,建立乙個包含n 個執行緒的控制台程序。用這n 個執行緒來表示n 個讀者或寫者。每個執行緒按相應測試資料檔案的要求,進行讀寫操作。請用訊號量機制分別 實現讀者優先和寫者優先的讀者 寫者問題。讀者 寫者問題的讀寫操作限制 1 寫 寫互斥 2...

作業系統 同步與互斥問題

1.生產者 消費者問題 define n 100 有界緩衝區大小 typedef int semaphore 定義訊號量 semaphore mutex 1 臨界區互斥訊號量 semaphore empty n 空閒緩衝區 semaphore full 0 緩衝區初始化為空 void produce...