2009-04-12 25 views
11

Bất cứ khi nào bộ nạp khởi động tải hệ điều hành, có lẽ chỉ có MỘT luồng chương trình đang hoạt động, đúng không? Điều này có nghĩa là, một bộ xử lý giữ con trỏ lệnh và thực hiện các lệnh mà nó tìm thấy tại vị trí mà thanh ghi EIP trỏ tới. Tại thời điểm đó và làm thế nào để hệ thống bắt đầu khai thác nhiều quy trình và/hoặc chủ đề (không có chủ đề userland, nhưng các chủ đề CPU)?lập trình cấp thấp: Hệ điều hành bắt đầu một luồng/quy trình mới như thế nào?

Trả lời

5

Hệ điều hành sẽ khởi động (sau khi BIOS và bootloader được thực hiện) trong vai trò đặc biệt - khi chương trình đầu tiên chạy nó sẽ có truy cập vào tất cả các lệnh CPU.

Vì vậy, nó sẽ thiết lập các bộ phận khác nhau của hệ thống - như thiết lập Interrupt Handlers (hoặc Quy trình dịch vụ gián đoạn). Sau khi thực hiện điều này, nó có khả năng tạo ra một "Scheduler".

Quá trình xử lý "xử lý/chủ đề" thực tế sẽ được thực hiện bởi trình lên lịch này. Nó quyết định, chủ đề nào sẽ được chạy. Ngoài ra nó quản lý tất cả các chủ đề đang hoạt động. CPU không biết tất cả những điều này.

Sau khi người điều hành chính của tiến trình quyết định thực hiện luồng (hoặc "Process") A, nó sao chép dữ liệu quy trình vào thanh ghi (và lưu trữ các thanh ghi vào InfoBlock của thread đang chạy gần đây). Nó sẽ báo cho CPU/bộ hẹn giờ gây gián đoạn trong n micro giây (hoặc thời gian khác). Sau đó, nó sẽ báo cho CPU chạy "chương trình" (điều duy nhất mà CPU biết) ở chế độ không phải hệ điều hành (để nó không thể sửa đổi dữ liệu quan trọng hoặc đăng ký Trình xử lý ngắt riêng mà không được phép).

Trong khi luồng A đang thực thi ngay bây giờ, bộ hẹn giờ phần cứng sẽ chạy. Một khi nó chạm vào thời gian mong muốn bù đắp, nó sẽ gây ra một gián đoạn. Sau đó, phần cứng sẽ ngừng thực hiện chương trình hiện tại và thay vào đó sẽ gọi số Interrupt Handler đã đăng ký. Trình xử lý này sẽ là một phương thức của trình lên lịch (điều hành chính một lần nữa, chính xác).

Phương pháp này sau đó sẽ một lần nữa đánh giá lại Chủ đề nào sẽ được lên lịch và do đó việc lên lịch tiếp tục.

+0

Cảm ơn bạn đã giải thích. Bạn có thể cho tôi biết hình ảnh này thay đổi như thế nào khi một số bộ xử lý/lõi độc lập có liên quan? – prinzdezibel

+0

Hầu hết các đa lõi đều có ít nhất một bộ xử lý "chính" (xem các câu trả lời khác) - L1 + cache sẽ không hoạt động nếu không có một số quản lý trung tâm. Trình lên lịch sẽ chỉ phải xử lý bộ xử lý mong muốn cho mỗi hoạt động đăng ký. Mọi thứ khác giữ nguyên (bộ định thời khoảng cố định). –

+0

@prinzdezible: Lịch trình hệ điều hành thường chạy trên mỗi lõi CPU khi luồng hiện tại bị dừng qua ngắt hoặc bằng cách thực hiện cuộc gọi hệ thống. Để có thể mở rộng thành nhiều lõi, nó sẽ không xem xét tất cả các luồng, nhưng chỉ các luồng được gán cho CPU đó. Nếu nó quá bận nó sẽ đẩy chủ đề tới các CPU khác. Nếu nó không bận thì nó sẽ kéo các luồng từ các CPU khác. Thường xuyên theo thời gian hoặc một số bộ đếm, trình lên lịch sẽ tải các tác vụ cân bằng trên tất cả các CPU (điều này rất chậm, vì vậy không thường xuyên) –

3

Một trong những điều đầu tiên mà hệ điều hành (đa luồng) phải bắt đầu là bộ lập lịch chịu trách nhiệm quản lý nhiều quy trình (và do đó cũng quản lý nhiều luồng CPU ví dụ trên máy đa lõi).

Quá trình đầu tiên được bắt đầu bởi trình lên lịch này thường là một số loại quy trình "init" mà lần lượt chịu trách nhiệm tải các chương trình/quy trình khác sau đó.

4

Chính xác, trong quá trình khởi động chỉ có một chuỗi thực hiện. Thông thường đây là trường hợp cho đến khi hệ điều hành đã khởi tạo đến điểm quản lý bộ nhớ mức thấp, bộ lập lịch, vv là chức năng.

Đây thậm chí là trường hợp trong các hệ thống nhiều CPU - một lõi là "bộ xử lý chính" xử lý khởi động ban đầu cho đến khi cơ sở hạ tầng ở đó để khởi động các lõi khác.

Cuối cùng, tính năng này đặc biệt dành cho hệ điều hành; Intel Architecture Software Developer's Manuals có các chi tiết về thông số phần cứng. (Giả sử bạn đang nói về kiến ​​trúc Intel; các kiến ​​trúc khác có thể khác nhau một cách hoang dại.)

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