sẽ bị blocked và được đặt trong hàng đợi
semaphore
– Hàng đợi này là danh sách liên kết các PCB
Tác vụ signal() thường sử dụng cơ chế FIFO khi chọn một process từ hàng đợi và đưa vào hàng chọn một process từ hàng đợi và đưa vào hàng đợi ready
block() và wakeup() thay đổi trạng thái của process process
• block: chuyển từ running sang waiting • wakeup: chuyển từ waiting sang ready
Ví dụ sử dụng semaphore 1 : Hiện thực mutex với semaphore
Dùng cho n process
Khởi tạo S.value = 1
• Chỉ duy nhất một
process được vào CS (mutual exclusion)
Để cho phép k process vào CS, khởi tạo
S.value = k Shared data: semaphore mutex; /* initially mutex.value = 1 */ Process Pi: do { wait(mutex); critical section signal(mutex); remainder section } while (1);
Ví dụ sử dụng semaphore 2 :Đồng bộ process bằng semaphore
Hai process: P1 và P2
Yêu cầu: lệnh S1 trong P1 cần được thực thi trước lệnh S2 trong P2 Định nghĩa semaphore synch để đồng bộ Khởi động semaphore: synch.value = 0 Để đồng bộ hoạt động
theo yêu cầu, P1 phải định nghĩa như sau:
S1;signal(synch); signal(synch); Và P2 định nghĩa như sau: wait(synch); S2;
Nhận xét
Khi S.value ≥ 0: số process có thể thực thi wait(S) mà không bị blocked = S.value
Khi S.value < 0: số process đang đợi trên S là S.value
Atomic và mutual exclusion: không được xảy ra trường hợp 2 process cùng đang ở trong thân lệnh wait(S) và signal(S) (cùng semaphore S) tại một thời điểm (ngay cả với hệ thống multiprocessor)
⇒ do đó, đoạn mã định nghĩa các lệnh wait(S) và signal(S) cũng chính là vùng tranh chấp