Block() và wakeup() thay đổi trạng thái của process

Một phần của tài liệu Liên lạc giữa các tiến trình trong HDH (Trang 37 - 41)

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

Một phần của tài liệu Liên lạc giữa các tiến trình trong HDH (Trang 37 - 41)

Tải bản đầy đủ (PPT)

(65 trang)