Cách thực hành tốt nhất là không bỏ phiếu nhưng không bỏ phiếu xảy ra trong nội bộ khi một chủ đề gọi chờ ()?


13

Nói rằng chúng tôi có một số luồng muốn kiểm tra khi một luồng khác hoàn thành nhiệm vụ của nó. Tôi đã đọc rằng chúng ta nên gọi một hàm kiểu Wait () sẽ làm cho luồng này chờ cho đến khi nhận được thông báo rằng luồng khác đã kết thúc. Và điều này là tốt bởi vì nó có nghĩa là chúng tôi không thực hiện bỏ phiếu đắt tiền.

Nhưng dù sao thì việc bỏ phiếu diễn ra ở cấp thấp hơn? Tức là nếu chúng ta thực hiện luồng chờ () không phải là hạt nhân thực hiện bỏ phiếu dù sao để kiểm tra khi luồng khác kết thúc để sau đó nó có thể thông báo cho luồng đầu tiên?

Tôi đoán tôi đã bỏ lỡ điều gì đó ở đây, ai đó có thể khai sáng cho tôi không?

Câu trả lời:


28

Hệ điều hành cung cấp một số nguyên thủy nhất định cho loại giao tiếp liên tiến trình không yêu cầu bỏ phiếu.

Nếu tiến trình A đang chờ trên mutex M, HĐH sẽ biết A không thể chạy và đặt nó sang một bên trong một nhóm các tiến trình đang chờ điều gì đó xảy ra. Khi tiến trình giữ M giải phóng nó, HĐH sẽ xem danh sách các tiến trình đang chờ nó. Quá trình đầu tiên trong danh sách, có thể là A, được xóa khỏi nhóm nhàn rỗi và đưa vào hàng đợi chạy . Lần tiếp theo A nhận được một lát thời gian, sự chờ đợi () mà nó được gọi sẽ trở lại và chương trình tiếp tục.


Vì vậy, trong một cách nó đang bỏ phiếu nhưng ở cấp độ hệ điều hành?
tgkprog

7
Không có @tgkprog, đây không phải là bỏ phiếu, vì quá trình chờ đợi không được lên lịch để chạy cho đến khi HĐH hoặc quá trình khác giải phóng mutex. Một quá trình bỏ phiếu sẽ tiếp tục cạnh tranh trong việc lập lịch trình cpu để kiểm tra xem liệu nó có nên dừng chờ đợi hay không. Một quá trình bỏ phiếu kiểu này có thể đốt cháy một phần đáng kể thời gian của CPU trong khi nó chờ.
joshp

tôi có nghĩa là quá trình hệ điều hành bỏ phiếu trạng thái mutex. mặc dù tôi chắc chắn rằng nó được tối ưu hóa và tốt hơn bất cứ điều gì chúng ta có thể làm. có lẽ chạy như một phần của lịch trình.
tgkprog

4
@tgkprog: HĐH không chú ý một chút đến những gì đang xảy ra với một mutex cho đến khi quá trình giữ nó giải phóng nó hoặc chấm dứt. Một trong những sự kiện đó sẽ khiến HĐH đưa khóa mutex vào bất kỳ quy trình nào trước tiên trong danh sách chờ và đánh dấu quá trình đó là có thể chạy được. Không có cuộc bỏ phiếu liên quan, chỉ phản ứng với một sự kiện. Tất cả mọi thứ joshp nói được bao gồm bởi tài liệu tham khảo. :-)
Blrfl

2
@csss: Khá nhiều. Các quy trình có thể chấm dứt tự nguyện (ví dụ: gọi _exit(2)trên các hệ thống POSIX-y) hoặc không tự nguyện (ví dụ: một lỗi như chia cho 0 tạo ra một cuộc gọi ngắt hoặc một cái gì đó khác kill(2)). Trong cả hai trường hợp, quyền điều khiển được trao lại rõ ràng cho HĐH, trong đó biết quá trình nào đang chạy hoặc sẽ bị giết. Công việc kết thúc một quá trình bao gồm giải phóng tài nguyên của nó, bao gồm các trường hợp. Nếu một mutex được tổ chức bởi quy trình đã chết, HĐH sẽ phát hành nó. Nếu quy trình nằm trong danh sách chờ của mutex, nó sẽ bị xóa.
Blrfl
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.