Sẽ dễ dàng hơn nhiều khi giải thích những thứ đó theo thứ tự ngược lại vì quá trình chuyển đổi luôn liên quan đến công tắc.
Một điển hình chuyển đổi chủ đề bối cảnh trên một CPU lõi đơn sẽ xảy ra như thế này:
Tất cả các công tắc bối cảnh được khởi xướng bởi một 'ngắt'. Đây có thể là phần cứng thực sự gián đoạn chạy trình điều khiển (ví dụ: từ card mạng, bàn phím, bộ nhớ quản lý hoặc phần cứng hẹn giờ) hoặc cuộc gọi phần mềm, (gọi hệ thống), thực hiện chuỗi cuộc gọi giống như phần cứng gián đoạn để vào hệ điều hành. Trong trường hợp của một trình điều khiển ngắt, hệ điều hành cung cấp một điểm vào mà người lái xe có thể gọi thay vì thực hiện trở lại trực tiếp 'bình thường' trực tiếp & để cho phép một trình điều khiển thoát ra thông qua bộ lập lịch OS nếu cần hệ điều hành sẵn sàng, (ví dụ: nó đã báo hiệu một semaphore).
Hệ thống không tầm thường sẽ phải bắt đầu thay đổi mức độ bảo vệ phần cứng để nhập trạng thái hạt nhân sao cho mã hạt nhân/dữ liệu, v.v. có thể được truy cập.
Trạng thái cốt lõi cho chuỗi bị gián đoạn phải được lưu. Trên một hệ thống nhúng đơn giản, điều này có thể chỉ là đẩy tất cả các thanh ghi vào ngăn xếp luồng và lưu con trỏ ngăn xếp trong Khối điều khiển luồng (TCB) của nó.
Nhiều hệ thống chuyển sang ngăn xếp dành riêng cho hệ điều hành ở giai đoạn này để phần lớn các yêu cầu ngăn xếp nội bộ OS không được gây ra trên mỗi ngăn của mỗi chuỗi.
Có thể cần phải đánh dấu vị trí ngăn xếp luồng khi thay đổi trạng thái ngắt xảy ra để cho phép gián đoạn lồng nhau.
Cuộc gọi trình điều khiển/hệ thống chạy và có thể thay đổi tập hợp các chuỗi sẵn sàng bằng cách thêm/xóa TCB khỏi hàng đợi nội bộ cho các ưu tiên luồng khác nhau, ví dụ: Trình điều khiển card mạng có thể đã thiết lập một sự kiện hoặc báo hiệu một semaphore rằng một thread khác đang chờ đợi, để thread đó sẽ được thêm vào tập đã sẵn sàng, hoặc một thread đang chạy có thể gọi là sleep() và do đó được chọn để xóa chính nó khỏi bộ sẵn sàng .
Thuật toán lập lịch biểu hệ điều hành được chạy để quyết định chuỗi nào sẽ chạy tiếp theo, thường là chuỗi sẵn sàng có mức ưu tiên cao nhất ở phía trước hàng đợi cho mức độ ưu tiên đó. Nếu chuỗi tiếp theo chạy thuộc về một tiến trình khác với luồng được chạy trước đó, một số thứ bổ sung là cần thiết ở đây, (xem phần sau).
Con trỏ ngăn xếp đã lưu từ TCB cho chuỗi đó được truy xuất và được tải vào con trỏ ngăn xếp phần cứng.
Trạng thái lõi cho chuỗi đã chọn được khôi phục. Trên hệ thống đơn giản của tôi, thanh ghi sẽ xuất hiện từ ngăn xếp của chuỗi đã chọn. Các hệ thống phức tạp hơn sẽ phải xử lý một sự quay trở lại bảo vệ mức người dùng.
Trả về ngắt được thực hiện, do đó hãy chuyển thực hiện đến chuỗi đã chọn.
Trong trường hợp CPU đa lõi, mọi thứ phức tạp hơn. Trình lên lịch có thể quyết định rằng một chuỗi hiện đang chạy trên một lõi khác có thể cần phải được dừng lại và được thay thế bởi một luồng vừa mới sẵn sàng. Nó có thể làm điều này bằng cách sử dụng trình điều khiển interprocessor của nó để phần cứng làm gián đoạn lõi chạy thread đã được dừng lại. Sự phức tạp của hoạt động này, trên đầu trang của tất cả những thứ khác, là một lý do chính đáng để tránh phải viết kernel OS :)
Một quá trình điển hình chuyển đổi bối cảnh xảy ra như thế này:
Process switch bối cảnh được khởi xướng bởi một chuyển đổi ngữ cảnh chủ đề, vì vậy tất cả những điều trên, 1-9, sẽ cần phải xảy ra.
Ở bước 5 ở trên, trình lên lịch quyết định chạy một chuỗi thuộc một quy trình khác với quy trình sở hữu chuỗi đang chạy trước đó.
Phần cứng quản lý bộ nhớ phải được nạp với không gian địa chỉ cho quy trình mới, tức là bất kỳ bộ chọn/phân đoạn/cờ/bất kỳ điều gì cho phép luồng/quy trình mới truy cập bộ nhớ của nó.
Ngữ cảnh của bất kỳ phần cứng FPU nào cần được lưu/khôi phục từ PCB.
Có thể có các phần cứng dành riêng cho quá trình khác cần được lưu/khôi phục.
Trên bất kỳ hệ thống thực nào, cơ chế phụ thuộc vào kiến trúc và ở trên là hướng dẫn thô và không đầy đủ về tác động của chuyển đổi ngữ cảnh. Có các chi phí khác được tạo ra bởi một quá trình chuyển đổi không phải là một phần của chuyển đổi - có thể có thêm bộ nhớ cache-flushes và lỗi trang sau khi một quá trình chuyển đổi kể từ khi một số bộ nhớ của nó có thể đã được paged ra trong lợi của các trang thuộc cho quá trình sở hữu chuỗi đang chạy trước đó.
Nguồn
2011-09-16 11:02:09
có thể giải thích bước 4 của bối cảnh chuyển đổi lõi đơn một cách chi tiết hơn? Tại sao chính xác là "dấu" cần thiết cho các ngắt lồng nhau? Ngoài ra, các thanh ghi được lưu chính xác ở đâu? (Giả sử Linux) –