1.什么是信號量?
定義:記錄一些信息(即量),并根據這個信息決定睡眠還是喚醒(即信號)。睡眠和喚醒只是一個信號(相當于0和1)。
2.問題:一種資源的數量是8,這個資源對應的信號量的當前值是2,說明:(B)
A. 有2個進程等待這個資源。? ? ? ? ? ? ? ? //值為-2選A
B. 有2個資源可以使用。????????????????
3.信號量:1965年,由荷蘭學者Dijkstra提出的一種特殊整型變量,量用來記錄,信號用來sleep和wake。
(重要)P在荷蘭語里是test(檢測是否有可用資源),V是increase(增加內容)。
struct semaphore
{int value; //記錄資源個數PCB *queue; //記錄等待在該信號量上的進程,使用隊列存儲
}P(semaphore s) //消費資源(對應生產者生產數據占用內存)
{s.value--;if(s.value < 0) sleep(s.queue);
}V(semaphore s) //產生資源(對應消費者從內存中取數據)
{s.value++;if(s.value <= 0) wake(s.queue); //說明上一步value<0,存在進程等待資源,所以喚醒一個
}
4.(重點)用信號量解生產者——消費者問題
int fd = open("buffer.txt");
write(fd, 0, sizeof(int)); //寫in 用文件定義共享緩沖區
write(fd, 0, sizeof(int)); //寫outsemaphore full = 0; //文件里的內容
semaphore empty = BUFFER_SIZE; //資源的數量
semaphore mutex = 1; //互斥(原子操作)Producer(item)
{P(empty); //檢測是否有可用資源并減1P(mutex);讀入in;將item寫入到in的位置上;V(mutex);V(full); //讓full的值增加
}Consumer()
{P(full); //檢測是否有內容P(mutex);讀入out;從文件中的out位置讀出到item;打印item;V(mutex);V(empty); //可用資源+1
}