日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

进程同步和信号量

發布時間:2025/3/20 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程同步和信号量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

進程的同步

進程合作:多進程完成同一個任務

?

實例1:

司機 ?????????????售票員

while)true){ ?????????while)true){

等待 啟動車輛; ??????????關門; 發送信號

?? 正常運行; ??????????售票;

?? 到站停車;發送信號 ??????等待 開門;

} ?????????????? }

兩個進程如何實現同步合作? 通過信號

實例2:文檔打印

問題:如果進程之間完全不知道對方的存在,會產生怎樣的錯誤?聯系實際

?

?

實際上的例子:生產者-消費者實例

共享數據

? 這些都是用戶態

?

生產者進程

while(true){

??while(counter == BUFFER_SIZE)

???? ; //阻塞 ?緩沖區滿,生產者停

??buffer[in] = item;

??in = (in+1)%BUFFER_SIZE;

??counter++; //發信號讓消費者走

}

?

消費者進程

while(true){

? while(counter == 0)

?? ; //阻塞 ?緩沖區空,消費者停

? item=buffer[out];

? out = (out-1)%BUFFER_SIZE;

? counter--; //發信號讓生產者走

}

?

等待是進程同步的核心

?

什么是進程同步?什么地方停,什么地方走?

進程同步?事實上就是讓進城走走停停,來保證多進程合作的合理有序

?

只發信號還不能解決全部問題

1.緩沖區滿以后生產者P1生產一個item放入,會sleep

2.有一個生產者P2生產一個item放入,會sleep

3.消費者C執行1次循環,counter == BUFFER_SIZE - 1, 發信號給P1, P1 wake up。

4.消費者C再執行1次循環,counter == BUFFER_SIZE - 2,P2不能被喚醒。

?

counter無法區分有多少生產者進程,不僅需要喚醒進程(發送信號),還需要一個量用來記錄睡眠進程的數量,來決定是否要發信號。

?

這就引出了信號量

? ?

從信號到信號量

不只是等待信號,發信號? 對應睡眠和喚醒

還能記錄一些信息

  • 能記錄有2個進程等待就可以了 可以使用優先隊列或者是棧來存儲
  • 1.緩沖區滿,P1執行,P1 sleep,記錄下一個進程等待?sem = -1
  • 2.P2執行,P2sleep,記錄下兩個進程等待 ??sem = -2
  • 3.C執行1次循環,發現兩個進程等待,wakeup一個 wakeup P1?sem=-1
  • C再執行1次循環,發現一個進程等待,wakeup一個 wakeup P2?sem=0
  • C再執行1次循環4,發現沒有進程等待,sem = 1
  • P3執行

總結:

什么時候減一?

當有一個進程sleep,信號量-1

什么時候加一?

當發現信號量是負的,信號量+1,并且發信號wakeup; 如果發現信號量是正的,那么不發信號,累加信號量。

?

問題:一種資源的數量是8,這個資源對應的信號量的當前值是2,說明():

資源的數量是8,說明初始的sem是8,當前的信號量變為2,說明沒有進程在等待等待這個資源。

?

什么是信號量?信號量的定義

信號量:1965年,由荷蘭學者Dijkstra提出的一種特殊變量,量用來記錄,信號用來sleep和wakeup

?

struct semaphore

{

?? int value; //記錄資料個數

?? PCB *queue; //記錄等待在該信號量上的進程

}

P(semaphore s); //消費資源

V(semphore s); //產生資源

?

P(semphore s)

{

?? s.value--;

?? if(s.value < 0){

???? sleep(s.queue);?

?? }

}

?

問:V(s)的代碼?

V(semphore s){

??s.value++;

? if(s.value <= 0){

?? wakeup(s.queue);

? }

}

?

Producer(item){

?? P(empty);

?? P(mutex);

?? 讀入in;將item寫入到in的位置上;

?? V(mutex);

?? V(full);

}

?

Constumer() {

?? P(full);

?? P(mutex);

?? 讀入out;從文件out位置讀出到item;打印item;

?? V(mutex);

?? V(empty);

}

?

用信號量解決生產者-消費者問題

int fd = open("buffer.txt");

write(fd, 0, sizeof(int)); //寫in

write(fd, 0, sizeof(int)); //寫out

?

semaphore full = 0;

semaphore empty = BUFFER_SIZE;

semaphore mutex = 1;

?

如何理解用信號量的生產者消費者代碼?

full用來判斷是否為空,empty用來判斷是否為滿。通過P和V來睡眠和喚醒進程,并釋放信號量。

?

如何實現互斥訪問?

當進入緩沖區時,將mutex的值變為0,用完之后在釋放。

?

?

轉載于:https://www.cnblogs.com/ACFLOOD/p/5451409.html

總結

以上是生活随笔為你收集整理的进程同步和信号量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。