BẾ TẮC (DEADLOCK) VÀ CHỐNG BẾ TẮC

Một phần của tài liệu Nguyên cứu tìm hiểu về quản lý tiến trình trong hệ Điều hành windows (Trang 29 - 33)

Tất cả hiện tượng bế tắc đều bắt nguồn từ sự xungđột về tài nguyên của hai hoặc nhiều tiến trình đang hoạt động đồng thời trên hệ thống. Tài nguyên ở đây có thể là một ổ đĩa, một record trong cơ sở dữ liệu, hay một không gian địa chỉ trên bộ nhớ chính. Sau đây là một số ví dụ để minh hoạ cho điều trên.

Bế tắc thường xảy ra do xung đột về tài nguyên thuộc loại không phân chia được, một số ít trường hợp xảy ra với tài nguyên phân chia được. Ví dụ sau đây là trường hợp bế tắc do xung đột về tài nguyên bộ nhớ, là tài nguyên thuộc loại phân chia được.

Hình 8: Chờ đợi vòng tròn

Như vậy bế tắc là hiện tượng: Trong hệ thống xuấthiện một tập các tiến trình, mà mỗi tiến trình trong tập này đều chờ được cấp tài nguyên, mà tài nguyên đó đang được một tiến trình trong tập này chiếm giữ. Và sự đợi này có thể kéo dài vô hạn nếu không có sự tác động từ bên ngoài.

3.2. Điều kiện để hình thành bế tắc:

Năm 1971, Coffman đã đưa ra và chứng tỏ được rằng, nếu hệ thống tồn tại đồng thời bốn điều kiện sau đây thì hệ thống sẽ xảy ra bế tắc:

1. Loại trừ lẫn nhau (mutual exclusion) hay độc quyền sử dụng: Đối với các tài nguyên không phân chia được thì tại mỗi thời điểm chỉ có một tiến trình

tài nguyên R2

Yêu cầu Giữ

Giữ Yêu cầu

tài nguyên R1

Process P2

Process P1

25

sử dụng được tài nguyên.

2. Giữ và đợi (hold and wait): Một tiến trình hiện tại đang chiếm giữ tài nguyên, lại xin cấp phát thêm tài nguyên mới.

3. Không ưu tiên (No preemption): Không có tài nguyên nào có thể được giải phóng từ một tiến trình đang chiếm giữ nó.

4. Đợi vòng tròn (Circular wait): Đây là trường hợp của ví dụ 1 mà chúng ta đã nêu ở trên. Tức là, mỗi tiến trình đang chiếm giữ tài nguyên mà tiến trình khác đang cần.

Sự bế tắc có thể tồn tại với ba điều kiện đầu tiên, nhưng cũng có thể không xảy ra chỉ với 3 điều kiện đó. Để chắc chắn bế tắc xảy ra cần phải có điều kiện thứ tư.

Ba điều kiện đầu là điều kiện cần chứ không phải là điều kiện đủ để xảy ra bế tắc.

Điều kiện thứ tư là kết quả tất yếu từ ba điều kiện đầu.

3.3. Ngăn chặn bế tắc (Deadlock Prevention):

Ngăn chặn bế tắc là thiết kế một hệ thống sao cho hiện tượng bế tắc bị loại trừ.

Các phương thức ngăn chặn bế tắc đều tập trung giải quyết bốn điều kiện gây ra bế tắc, sao cho hệ thống không thể xảy ra đồng thời bốn điều kiện bế tắc:

1. Đối với điều kiện độc quyền: Điều kiện này gần như không tránh khỏi, vì sự độc quyền là cần thiết đối với tài nguyên thuộc loại phân chia được như các biến chung, các tập tin chia sẻ, hệ điều hành cần phải hỗ trợ sự độc quyền trên các tài nguyên này. Tuy nhiên, với những tài nguyên thuộc loại không phân chia được hệ điều hành có thể sử dụng kỹ thuật SPOOL (Simultaneous Peripheral Operation Online) để tạo ra nhiều tài nguyên ảo cung cấp cho các tiến trình đồng thời.

2. Đối với điều kiện giữ và đợi: Điều kiện này có thể ngăn chặn bằng cách yêu cầu tiến trình yêu cầu tất cả tài nguyên mà nó cần tại một thời điểm và tiến trình sẽ bị khoá (blocked) cho đến khi yêu cầu tài nguyên của nó được hệ điều hành đáp ứng.

Phương pháp này không hiệu quả.

3. Đối với điều kiện No preemption: Điều kiện này có thể ngăn chặn bằng cách, khi tiến trình bị rơi vào trạng thái khoá, hệ điều hành có thể thu hồi tài nguyên của tiến

26

trình bị khoá để cấp phát cho tiến trình khác và cấp lại đầy đủ tài nguyên cho tiến trình khi tiến trình được đưa ra khỏi trạng thái khóa.

4. Đối với điều kiện chờ đợi vòng tròn: Điều kiện này có thể ngăn chặn bằng cách phân lớp tài nguyên của hệ thống. Theo đó, nếu một tiến trình được cấp phát tài nguyên ở lớp L, thì sau đó nó chỉ có thể yêu cầu các tài nguyên ở lớp thấp hơn lớp L.

3.4. Nhận biết bế tắc (Deadlock detection):

Các phương thức ngăn chặn bế tắc ở trên đều tập trung vào việc hạn chế quyền truy xuất đến tài nguyên và áp đặt các ràng buộc lên các tiến trình. Điều này có thể ảnh hưởng đến mục tiêu khai thác hiệu quả tài nguyên của hệ điều hành, ngăn chặn độc quyền trên tài nguyên là một ví dụ, hệ điều hành phải cài đặt các cơ chế độc quyền để bảo vệ các tài nguyên chia sẻ. Và như đã phân tích ở trên việc cấp phát tài nguyên một lần cho các tiến trình để ngăn chặn hiện tượng hold and wait cũng tồn tại một vài hạn chế.

Các hệ điều hành có thể giải quyết vấn đề bế tắc theo hướng phát hiện bế tắc để tìm cách thoát khỏi bế tắc. Phát hiện bế tắc không giới hạn truy xuất tài nguyên và không áp đặt các ràng buộc lên tiến trình. Với phương thức phát hiện bế tắc, các yêu cầu cấp phát tài nguyên được đáp ứng ngay nếu có thể. Để phát hiện bế tắc hệ điều hành thường cài đặt một thuật toán để phát hiện hệ thống có tồn tại hiện tượng chờ đợi vòng tròn hay không.

Việc kiểm tra, để xem thử hệ thống có khả năng xảy ra bế tắc hay không có thể được thực hiện liên tục mỗi khi cómột yêu cầu tài nguyên, hoặc chỉ thực hiện thỉnh thoảng theo chu kỳ, phụ thuộc vào sự bế tắc xảy ra như thế nào. Việc kiểm tra bế tắc mỗi khi có yêu cầu tài nguyên sẽ nhận biết được khả năng xảy ra bế tắc nhanh hơn, thuật toán được áp dụng đơn giản hơn vì chỉ dựa vào sự thay đổi trạng thái của hệ thống. Tuy nhiên, hệ thống phải tốn nhiều thời gian cho mỗi lần kiểm tra bế tắc.

Mỗi khi bế tắc được phát hiện, hệ điều hành thực hiện một vài giải pháp để thoát khỏi bế tắc. Sau đây là một vài giải pháp có thể:

27

- Thoát tất cả các tiến trình bị bế tắc. Đây là một giải pháp đơn giản nhất, thường được các hệ điều hành sử dụng nhất.

- Sao lưu lại mỗi tiến trình bị bế tắc tại một vài điểm kiểm tra được định nghĩa trước, sau đó khởi động lại tất cả các tiến trình.

- Giải pháp này yêu cầu hệ điều hành phải lưu lại các thông tin cần thiết tại điểm dừng của tiến trình, đặc biệt là con trỏ lệnh và các tài nguyên tiến trình đang sử dụng, để có thể khởi động lại tiến trình được. Giải pháp này có nguy cơ xuất hiện bế tắc trở lại là rất cao, vì khi tất cả các tiến trình đều được reset trở lại thì việc tranh chấp tài nguyên là khó tránh khỏi. Ngoài ra hệ điều hành thường phải chi phí rất cao cho việc tạm dừng và tái kích hoạt tiến trình.

- Chỉ kết thúc một tiến trình trong tập tiến trình bị bế tắc, thu hồi tài nguyên của tiến trình này, để cấp phát cho một tiến trình nào đó trong tập tiến trình bế tắc để giúp tiến trình này ra khỏi bế tắc, rồi gọi lại thuật toán kiểm tra bế tắc để xem hệ thống đã ra khỏi bế tắc hay chưa, nếu rồi thì dừng, nếu chưa thì tiếp tục giải phóng thêm tiến trình khác. Và lần lượt như thế cho đến khi tất cả các tiến trình trong tập tiến trình bế tắc đều ra khỏi tình trạng bế tắc. Trong giải pháp này vấn đề đặt ra đối với hệ điều hành là nên chọn tiến trình nào để giải phóng đầu tiên và dựa vào tiêu chuẩn nào để chọn lựa sao cho chi phí để giải phóng bế tắc là thấp nhất.

- Tập trung toàn bộ quyền ưu tiên sử dụng tài nguyên cho một tiến trình, để tiến trình này ra khỏi bế tắc, và rồi kiểm tra xem hệ thống đã ra khỏi bế tắc hay chưa, nếu rồi thì dừng lại, nếu chưa thì tiếp tục. Lần lượt như thế cho đến khi hệ thống ra khỏi bế tắc. Trong giải pháp này hệ điều hành phải tính đến chuyện tái kích hoạt lại tiến trình sau khi hệ thống ra khỏi bế tắc.

Đối với các giải pháp 3 và 4, hệ điều hành dựa vào các tiêu chuẩn sau đây để chọn lựa tiến trình giải phóng hay ưu tiên tài nguyên: Thời gian xử lý ít nhất; Thời gian cần processor còn lại ít nhất; Tài nguyên cần cấp phát là ít nhất; Quyền ưu tiên là thấp nhất.

28

Một phần của tài liệu Nguyên cứu tìm hiểu về quản lý tiến trình trong hệ Điều hành windows (Trang 29 - 33)

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

(52 trang)