Semaphore là một cơ chế đồng bộ hóa ở mức độ thấp (low-level):
- Sử dụng một biến có tên là semaphore mang giá trị khởi tạo là số nguyên không âm (có thể bằng 0) và được chia sẻ giữa những tác vụ (một tác vụ có thể là một tiến trình hoặc một tiểu trình).
- Có nhiệm vụ cho phép hoặc ngăn chặn việc truy xuất tài nguyên của các tác vụ.
Types of Semaphores
Có hai loại semaphore thường thấy là:
- Counting semaphore
- Binary semaphore
Counting Semaphore
Loại semaphore này sử dụng một biến đếm giúp kiểm soát việc truy xuất tài nguyên của tác vụ.
- Nếu biến đếm này có giá trị lớn hơn 0, tác vụ có thể truy xuất tài nguyên và giá trị của biến đếm sẽ giảm đi 1 (acquire).
- Sau khi tác vụ truy xuất tài nguyên, giá trị của biến đếm sẽ được tăng lên 1 (release).
Counting semaphore cho phép một số lượng nhất định các tác vụ có thể truy xuất tài nguyên cùng một lúc.

Nếu biến count có giá trị nhỏ hơn hoặc bằng 0 thì tác vụ sẽ không thể thực hiện truy xuất và cần phải chờ đến khi nào biến count có giá trị lớn hơn 0.
Binary Semaphore
Cũng sử dụng biến đếm như counting semaphore, nhưng giá trị của chúng chỉ dao động trong khoảng từ 0 đến 1.

Như vậy, binary semaphore chỉ cho phép duy nhất một tác vụ truy xuất tài nguyên ở một thời điểm nhất định.
Nói cách khác, khi một tác vụ truy xuất tài nguyên, nó sẽ “khóa” tài nguyên đó lại và không cho phép các tác vụ khác truy xuất. Sau khi kết thúc truy xuất, tài nguyên sẽ được “mở khóa”.
Wait and Signal Operations
Hai hàm wait (hay P hoặc acquire) và signal (hay V hoặc release) của semaphore được sử dụng để triển khai đồng bộ hóa.
- Hai hàm này được sử dụng trong trường hợp ta cần truy xuất các tài nguyên dùng chung và cần đảm bảo rằng chỉ có một hoặc một số tác vụ được truy xuất các tài nguyên đó.
- Cụ thể hơn, hai hàm này thường được sử dụng để lập trình song song ở trong hệ điều hành hoặc các chương trình đa luồng.
Wait Operation
Hàm wait giúp khóa lại tài nguyên nhằm đảm bảo chỉ có một số tác vụ (trong trường hợp counting semaphore) hoặc chỉ duy nhất một tác vụ (trong trường hợp binary semaphore) có thể truy xuất tài nguyên đó.
Cụ thể hơn, hàm wait giúp giảm giá trị của semaphore. Nếu giá trị của semaphore giảm xuống nhỏ hơn hoặc bằng 0, tác vụ sẽ bị chặn lại và không thể truy xuất tài nguyên.
void wait(int &s) {
while (s<=0);
s--;
}Signal Operation
Hàm signal giúp giải phóng tài nguyên và đánh thức các tác vụ bị ngăn chặn bởi hàm wait.
Ngược lại với wait, hàm signal giúp tăng giá trị của semaphore. Nếu giá trị của semaphore lớn hơn 0, tác vụ có thể truy xuất tài nguyên.
void signal(int &s) {
while(s>=0);
s++;
}Counting Semaphore Vs Binary Semaphore
So sánh giữa counting semaphore và binary semaphore:
| Counting Semaphore | Binary Semaphore |
|---|---|
| Không có truy xuất độc quyền | Có truy xuất độc quyền |
| Biến semaphore mang giá trị số nguyên | Biến semaphore chỉ mang giá trị 0 hoặc 1 |
| Có thể có nhiều tác vụ được truy xuất tài nguyên | Chỉ có một tác vụ được truy xuất tài nguyên |
Chúng ta có thể làm cho counting semaphore đảm bảo được tính truy xuất độc quyền bằng cách khởi tạo giá trị của biến semaphore là 1 để nó trở thành binary semaphore.