Tôi đã đọc cuốn sách Phát triển hạt nhân Linux về Lập kế hoạch chương trình . Trên trang 61, phần Thức dậy , đoạn đầu tiên ghi:
Việc đánh thức được xử lý thông qua Wake_up (), đánh thức tất cả các nhiệm vụ đang chờ trên hàng đợi chờ đã cho. Nó ( Q1 : này những gì hiện
it
tham khảo ?) Gọi try_to_wake_up (), thiết lập của nhiệm vụ ( Q2 : ? Mà nhiệm vụ tất cả các nhiệm vụ đánh thức ) nhà nước để TASK_RUNNING, gọi điện enqueue_task () để thêm các nhiệm vụ để cây đỏ-đen, và đặt Need_resched nếu mức ưu tiên của tác vụ được đánh thức cao hơn mức ưu tiên của tác vụ hiện tại. Mã gây ra sự kiện thường xảy ra thường gọi chính thức Wake_up (). Ví dụ, khi dữ liệu đến từ đĩa cứng, VFS gọi Wake_up () trên hàng đợi chờ giữ các quá trình chờ dữ liệu.
Tôi khá bối rối về những điều trên. Hãy để tôi chỉ sử dụng ví dụ trong đoạn văn trên, tức là đĩa bị gián đoạn sau khi đọc dữ liệu, nhưng với một hình ảnh đầy đủ hơn. Vui lòng sửa cho tôi nếu bất kỳ điều nào sau đây là sai hoặc không đầy đủ:
Một số quy trình người dùng đã ban hành một hoạt động đọc chặn, kích hoạt một cuộc gọi sys và quá trình này nằm trong địa hạt nhân.
Kernel thiết lập bộ điều khiển đĩa yêu cầu dữ liệu cần thiết và đưa quá trình này vào chế độ ngủ (quá trình này được đưa vào hàng đợi). Kernel lên lịch một quá trình khác để chạy.
Ngắt đĩa xảy ra. CPU tạm dừng quá trình thực thi hiện tại và nhảy vào xử lý ngắt đĩa.
Bộ điều khiển đĩa đôi khi sẽ khởi động trong quá trình xử lý ngắt để chuyển dữ liệu đọc từ đĩa sang bộ nhớ chính (theo hướng của CPU hoặc bởi DMA)
(Không chắc chắn, vui lòng sửa lại) Như đoạn văn đã nói, VFS gọi Wake_up () trên hàng đợi chờ chứa các quá trình chờ dữ liệu.
Câu hỏi cụ thể của tôi là như sau:
Q1 (tham khảo đoạn trích dẫn): Tôi giả sử It trong câu thứ hai đề cập đến chức năng wake_up()
. Tại sao chức năng wake_up
đánh thức tất cả các tác vụ thay vì chỉ chờ dữ liệu đĩa này?
Câu 2 (tham khảo đoạn trích dẫn): try_to_wake_up()
Bằng cách nào đó có biết nhiệm vụ cụ thể mà trạng thái cần được đặt thành TASK_RUNNING không? Hoặc try_to_wake_up()
đặt trạng thái của tất cả các nhiệm vụ được đánh thức thành TASK_RUNNING?
Câu 3 : Có bao nhiêu hàng đợi để nhân quản lý? Nếu có nhiều hơn 2 hàng đợi như vậy, làm thế nào để kernel biết hàng đợi nào được chọn, sao cho quá trình chờ dữ liệu đĩa nằm trên hàng đợi đó?
Q4 : Bây giờ hãy nói rằng chúng tôi biết hàng đợi nơi quá trình chờ đợi được bật. Làm thế nào để kernel biết quá trình nào đang chờ dữ liệu từ đĩa. Tôi chỉ có thể hình ảnh rằng một số thông tin cụ thể cho quá trình yêu cầu dữ liệu đĩa được chuyển đến bộ điều khiển đĩa, như PID, địa chỉ bộ nhớ hoặc một cái gì đó. Sau đó, khi hoàn thành việc xử lý ngắt, bộ điều khiển đĩa (hoặc kernel?) Sử dụng thông tin này để xác định chính xác quy trình trên hàng đợi.
Xin hãy giúp tôi hoàn thành bức tranh về quá trình Wake_up này! Cảm ơn!