1. 程式人生 > >利用記錄型訊號量機制: wait(s), signal(s)解決程序同步問題

利用記錄型訊號量機制: wait(s), signal(s)解決程序同步問題

wait(s) 等價與P操作, signal(s)等價於V操作

生產者-消費者問題

int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void procuder() {
  do {
      procuder an item nextp;
      ...
      wait(empty);//表示空緩衝區-1;
      wait(mutex);//資料緩衝區互斥訪問,關閉訪問;
      buffer[in] = nextp;
      in = (in+1) % n;
      signal(mutex);//開啟訪問
signal(full);//滿緩衝區加+1 } while (true); } void consumer() { do { wait(full);//判斷是否有滿緩衝區,滿緩衝區-1 wait(mutex); nextc = buffer[out]; out = (out+1) % n; signal(mutex); siganl(empty);//空緩衝區+1 consumer the item in nextc; .... } while (true); } void
main() { cobegin producer(); consumer(); coend }

爸爸媽媽洗水果,兒子女兒吃水果問題

問題描述:爸爸專向盤中放蘋果,媽媽專向盤中放橘子,兒子專等吃盤裡的橘子,女兒專等吃盤裡的蘋果。只要盤子空,爸爸媽媽可向盤中放水果,僅當盤中有自己需要的水果時,兒子或女兒可從中取出,請給出他們四人之間的同步關係,並用PV操作實現四人正確活動的程式。。使用p、v操作來完成父親、媽媽、兒子、女兒的同步行為模擬。

semaphore putmutex = 1, getmutex = 0;
semaphore empty = 1, apple = 0
, orange = 0; void father() {   do {    wait(putmutex);    apple++;    empty--;    signal(putmutex);   } while (true); } void mother() { do { wait(putmutex); orange++; empty--; signal(putmutex); } while (true); } void son() { do { wait(getmutex); orange--; empty++; signal(getmutex); } while (true); } void daughter() { do { wait(getmutex); apple--; empty++; signal(getmutex); } while (true); } void main() { cobegin father(); mother(); son(); daughter(); coend }

司機,售票員問題

問題:
司機開車,售票員售票。當售票員將門關上的時候司機才可以開車,當司機將車到站停下的時候,售票員才可以開啟車門。

對S1(門): 門有兩個狀態,開和關。售票員將門關上之後,應該將門的操作權給司機(因為只有司機到站了才能停車)。因此0為門開著狀態。
對S2(車):兩個狀態,開車行駛和到站停車。當車開的時候,需要申請車的資源,即用wait,則車在停著的時候狀態為1,行駛時狀態為0.
司機:開車,正常行駛,到站停車
售票員:關門,售票,開門

**S1表示是否允許司機啟動汽車;S1 = 1表示可以啟動,S2 = 0表示不能啟動。
S2表示是否允許售票員關車門;S2 = 1表示允許售票員關車門,S2 = 0表示不允許售票員關車門。**

semaphore s1 = 1, s2 = 0;
void driver() {
  do {
    wait(s1);// P(S1)
    開車;
    正常行駛;
    到站停車;
    signal(s2);//V(S2)
  } while (true);
}
void seller() {
  do {
    關門;
    signal(s1);// V(S1)
    售票;
    wait(S2);//P(S2)
    開車門;
    上下乘客;
  } while (true);
}
void main() {
  cobegin
    driver(); seller();
  coend
}

相關推薦

利用記錄訊號機制 wait(s), signal(s)解決程序同步問題

wait(s) 等價與P操作, signal(s)等價於V操作 生產者-消費者問題 int in = 0, out = 0; item buffer[n]; semaphore mutex = 1, empty = n, full = 0; void

訊號記錄訊號以及利用訊號實現程序互斥和前驅關係

訊號量機構是一種功能較強的機制,可用來解決互斥與同步的問題,它只能被兩個標準的原語wait(S)和signal(S)來訪問,也可以記為“P操作”和“V操作”。原語是指完成某種功能且不被分割不被中斷執行的操作序列,通常可由硬體來實現完成不被分割執行特性的功能。如前述的“Tes

試從物理概念上說明記錄訊號waitsignal

一個訊號量通常對應一類臨界資源,在使用前,訊號量必須經過定義並賦適當的初值。 每次對它進行wait操作意味著申請一個單位的該資源,signal操作操作意味著歸還一個單位的該類資源。 當S.value>0時,它的值表示系統中該類資源當前可用的數目;S.value<

哲學家就餐問題——and訊號機制

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <stdbool.h> #includ

作業系統(2.3程序同步)本章最後結合記錄訊號的使用方法和例題進行了詳細講解。

最近在準備推免的面試把王道的程序這一章拿出來做了一下,收穫挺多的,寫個文章總結下  2.3程序同步 訪問臨界資源過程 do{ entry section;//進入區 設定訪問臨界區標誌 critical section;//臨界區 訪問臨界資源 exit se

記錄訊號---程序同步與互斥面向物件的解決方案(一)

由於為了提高計算機系統資源的利用率,人們引入了多道程式設計技術,逐漸作業系統也慢慢成型,隨之而來的問題也出現了,例如計算機系統資源有一些是不允許被同一段時間內被多個程序同時訪問的,一個程序的執行需要另外的程序執行完畢,這個程序才可以執行,也就是程序的互斥與同步。 作業系統

程序同步(二)——訊號機制(整記錄

訊號量機制 訊號量(Semaphore)機制是一種卓有成效的程序同步工具。 整型訊號量 把整型訊號量定義為一個表示資源數目的整型量S,除初始化外,僅能通過兩個標準的原子操作wait(S)和signal(S)來訪問。 wait(S)和signal(S)

【OS】訊號機制

儲存一下自己看,侵刪。 原文地址:http://blog.csdn.net/speedme/article/details/17597373 上篇部落格中(程序同步之臨界區域問題及Peterson演算法),我們對臨界區,臨界資源,鎖機制詳細解讀了下,留下了一個問題,就是鎖機制只能判斷臨界資源是否被佔用,所

訊號機制中的down和up函式

轉自:https://blog.csdn.net/fzubbsc/article/details/37737159 參考: https://blog.csdn.net/liuxd3000/article/details/17913363 http://blog.chinaunix.net

第二章 2.3 訊號機制

整形訊號量: 訊號量定義為一個整型量; 根據初始情況賦相應的值; 僅能通過兩個原子操作來訪問 P 操作: wait(S): While S<=0 do no-op; S:=S-1;

計算機作業系統感悟隨筆--訊號機制

2.訊號量的基本應用 實現程序互斥 實現程序間的前趨關係(有序) 3.整型訊號量 把整型訊號量定義為一個表示資源數目的整型量S,除初始化外,僅能通過兩個標準的原子操作wait(S)和signal(S)來訪問。 wait(S)和signal(S)操作可以描述為

FreeRTOS學習筆記——互斥訊號

/* Standard includes. */ #include <stdio.h> #include <string.h> /* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h" #include "qu

作業系統學習筆記--AND訊號

    基本思想:將程序在整個執行中需要的所有資源,一次性全部分配給程序,待程序使用完後一起釋放。(避免死鎖狀態)在Wait中加入AND條件,又稱AND同步或同時wait操作:Swait    Swait(S1,S2,...Sn) If S1 and Sn>= 1 //

GCD之訊號機制

在使用NSOperationQueue進行多執行緒程式設計時,可通過[queue setMaxConcurrentOperationCount:5]來設定執行緒池中最多並行的執行緒數,在GCD中訊號量機制也和它相似,可以控制併發的執行緒數量。 1.首先熟悉下幾個函式

ios GCD之訊號機制

一,什麼是訊號量機制    抽象說:     訊號量是一個整型值並且具有一個初始計數值,並且支援兩個操作:訊號通知和等待。當一個訊號量被訊號通知,其計數會被增加。當一個執行緒在一個訊號量上等待時,假如此時的訊號量的整型值為0, 執行緒會被阻塞(因為等待會讓訊號量的整型

【作業系統原理】訊號機制

        訊號量機制是一種卓有成效的程序互斥同步工具。這裡只介紹記錄型訊號量機制,它可以有效的解決CPU“忙等”的問題,實現互斥。        記錄型訊號量機制的資料結構如下(看不懂那些字母

PV操作和訊號機制實現程序同步(對多個臨界資源的互斥訪問)

          程序同步是我們在多執行緒中討論最多的一個話題,在大多數的開發語言中,他們都有自己實現程序同步的方法或者實現。但歸根結底他們實現的方式都是基於作業系統的程序同步的方式。今天我們就一起來看一下在作業系統這個底層中是怎麼實現程序同步的。在計算機作業系統中,P

AND訊號訊號集-----程序同步與互斥面向物件的解決方案(二)

AND型訊號量 上述的程序互斥問題,是針對各程序之間只共享一個臨界資源而言的。在有些應用場合,是一個程序需要先獲得兩個或更多的共享資源後方能執行其任務。假定現有兩個程序A和B,他們都要求訪問共享資料D和E。當然,共享資料都應作為臨界資源。為此,可為這兩個資料分別設定用於互斥

訊號機制

轉自  http://blog.csdn.net/guoping16/article/details/6584043 訊號量函式由semget、semop、semctl三個函式組成。下面的表格列出了這三個函式的函式原型及具體說明。 1.   semget函式原型 s

uc/os-ii互斥訊號

互斥訊號量(Mutual Exclusion Semaphores)也稱為Mutex,用於實現對共享資源的獨佔處理,互斥訊號量也是一個二值訊號量,利用它可以降解優先順序反轉問題。 當高優先順序任務需要使用某個共享資源,而恰巧該共享資源又被一個低優先順序任務佔用