Tại sao trạng thái không an toàn không phải lúc nào cũng gây ra bế tắc?


10

Tôi đang đọc Hệ điều hành của Galvin và tình cờ thấy dòng dưới đây,

Tuy nhiên, không phải tất cả các trạng thái không an toàn là bế tắc. Một trạng thái không an toàn có thể dẫn đến bế tắc

Ai đó có thể vui lòng giải thích làm thế nào bế tắc! = Trạng thái không an toàn ? Tôi cũng bắt được dòng tương tự ở đây

Nếu một chuỗi an toàn không tồn tại, thì hệ thống ở trạng thái không an toàn, điều này có thể dẫn đến bế tắc. (Tất cả các trạng thái an toàn là bế tắc miễn phí, nhưng không phải tất cả các trạng thái không an toàn đều dẫn đến bế tắc.)


1
Bế tắc có thể là một khái niệm tương tự như một điều kiện cuộc đua xảy ra không liên tục. mã không an toàn chỉ kích hoạt bế tắc khi một chuỗi cụ thể xuất hiện. chuỗi đó có thể "xảy ra bất cứ lúc nào" hay còn gọi là "tai nạn đang chờ xảy ra" ...
vzn

Nhà nước không an toàn có nghĩa là, về mặt lý thuyết có khả năng bế tắc. bế tắc có thể xảy ra khi một số điều cụ thể xảy ra. Đối với trạng thái an toàn, không có vấn đề gì xảy ra, không thể có bế tắc.
nishantbhardwaj2002

1
Vì những lý do chính xác giống nhau mà bất kỳ tình huống nguy hiểm nào (trong cuộc sống thực) không phải lúc nào cũng gây ra những điều tồi tệ thực sự xảy ra.
David Richerby

Câu trả lời:


14

Bế tắc có nghĩa là một cái gì đó cụ thể: có hai (hoặc nhiều) quá trình hiện đang bị chặn chờ nhau.

Trong trạng thái không an toàn, bạn cũng có thể rơi vào tình huống có thể xảy ra bế tắc trong tương lai, nhưng điều đó chưa xảy ra vì một hoặc cả hai quá trình chưa thực sự bắt đầu chờ đợi.

Hãy xem xét ví dụ sau:

Process A                  Process B
lock X                     lock Y           # state is "unsafe"
                           unlock Y
lock Y                                      # state is back to "safe" (no deadlock this time.  We got lucky.)

Có một ví dụ thú vị hơn trong Phần 7.5.1 của liên kết bạn đã đưa ra :

Hãy xem xét một hệ thống có 12 ổ băng với:

Process       Max Need       Current
P0:             10              5
P2:              9              3

Đây là một trạng thái không an toàn. Nhưng chúng ta không rơi vào bế tắc. Chỉ có 4 ổ đĩa miễn phí, vì vậy, ví dụ, nếu P0 không yêu cầu thêm 5, và P2 không yêu cầu thêm 1, chúng ta sẽ bế tắc, nhưng nó chưa xảy ra. Và P0 có thể không yêu cầu thêm ổ đĩa, nhưng thay vào đó có thể giải phóng các ổ đĩa mà nó đã có. Các Max needkết thúc tất cả thực hiện tốt các chương trình, và sức mạnh đây không phải là một trong những hành nơi chúng tôi cần tất cả 10 ổ đĩa trong P0.


Cảm ơn ông rất nhiều! và tôi ghét sách giáo khoa không rõ ràng của tôi ...
Ning

Nhưng tôi cũng có một số câu hỏi: (1) Bạn đã nói ["] Nhu cầu tối đa là trên tất cả các lần thực thi có thể có của chương trình [."] , Nhưng bạn cũng đã nói ["] nếu P0 yêu cầu thêm 5 và P2 không yêu cầu thêm 1, chúng ta sẽ bế tắc [. "] , trong đó (1) có nghĩa là nếu Max Need không đạt được thì có thể có bế tắc, trong khi (2) có nghĩa là phải bế tắc khi không đạt được?
Ning

Là lập luận của tôi đúng ?: Nếu P2 không yêu cầu thêm 1 và nó kết thúc , sau đó các băng miễn phí trở thành (4 + 3 = 7), và kể từ P1 yêu cầu thêm 5 sau đó nó có thể đạt được, vì vậy không bế tắc. Nhưng nếu P2 không kết thúc, thì bế tắc xảy ra kể cả khi P1 chỉ cần 5 để kết thúc, vẫn là 4 <5.
Ning

Đối với ví dụ cuối cùng: P0 yêu cầu thêm 5, sau đó 5 + 5 + 3 = 13> 12, vì vậy P0 phải đợi P2, để tạo bế tắc, hãy để P2 yêu cầu thêm.
Bit_hcAlacticm

7

Chỉ để giải thích những gì Logic lang thang đang nói.

Nói rằng tôi có hai luồng mà cả hai đều cần truy cập vào X và Y, và không có đồng bộ hóa và không có cơ chế để sửa lỗi bế tắc. Điều này không an toàn, vì người ta có thể khóa X và người Y khác và sau đó không thể tiến hành. Nhưng nó không được đảm bảo.

Thread 1                    Thread 2
Lock X                      
Lock Y
OS Interrupts Thread 1 and passes control to Thread 2
                            Unable to lock needed resources.
OS Interrupts Thread 2 and passes control to Thread 1
Unlock X                    
Unlock Y                    
                            Lock Y
                            Lock X
 ....

Kịch bản này đã không kết thúc trong bế tắc, nhưng nó có thể có. Do cách phân luồng hoạt động, không có luồng được thiết lập. HĐH kiểm soát luồng và do đó nó có thể xảy ra như sau:

Thread 1                    Thread 2
Lock X        
OS Interrupts Thread 1 and passes control to Thread 2
                            Lock Y              
DEADLOCK Thread 1 needs Y, Thread 2 needs X. Neither knows to back down and simply waits.

1

Trạng thái an toàn là bế tắc miễn phí, nhưng nếu bạn không thể thực hiện tất cả các yêu cầu để ngăn chặn bế tắc thì điều đó có thể xảy ra. Ví dụ: nếu hai luồng có thể rơi vào bế tắc khi chúng bắt đầu luồng A, sau đó là luồng B, nhưng khi chúng bắt đầu ngược lại (B, A) thì chúng sẽ hoạt động tốt - hãy giả sử B là đẹp hơn;) Trạng thái của hệ thống không an toàn, nhưng với chuỗi khởi đầu may mắn, nó sẽ hoạt động. Không bế tắc, nhưng nó có thể. Nếu bạn cũng đồng bộ hóa chúng bằng tay - bắt đầu theo thứ tự tốt - thật nguy hiểm - vì một số lý do chúng có thể không được kích hoạt như bạn muốn - hệ thống vẫn không an toàn (vì có thể bị bế tắc) nhưng khả năng đó là thấp. Trong trường hợp một số sự kiện bên ngoài như đóng băng chủ đề hoặc gián đoạn sau khi tiếp tục, nó sẽ thất bại.

Bạn phải nhận ra - trạng thái an toàn là điều kiện đủ để tránh bế tắc, nhưng không an toàn chỉ là điều kiện cần thiết. Ngay bây giờ thật khó để viết mã ra khỏi đầu, nhưng tôi có thể tìm kiếm một số. Tôi đã gặp mã trong Ada rằng hơn 99/100 lần nó hoạt động hoàn hảo trong vài tuần (và sau đó dừng lại do máy chủ khởi động lại không bế tắc) nhưng thỉnh thoảng nó bị sập sau vài giây ở trạng thái bế tắc.

Hãy để tôi thêm một số ví dụ dễ dàng bằng cách so sánh với phép chia: Nếu hàm của bạn chia c / d và trả về kết quả, mà không kiểm tra xem d có bằng 0 hay không, có thể có chia cho lỗi không, vì vậy mã không an toàn (cùng tên dự định), nhưng cho đến khi bạn thực hiện phân chia như vậy, mọi thứ đều ổn, nhưng sau khi mã phân tích lý thuyết không an toàn và có thể rơi vào hành vi không xác định không được xử lý đúng cách.


0

Dưới đây là sự hiểu biết của tôi về điều này (vui lòng sửa cho tôi nếu tôi sai): (A) Nếu bế tắc, có nghĩa là tồn tại một chu kỳ (một trong những điều kiện cần thiết) (B) Một chu kỳ là điều kiện bắt buộc cho bế tắc (cho cả đơn và đa tài nguyên cá thể)

Vì vậy, bây giờ chúng ta có thể chứng minh rằng tồn tại một chu kỳ có thể không dẫn đến bế tắc, trạng thái không an toàn với chu kỳ Bạn có thể thấy ở đây một chu trình tồn tại có nghĩa là một trạng thái không an toàn được tìm thấy, nhưng điều này có thể không dẫn đến bế tắc vì tài nguyên R2 đang tham gia vào chu kỳ có thể phá vỡ quay vòng ngay khi quá trình P3 kết thúc và giải phóng nó (hãy nhớ rằng P3 không có bất kỳ sự phụ thuộc nào hoặc chờ đợi bất kỳ tài nguyên nào khác).


2
Chào mừng đến với trang web! Một điểm nhỏ: tốt nhất là tránh cụm từ "có thể không" bằng tiếng Anh viết, vì không rõ nó có nghĩa là "không được" ("Bạn có thể không đỗ xe ở đây") hoặc "có thể không" ("Bạn có thể không thích bộ phim này . ")
David Richerby

0

Trạng thái không an toàn tầm thường: Chủ đề 1 lấy khóa A, sau đó khóa B, sau đó mở khóa cả hai. Chủ đề 2 lấy khóa B, sau đó khóa A, sau đó mở khóa cả hai.

Điều này sẽ chỉ dẫn đến bế tắc nếu Chủ đề 2 lấy khóa B ngay giữa Chủ đề 1 lấy khóa A và cố gắng khóa B hoặc Chủ đề 1 mất khóa A ngay giữa Chủ đề 2 lấy khóa B và cố gắng khóa A.

Nếu Chủ đề 1 và Chủ đề 2 thực hiện việc này một cách ngẫu nhiên mỗi giờ một lần và có một khoảng cách thời gian là micro giây sẽ thực sự dẫn đến bế tắc. điều này có thể chạy rất lâu trong tay khách hàng cho đến khi cuối cùng bạn gặp bế tắc một cách tình cờ.

Đi qua một con phố với đôi mắt nhắm nghiền. Nó không an toàn. Nhưng bạn không luôn luôn bị giết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.