Các cuộc gọi poll
và select
(đề cập bởi Basile trong câu trả lời) là cách chính xác để chờ yêu cầu, tùy theo hoàn cảnh. Trên các hệ điều hành không có poll
hoặc select
, sẽ có điều gì đó tương tự.
Không sleep
, YieldProcessor
và sched_yield
là những cách thích hợp để thực hiện việc này vì những lý do sau.
YieldProcessor
và sched_yield
chỉ đơn thuần là di chuyển quá trình đến cuối hàng đợi có thể chạy được nhưng để nó chạy được. Hiệu ứng là chúng cho phép các quá trình khác có cùng mức ưu tiên hoặc cao hơn để thực hiện, nhưng khi các quá trình đó được thực hiện (hoặc nếu không có), thì quá trình gọi là YieldProcessor
hoặc sched_yield
tiếp tục chạy. Điều này gây ra hai vấn đề. Một là các quy trình ưu tiên thấp hơn vẫn sẽ không chạy. Khác là điều này làm cho bộ vi xử lý luôn chạy, sử dụng năng lượng. Chúng tôi muốn hệ điều hành nhận ra khi không có quá trình nào cần chạy và đưa bộ xử lý vào trạng thái công suất thấp.
sleep
có thể cho phép trạng thái năng lượng thấp này, nhưng nó chơi trò chơi đoán sẽ kéo dài bao lâu cho đến khi yêu cầu tiếp theo đến, bộ xử lý sẽ liên tục xử lý khi không cần thiết. yêu cầu, vì quá trình sẽ tiếp tục ngủ cho đến khi hết thời gian yêu cầu ngay cả khi có yêu cầu được phục vụ.
Cuộc gọi poll
và select
được thiết kế cho chính xác tình huống này. Họ nói với hệ điều hành rằng quá trình này muốn phục vụ một yêu cầu đến trên một trong các kênh I/O của nó nhưng nếu không thì không có việc phải làm. Điều này cho phép hệ điều hành đánh dấu quá trình này là không chạy được và đặt bộ xử lý ở trạng thái công suất thấp nếu thích hợp.
Sử dụng semaphore cung cấp cùng một hành vi, ngoại trừ tín hiệu đánh thức quá trình đến từ quá trình khác nâng cao semaphore thay vì hoạt động phát sinh trong kênh I/O. Semaphores là phù hợp khi tín hiệu để làm một số công việc đến theo cách này; chỉ cần sử dụng bất kỳ số nào của poll
hoặc semaphore phù hợp hơn với hoàn cảnh của bạn.
Những lời chỉ trích rằng poll
, select
hoặc semaphore khiến cuộc gọi chế độ hạt nhân không liên quan, vì các phương pháp khác cũng gây ra các cuộc gọi chế độ hạt nhân. Một quá trình không thể tự mình ngủ được; nó phải gọi hệ điều hành để yêu cầu nó. Tương tự, YieldProcessor
và sched_yield
yêu cầu hệ điều hành.
Nguồn
2012-12-03 14:34:12
Ngủ báo cho trình lập lịch biểu thực hiện một số quy trình khác chạy trên CPU thay vì quy trình của bạn trong một khoảng thời gian cụ thể (quá đơn giản). Chương trình của bạn sẽ không tiêu tốn bất kỳ tài nguyên CPU nào khi đang ngủ. Ngay cả khi ngủ chỉ trong vài mili giây làm cho mọi thứ trôi chảy trong một vòng lặp vô tận như bạn đã thể hiện nó. –
Nếu bạn đang * nghe * thì bạn nên sử dụng một số syscall ghép kênh như 'poll (2)' (hoặc cũ hơn, gần như lỗi thời, 'select (2)') –