Yêu cầu phối hợp (Synchronization): các tiến trình cần hợp tác với nhau để hồn thành cơng việc Ví dụ chương trình in xuất kí tự vào buffer, kí tựđược lấy và in bởi chương trình điều khiển

Một phần của tài liệu Giáo trình tổng quan về DHD (Trang 67)

- Đọc/Ghi ngày, tháng, năm

b/ Yêu cầu phối hợp (Synchronization): các tiến trình cần hợp tác với nhau để hồn thành cơng việc Ví dụ chương trình in xuất kí tự vào buffer, kí tựđược lấy và in bởi chương trình điều khiển

máy in (printer driver). Hai tiến trình này phải phối hợp với nhau như là chương trình in khơng được xuất kí tự vào buffer khi buffer đầy mà phải chờ printer driver lấy bớt dữ liệu.

Từ hai yêu cầu trên, ta cĩ hai “bài tốn đồng bộ” cần giải quyết đĩ là bài tốn “độc quyền truy xuất” (hay cịn gọi là “bài tốn miền găng”) và bài tốn “phối hợp thực hiện”.

3.4.2. Miền găng (critical section)

Đoạn mã của một tiến trình cĩ khả năng xảy ra lỗi khi truy xuất tài nguyên dùng chung (biến, tập tin,…) được gọi là miền găng.

Ví dụ giả sử cĩ hai tiến trình P1 và P2 sử dụng vùng nhớ dùng chung lưu trữ biến taikhoan. Mỗi tiến trình muốn rút một khoản tiền là tienrut từ tài khoản bằng đoạn mã sau:

if (taikhoan >= tienrut) taikhoan = taikhoan - tienrut; else Thong bao “khong the rut tien ! “;

Giả sử tài khoản hiện cịn 800, P1 muốn rút 500 và P2 muốn rút 400, cĩ thể xảy ra tình huống lỗi như sau: giả sử P1 sau khi đã kiểm tra điều kiện (800 >=500) là đúng, P1 hết thời gian sử dụng CPU, hệđiều hành cấp phát CPU cho P2, P2 kiểm tra điều kiện (800>=400) cũng vẫn đúng, biến taikhoan được cập nhật lại là 400. Khi P1 được tiếp tục xử lý, nĩ sẽ khơng kiểm tra lại điều kiện (taikhoan>= tienrut) mà thực hiện rút tiền, giá trị của biến taikhoan sẽ cập nhật thành -100 ! Đoạn mã:

if (taikhoan >= tienrut ) taikhoan = taikhoan - tienrut; gọi là một miền găng.

Ví dụ hai tiến trình chạy trên hai bộ xử lý, cùng ghi dữ liệu vào một hàng đợi dùng chung, sẽ xảy ra lỗi trong trường hợp sau: tiến trình A thêm dữ liệu vào hàng đợi tại vị trí tail (tail là vị trí cất dữ liệu) nhưng chưa kịp tăng tail thì hết quantum và đến lượt tiến trình B xử lý, tiến trình B thêm dữ liệu tại vị trí tail và như vậy sẽ ghi chồng lên dữ liệu do tiến trình A vừa ghi, lỗi xảy ra!

Cĩ thể giải quyết lỗi nếu bảo đảm tại một thời điểm chỉ cĩ một tiến trình được xử lý lệnh trong miền găng, nghĩa là tại một thời điểm chỉ cĩ một tiến trình truy xuất tài nguyên dùng chung.

Hình 3.27: Khi A trong miền găng thì nếu B muốn vào miền găng , B sẽ bị khố chờ A ra khỏi miền găng, B mới được vào miền găng.

* Khi giải quyết bài tốn miền găng cần chú ý 4 điều kiện sau:

a/ Khơng cĩ hai tiến trình cùng ở trong miền găng cùng lúc.

b/ Khơng cĩ giả thiết về tốc độ của các tiến trình, cũng như về số lượng bộ xử lý.

c/ Một tiến trình bên ngồi miền găng khơng được ngăn cản các tiến trình khác vào miền găng. d/ Khơng cĩ tiến trình nào phải chờ vơ hạn đểđược vào miền găng.

3.4.3 Các giải pháp đồng bộ

Cĩ 5 nhĩm giải pháp để giải quyết “bài tốn đồng bộ” là: Busy Waiting, Sleep And Wakeup, Semaphore, Monitor, Message.

3.4.3.1 Nhĩm giải pháp Busy Waiting (bận thì đợi)

Nhĩm giải pháp “Busy Waiting” lại chia thành hai loại: các giải pháp “sử dùng phần mềm” và các giải pháp “sử dùng phần cứng”.

Một phần của tài liệu Giáo trình tổng quan về DHD (Trang 67)