Semaphores(信號)

在多核CPU下,且critial section占用時間短時,semaphores是很好的algorithm。
簡易理解:
會有個global variable(mutex)去決定執行critical section。
在多個processes在共用一個處理變數的空間(critical section)時,
寫兩個function,wait和signal,
傳mutex給wait去決定現在是否可使用critical section(單一資源,多個processes競爭的地方),
如果可以就直接執行,
如果不行,會在wait裡loop(busy waiting)(spinlock),直到收到signal break。
signal是正在使用critical section的process要離開時,給mutex設為1(mutex++)。
普通process執行

...
wait(mutex);

// critical section

signal(mutex);

// remainder section




wait(S){
	while(S<=0); /* busy waiting */
	S--;		     
}




signal(S){
	S++;		     
}




Busy waiting 有個問題,就是會消耗CPU的計算時間。
為了解決busy waiting 問題,
新增一個semaphore的結構

struct {
	int value;
	struct process *list;
}semaphore;

修改wait和signal。
在wait裡while改成判斷value是否小於0。如果是,該process加入list裡(使用queue),
並且呼叫block()保存現在process status(進入排程系統),
這樣用來處理正在waiting的process的CPU就可以拿來做其他事情。
signal裡加入wakeup(),來恢復process使用狀態。