Liệu lịch trình hợp tác có đình chỉ các quy trình khi họ thực hiện thao tác I / O không?


19

Nhiều tài liệu tham khảo hệ điều hành nói rằng với đa nhiệm (trái ngược với sự ưu tiên), một quy trình sẽ giữ CPU cho đến khi nó tự nguyện đình chỉ một cách rõ ràng. Nếu một quy trình đang chạy thực hiện một yêu cầu I / O không thể được thỏa mãn ngay lập tức (ví dụ: yêu cầu một hành trình phím chưa có sẵn), bộ lập lịch có tạm dừng nó không, hoặc nó có thực sự giữ CPU cho đến khi yêu cầu có thể được phục vụ không?

[Đã chỉnh sửa để thay thế "các khối trên i / o" bằng "thực hiện yêu cầu I / O không thể được thỏa mãn ngay lập tức."]


Câu hỏi này dường như yêu cầu các chi tiết cụ thể của các hệ điều hành, imho, sẽ không chính thức ở đây. Nếu đây không phải là trường hợp, xin vui lòng viết lại câu hỏi của bạn thành một câu hỏi trừu tượng hơn.
Raphael

3
Khi tôi đăng nó lên nhóm Unix, tôi được cho biết nó không phù hợp ở đó và thuộc về nơi này, điều mà tôi đồng ý, vì đó không phải là về một hệ điều hành cụ thể. Tôi nghĩ rằng điều này là tương đương với câu hỏi về dự đoán chi nhánh. Sẽ rất thú vị khi xem những gì cộng đồng quyết định về những gì là và không phù hợp ở đây.
Ellen Spertus

Câu trả lời:


15

Trong cài đặt thực sự "hợp tác" và nếu không có bảo vệ phần cứng, một quy trình chắc chắn có thể chặn I / O và không từ bỏ quyền kiểm soát cho đến khi hoàn thành I / O (hoặc không bao giờ từ bỏ quyền kiểm soát). Ví dụ, Windows 3.1 là cách này: nếu một quá trình người dùng muốn chiếm toàn bộ máy tính và ngăn mọi thứ khác chạy, thì có thể.

Nhưng trên một hệ thống có đa nhiệm, bạn mong đợi các lệnh I / O API hệ thống sẽ từ bỏ quyền kiểm soát bộ xử lý khi chúng được gọi. Vì vậy, khi một quy trình đang chạy chặn I / O, giả sử rằng quy trình sử dụng API hệ thống bình thường, các quy trình khác sẽ được phép chạy cho đến khi I / O hoàn tất, và cuối cùng quy trình ban đầu sẽ tiếp tục sau khi I / O hoàn tất . Nói cách khác, gọi một chức năng I / O chặn là một cách mà một quy trình trên hệ thống hợp tác có thể tự nguyện đình chỉ.


11

Nếu một quá trình đang chạy chặn trên i / o

Chặn trên IO khá nhiều tương đương với việc đình chỉ quá trình của bạn. Trong ngữ cảnh của hạt nhân linux, việc thực hiện một số lệnh gọi hệ thống IO như read()sẽ khiến sysentertrình xử lý bị gián đoạn hoặc kích hoạt để chăm sóc IO đó, do_sys_read()cuối cùng gọi . Ở đây, nếu yêu cầu hiện tại không thể được thỏa mãn ngay lập tức, thì hàm gọi sched()đó có thể thực thi một quy trình khác.

Trong ngữ cảnh của một hệ thống hợp tác, tôi mong đợi rằng khi bạn thực hiện một cuộc gọi hệ thống vì một số lý do IO, nếu yêu cầu không thể được thỏa mãn, nhân chọn một nhiệm vụ khác và thực hiện điều đó. Tài liệu này cung cấp một số nền tảng - về cơ bản, nếu bạn chờ đợi trên IO, bạn có thể bị treo mãi mãi chờ đợi IO đó. Ý tưởng về lập lịch hợp tác là bạn thường gọi sched()hoặc phương thức từ bỏ bình đẳng, nếu thực hiện các tác vụ đòi hỏi nhiều CPU.

Xem xét chế độ hạt nhân trở nên thú vị hơn. Trên các kiến ​​trúc nơi chúng có sẵn như các nền tảng nhúng nhất định , các trình xử lý ngắt vẫn sẽ được gọi để đáp ứng với các ngắt phần cứng hoặc phần mềm. Thông thường có thể, thực hiện khôn ngoan, để vô hiệu hóa xử lý ngắt , nhưng điều đó cũng có nhược điểm.


4

Trong cooperative multitaskingmô hình lập lịch hợp tác (tốt nhất là ), không có khái niệm về trình lập lịch theo nghĩa là hệ điều hành không có bất kỳ sự kiểm soát nào về quá trình chạy trong bao lâu.

Một ứng dụng được lập trình chính xác sẽ tự nguyện từ bỏ CPU trên I / O. Nhưng, các ứng dụng được viết xấu có thể cứ chờ I / O, do đó chặn các tiến trình khác.

PS: Cách tiếp cận này sau đó đã được hầu hết các HĐH từ bỏ để ủng hộ lập lịch ưu tiên (có một bộ lập lịch bên ngoài) và bây giờ chúng ta có tất cả các loại thuật toán lập lịch khác nhau được sử dụng bởi các HĐH khác nhau.

EDIT: Câu trả lời của tôi dựa trên lịch trình như được mô tả ở dạng ban đầu (năm trước: P). Như Gilles nhận xét một số hệ thống vẫn sử dụng lập kế hoạch hợp tác. Và có một lịch trình. Tôi không chắc những hệ thống đó có sử dụng COS ở dạng nguyên chất và nguyên bản hay không.


2
Nhiều hệ điều hành nhúng (bao gồm nhưng không giới hạn ở RTOS) có lịch trình hợp tác. Điều này không có nghĩa là không có lịch trình; bộ lập lịch là mã xác định luồng nào sẽ chạy tiếp theo. Ưu tiên là về lịch trình được nhập tự động trái ngược với yêu cầu của tác vụ đang chạy.
Gilles 'SO- ngừng trở thành ác quỷ'

@Gilles Bình luận đẹp (đưa vào chỉnh sửa). Tôi đồng ý với bạn rằng nó không hoàn toàn không sử dụng. Câu trả lời của tôi chỉ dựa trên thuật toán như được xác định ban đầu. AFIK, nó được sử dụng với một số sửa đổi (với một số lịch trình). Tôi không chắc chắn nếu nó được sử dụng ở dạng thuần túy trong một số hệ điều hành.
Ankit

4

Đa nhiệm hợp tác ngụ ý rằng một bối cảnh thực thi phải từ bỏ rõ ràng quyền kiểm soát đối với trình lập lịch biểu và nếu muốn, có thể ngăn chặn chuyển đổi ngữ cảnh xảy ra.

Hầu hết các triển khai thực hiện rõ ràng một chuyển đổi ngữ cảnh cho bất kỳ cuộc gọi hệ thống nào không trả về kịp thời và thường ngay cả khi chúng thực hiện, để tăng tính công bằng trong phân bổ bộ xử lý.

Thông thường chỉ có thể cho các quy trình không thành công (hoặc cố ý từ chối dịch vụ với phần còn lại của hệ thống) để ngăn chặn chuyển đổi tác vụ thường xuyên.

Pre-emption, như được giải thích bởi Gilles, là một hạn chế về kiến ​​trúc của hệ thống nhằm ngăn chặn sự gián đoạn theo thời gian của tác vụ đang hoạt động và các chuyển đổi ngữ cảnh bắt buộc.

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.