40

Gần đây tôi đã bắt đầu tìm hiểu cách CPU và hệ điều hành hoạt động như thế nào, và tôi hơi nhầm lẫn về hoạt động của một máy CPU đơn với một hệ điều hành cung cấp đa nhiệm.Bộ lập lịch hệ điều hành lấy lại quyền kiểm soát CPU như thế nào?

Như vậy, giả sử máy của tôi có một CPU, điều này có nghĩa là, tại bất kỳ thời điểm nào, chỉ có một quy trình có thể chạy.

Bây giờ, tôi chỉ có thể giả định rằng lịch trình được hệ điều hành sử dụng để kiểm soát truy cập vào thời gian CPU quý giá cũng là một quá trình.

Do đó, trong máy này, quy trình người dùng hoặc quá trình lập lịch biểu đang chạy tại bất kỳ thời điểm nào, nhưng không phải cả hai.

Vì vậy, đây là một câu hỏi:

Khi lên lịch từ bỏ quyền kiểm soát của CPU để quá trình khác, làm thế nào nó có thể lấy lại thời gian CPU để chạy bản thân một lần nữa để làm công việc lập kế hoạch của mình? Tôi có nghĩa là, nếu bất kỳ quy trình nhất định hiện đang chạy không từ bỏ (năng suất) CPU, làm thế nào có thể lịch trình chính nó bao giờ chạy một lần nữa và đảm bảo đa nhiệm thích hợp? Cho đến nay, tôi đã suy nghĩ, nếu quá trình người dùng yêu cầu một hoạt động I/O thông qua một cuộc gọi hệ thống, sau đó trong cuộc gọi hệ thống, chúng tôi có thể đảm bảo lịch trình được phân bổ một số thời gian CPU một lần nữa. Nhưng tôi thậm chí không chắc chắn nếu điều này hoạt động theo cách này. Mặt khác, nếu quá trình người dùng được đề cập vốn đã bị ràng buộc CPU, thì từ quan điểm này, nó có thể chạy mãi mãi, không bao giờ cho phép các quá trình khác, thậm chí không chạy bộ lập lịch lại.

Giả sử tính năng lập lịch trình theo thời gian, tôi không biết làm cách nào mà trình lập lịch có thể cắt thời gian để thực hiện quá trình khác, khi nó không chạy?

Tôi thực sự đánh giá cao bất kỳ thông tin chi tiết hoặc tham chiếu nào mà bạn có thể cung cấp trong lĩnh vực này.

+3

tôi ước gì tôi có thể upvote câu hỏi này đủ cứng. Tôi bắt đầu học những khái niệm tương tự như bạn đã làm và đối mặt với những câu hỏi rất giống nhau. Công cụ này nên được cùng với những điều cơ bản của cpu và os thiết kế trong sách và bài viết của chúng tôi. Cảm ơn vì đã đăng tải điều này! –

Trả lời

36

Hệ điều hành thiết lập bộ hẹn giờ phần cứng (Programmable interval timer hoặc PIT) tạo ra ngắt mỗi N mili giây. Việc ngắt được gửi tới hạt nhân và mã người dùng bị gián đoạn.

Nó hoạt động giống như mọi phần cứng khác bị gián đoạn. Ví dụ đĩa của bạn sẽ buộc một chuyển đổi đến hạt nhân khi nó đã hoàn thành một IO.

+8

Đây là câu trả lời đúng. Nhưng ví dụ, khi lập trình cho windows 98 trong các hệ thống cũ hơn, các lập trình viên phải gọi lệnh 'yield()' một cách rõ ràng. Nếu không, không quá trình nào khác có thể lấy lại quyền kiểm soát CPU một lần nữa, điều này cuối cùng sẽ làm hỏng hệ thống. – MatijaSh

+0

Nếu bạn đã đề cập đến các ngắt IO quan trọng trước tiên, tôi sẽ thêm một điểm khác. –

+3

@MatijaSh Windows 98 chắc chắn không yêu cầu điều đó. – jalf

4

Để bổ sung cho câu trả lời @ usr của, trích dẫn từ Understanding the Linux Kernel:

Lịch trình() Chức năng

lịch() thực hiện các lịch trình. Mục tiêu của nó là tìm một quy trình trong danh sách runqueue và sau đó gán CPU cho nó. Nó là được gọi, trực tiếp hoặc theo một cách lười biếng, bởi một số thói quen hạt nhân. [...]

gọi Lazy

Scheduler cũng có thể được gọi một cách lười biếng bằng cách thiết lập lĩnh vực need_resched của [quá trình] hiện đến 1.Vì kiểm tra giá trị của trường này luôn được thực hiện trước khi tiếp tục quá trình thực hiện Chế độ người dùng (xem phần "Trở về từ gián đoạn và ngoại lệ" trong Chương 4), lịch biểu() chắc chắn sẽ được gọi vào một số thời gian trong tương lai.

+1

+1 Để tham khảo tuyệt vời. Tôi chỉ tìm thấy lời giải thích rằng [usr] (http://stackoverflow.com/users/122718/usr) đưa ra câu trả lời khác, trong cuốn sách bạn trích dẫn: "Tất nhiên một bộ xử lý đơn lẻ chỉ có thể chạy một tiến trình tại bất kỳ thời điểm nào đã cho . [..] Thời gian chia sẻ dựa trên ngắt bộ đếm thời gian và do đó trong suốt đối với quy trình. Không cần thêm mã bổ sung trong chương trình để đảm bảo chia sẻ thời gian CPU " –

8

Google 'ngắt'. Gián đoạn là trung tâm đa luồng, các hạt nhân ưu tiên như Linux/Windows. Không bị gián đoạn, hệ điều hành sẽ không bao giờ làm bất cứ điều gì.

Trong khi điều tra/tìm hiểu, cố gắng bỏ qua bất kỳ giải thích nào đề cập đến 'gián đoạn hẹn giờ', 'round-robin' và 'time-slice', 'quantum' trong đoạn đầu tiên - chúng gây nhầm lẫn nguy hiểm, nếu không thực sự sai .

Ngắt, về hệ điều hành, có hai hương vị:

Phần cứng ngắt - những khởi xướng bởi một tín hiệu phần cứng thực tế từ một thiết bị ngoại vi. Những điều này có thể xảy ra tại, (gần) bất kỳ lúc nào và thực thi chuyển đổi từ bất kỳ chuỗi nào có thể đang chạy để mã trong trình điều khiển.

Ngắt phần mềm - các chương trình được khởi xướng bởi cuộc gọi hệ điều hành từ các chuỗi đang chạy.

Hoặc ngắt có thể yêu cầu trình lập lịch biểu tạo các chuỗi đang chờ sẵn sàng/chạy hoặc khiến các chuỗi đang chờ/chạy bị chặn trước.

QUAN TRỌNG QUAN TRỌNG NHẤT LÀ HARDWARE INTERRUPTS TỪ PERIPHERAL DRIVERS, - những chủ đề sẵn sàng chờ IO trên ổ đĩa, thẻ NIC, chuột, bàn phím, USB vv. Lý do quan trọng cho việc sử dụng hạt nhân ưu tiên, và tất cả các vấn đề về khóa, đồng bộ hóa, truyền tín hiệu, vv, là các hệ thống như vậy có NGUY HIỂM TỐT HIỆU SUẤT BECAUSE HARDWARE PERIPHERALS CÓ THỂ RAPIDLY THAMADS READY/RUNNING R WNG CHIA SẺ KHI DỮ LIỆU TỪ PHẦN MỀM NÀO, KHÔNG CÓ BẤT K L L RESI VẤN ĐỀ TỪ THREADS KHÔNG YIELD HOẶC CHỜ CHO VIỆC KẾ HOẠCH GIỜ ĐẾN GIỜ.

Việc gián đoạn bộ đếm thời gian phần cứng gây ra việc lập biểu định kỳ là rất quan trọng vì nhiều cuộc gọi hệ thống có thời gian chờ trong trường hợp, phản hồi từ thiết bị ngoại vi mất nhiều thời gian hơn mức cần thiết.

Trên hệ thống đa lõi, hệ điều hành có trình điều khiển bộ xử lý có thể gây gián đoạn phần cứng trên các lõi khác, do đó cho phép hệ điều hành ngắt/lên lịch/gửi chủ đề lên nhiều lõi. Trên các hộp bị quá tải nghiêm trọng, hoặc những ứng dụng chạy nhiều CPU, (một số ít người), hệ điều hành có thể sử dụng ngắt hẹn giờ định kỳ, và do đó lập kế hoạch, để chu kỳ thông qua một tập hợp các chủ đề sẵn sàng lớn hơn số lõi có sẵn và do đó cho phép mỗi một phần của tài nguyên CPU có sẵn. Trên hầu hết các hệ thống, điều này hiếm khi xảy ra và ít quan trọng.

Tôi xin lỗi về sự la hét, nhưng mỗi lần tôi thấy 'lượng tử', 'bỏ ​​phần còn lại của họ thời gian lát', 'round-robin' và tương tự, tôi chỉ co rúm người lại ..

Các vấn đề liên quan