2011-09-16 86 views
23

Tôi được yêu cầu mô tả các bước liên quan đến chuyển đổi ngữ cảnh (1) giữa hai quy trình khác nhau và (2) giữa hai luồng khác nhau trong cùng một quy trình.Các bước trong chuyển đổi bối cảnh

  1. Trong khi chuyển ngữ cảnh, hạt nhân sẽ lưu ngữ cảnh của quy trình cũ vào PCB và sau đó tải ngữ cảnh đã lưu của quy trình mới được lập lịch để chạy.
  2. Chuyển đổi bối cảnh giữa hai luồng khác nhau trong cùng một quy trình có thể được hệ điều hành lên lịch để chúng xuất hiện song song và do đó thường nhanh hơn chuyển đổi ngữ cảnh giữa hai quy trình khác nhau.

Điều này quá chung chung hoặc bạn sẽ thêm gì để giải thích quy trình rõ ràng hơn?

Trả lời

43

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:

  1. 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).

  2. 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.

  3. 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ó.

  4. 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.

  5. 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.

  6. 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 .

  7. 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).

  8. 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.

  9. 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.

  10. 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:

  1. 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.

  2. Ở 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 đó.

  3. 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ó.

  4. 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.

  5. 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 đó.

+2

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) –

7

Tôi hy vọng rằng tôi có thể cung cấp hình ảnh chi tiết/rõ ràng hơn.

Trước hết, các luồng lịch biểu của hệ điều hành, không phải là quy trình, vì luồng chỉ là các đơn vị thực thi duy nhất trong hệ thống. Quá trình chuyển đổi chỉ là một chủ đề chuyển đổi, nơi chủ đề thuộc về các quá trình khác nhau. Do điều này trong thủ tục chuyển đổi chung là phổ biến.

  1. Trình lập lịch biểu phải được gọi. Có ba cảnh quan cơ bản:

    • Công tắc không chủ ý. Một số bên ngoài sự kiện chuỗi của bạn đã xảy ra đã ảnh hưởng đến lập lịch biểu. Ví dụ, vòng hẹn giờ đã khởi động luồng có ưu tiên cao, bộ điều khiển HDD đã báo cáo rằng phần yêu cầu của tệp đã được đọc vào bộ nhớ và chuỗi chờ đợi nó có thể tiếp tục thực thi, bộ đếm thời gian hệ thống đã báo cho hạt nhân biết rằng hết số lượng thời gian của nó, v.v.
    • Tự nguyện.Chủ đề yêu cầu thay đổi lịch biểu bằng cuộc gọi hệ thống. Ví dụ như yêu cầu một sản lượng, hoặc yêu cầu một giấc ngủ, hoặc yêu cầu chờ cho đến khi mutex sẽ được phát hành.
    • Bán tự nguyện. Thread ngầm định kích hoạt lại lịch trình thực hiện một số cuộc gọi hệ thống không liên quan. Ví dụ, nó yêu cầu một hệ thống để đọc một tập tin. Hệ điều hành đã định tuyến yêu cầu này tới bộ điều khiển đĩa và không lãng phí thời gian bận khi đợi kết quả quyết định chuyển sang chuỗi khác.
  2. Trong mọi trường hợp, để có thể thực hiện chuyển đổi chuỗi, điều khiển phải được chuyển đến hạt nhân. Trong trường hợp thiết bị chuyển mạch không tự nguyện, điều khiển vượt qua được thực hiện bằng ngắt, trong trường hợp điều khiển tự nguyện (và bán tự nguyện) được truyền qua cuộc gọi hệ thống.

  3. Trong cả hai trường hợp, nhập vào hạt nhân được hỗ trợ CPU. Bộ xử lý thực hiện kiểm tra quyền, nhớ một điểm mà tại đó thread được preempted (để có thể tiếp tục nó trong tương lai), chuyển từ phần người dùng của ngăn xếp luồng sang đối tác hạt nhân của nó, và chuyển điều khiển đến một điểm được xác định trước và nổi tiếng trong mã hạt nhân.

  4. Hành động đầu tiên mà hạt nhân thực hiện là tiết kiệm nội dung của thanh ghi CPU, hạt nhân nào sẽ sử dụng lại cho các nhiệm vụ của chính nó. Thông thường, hạt nhân chỉ sử dụng các thanh ghi CPU có mục đích chung và lưu chúng bằng cách đẩy vào ngăn xếp.
  5. Sau đó, hạt nhân xử lý yêu cầu chính - xử lý gián đoạn hoặc chuẩn bị yêu cầu đọc tệp hoặc thực hiện thiết lập hẹn giờ.
  6. Tại một số điểm xử lý yêu cầu, hạt nhân thực hiện hành động ảnh hưởng đến trạng thái của chuỗi hiện tại (đã quyết định không có gì phải làm trong chuỗi này và chúng ta nên đợi điều gì đó) hoặc ảnh hưởng đến trạng thái của một chuỗi khác (thread mới trở thành runable như là kết quả của gián đoạn nhận được hoặc do mutex phát hành, vv).
  7. Kernel gọi trình lên lịch biểu. Trình lập lịch biểu phải đưa ra hai quyết định. Đầu tiên là về việc phải làm gì với chuỗi hiện tại. Nó có nên bị chặn không? Nếu vậy, vào hàng chờ đợi nào, nó nên được đặt? Nếu thread được chuyển đổi không tự nguyện, nó được đặt vào cuối runqueue, nếu thread bị khóa, bởi vì nó chờ đợi cho somethins, nó được đặt vào một trong các waitqueues. Quyết định thứ hai là về chuỗi nào sẽ chạy tiếp theo.
  8. Sau khi cả hai quyết định được thực hiện, scheduller thực hiện ngữ cảnh swicth đi qua với nó hai tham số - chuỗi điều khiển luồng của chủ đề hiện tại và tiếp theo.
  9. Tự chuyển đổi bối cảnh bao gồm ba bước chính. Lúc đầu, nhân vật tìm ra những gì CPU đăng ký chủ đề thực sự sử dụng và lưu nội dung của họ hoặc trên stack hoặc trong TCB của thread outgoint. Nếu luồng không sử dụng thanh ghi FPU và SSE (exaple cho nền tảng IA-32) thì nội dung của chúng sẽ không được lưu.
  10. Bước thứ hai là trái tim của chuyển đổi ngữ cảnh. Kernel đẩy con trỏ lệnh hiện hành vào ngăn xếp và giá trị của con trỏ ngăn xếp được lưu trong TCB của chuỗi gửi đi. Sau đó, nó nạp vào CPU con trỏ ngăn xếp mới từ TCB của thread đến và pops hướng dẫn con trỏ từ đầu của nó. Rằng nó! Chồng hoạt động mới có nghĩa là chuỗi hoạt động mới. Bắt đầu từ thời điểm này, phần còn lại của hệ thống sẽ nghĩ rằng nó hoạt động trong bối cảnh của chuỗi gửi đến.
  11. Tại bước thứ ba, nhân vật tìm ra những thanh ghi thực sự được sử dụng bởi chủ đề đến và tải nội dung đã lưu trước đây của họ (xem bước 1) trở lại CPU.
  12. Sau đó, kiểm tra hạt nhân làm cả hai luồng (đến và đi) thuộc về cùng một quá trình hay không. Nếu chúng thuộc về các quá trình khác nhau (trường hợp gọi là chuyển đổi quá trình gọi của mọi người), thì hạt nhân thiết lập lại không gian địa chỉ hiện tại trỏ MMU thành tập hợp mới của các bảng dịch địa chỉ ảo sang địa chỉ vật lý. Là một phần của quá trình này, CPU sẽ dịch Bộ đệm Lookaside (TLB) để lưu trữ các quy tắc truyền dẫn địa chỉ ảo đến địa chỉ vật lý. Không gian địa chỉ ảo mới có nghĩa là các quy tắc được lưu trong bộ nhớ cache trước đó không chính xác. Lưu ý rằng đây là bước duy nhất trong toàn bộ các hành động chuyển ngữ cảnh quan tâm đến các quy trình!
  13. Hạt nhân chuẩn bị Lưu trữ cục bộ chủ đề cho chuỗi gửi đến. Ví dụ, ánh xạ các trang bộ nhớ tương ứng với các địa chỉ được chỉ định hoặc ví dụ trên phương pháp tiếp cận chung IA-32 là tải phân đoạn mới trỏ đến dữ liệu TLS của chuỗi gửi đến.
  14. Cuối cùng tải hạt nhân vào địa chỉ CPU của phần hạt nhân của chuỗi gửi đến. Sau đó, mỗi lời gọi hạt nhân mới sẽ sử dụng phần hạt nhân của ngăn xếp của chuỗi gửi đến, và sẽ không làm hỏng dữ liệu được lưu trữ trên chồng của chuỗi gửi đi.
  15. Một bước khác có thể được thực hiện bởi hạt nhân là lập trình lại hệ thống hẹn giờ. Làm hạt nhân này yêu cầu bộ đếm thời gian đổ chuông và truyền điều khiển đến hạt nhân sau một thời gian. Khoảng thời gian này được gọi là lượng tử thời gian của sợi.
  16. Cuối cùng, các hạt nhân thích thu thập số liệu thống kê trong quá trình chuyển ngữ cảnh bao gồm số lượng thời gian CPU tiêu thụ, cách chuyển ngữ cảnh xảy ra trong hệ thống theo đơn vị thời gian thực, số lần chuỗi được gọi, bao nhiêu lần phát hành CPU tự nguyện và không tự nguyện, bao nhiêu lần chúng bị loại ra khỏi lượng tử. Một phần của số liệu thống kê đó được sử dụng sau đó bằng cách lên lịch, để lên kế hoạch đưa ra quyết định tối ưu hơn. Một mục đích khác của thống kê là phân phối cho người quản trị hệ thống và người dùng để cho họ thấy những gì đang diễn ra dưới sự che chở của hệ thống.
  17. Công tắc chủ đề có thể được coi là hoàn thành tại thời điểm này và hạt nhân tiếp tục hành động hệ thống bị gián đoạn trước đó. Ví dụ, thread đang đợi đọc tập tin kiểm tra kết quả đọc trong bộ nhớ và xử lý nó. Hoặc một sợi bị chặn trên mutex ở giữa một số hoạt động hệ thống lớn tiếp tục hoạt động đó.
  18. Cuối cùng, sau đó hoặc sớm hơn thread kết thúc hoạt động hệ thống của nó và muốn quay trở lại chế độ người dùng để tiếp tục nhiệm vụ chính của nó, ban đầu nó được sử dụng. Tại thời điểm này, hạt nhân bật ra từ nội dung ngăn xếp hạt nhân của các thanh ghi đa năng đã được lưu trước đó trong khi nhập vào nhân và yêu cầu CPU thực hiện trở lại chế độ người dùng.
  19. CPU nắm bắt giá trị của con trỏ lệnh và con trỏ ngăn xếp, trước đây đã được lưu trong khi nhập vào chế độ hạt nhân và khôi phục chúng. Làm điều này nó cũng chuyển đổi chủ đề trở lại từ phần hạt nhân của ngăn xếp của nó cho người sử dụng một phần của ngăn xếp. Cuối cùng CPU reset quyền hạn của mã sẽ được thực hiện cho một tập hợp hạn chế hơn (cấm sử dụng các lệnh hệ thống đặc biệt, hoặc cấm truy cập vào mã và dữ liệu kerel). Cuối cùng CPU chuyển quyền kiểm soát trở lại điểm mà ban đầu thread được preempted. Trong trường hợp chuỗi cuộc gọi hệ thống sẽ tiến hành tại điểm mà cuộc gọi hệ thống được gọi, bằng cách chụp và xử lý kết quả của nó. Trong trường hợp preemption bởi ngắt, thread sẽ tiếp tục thực hiện chính xác trong cùng một điểm mà nó đã được khi gián đoạn đã xảy ra. Trong trường hợp đó nó thậm chí sẽ hoàn toàn không biết rằng nó đã bị gián đoạn.

Một số lưu ý tóm tắt:

  1. lịch trình hạt nhân và thực hiện chỉ đề, chứ không phải quá trình. Do bối cảnh này xảy ra giữa các chủ đề.
  2. Quy trình chuyển đổi ngữ cảnh giữa các treads thuộc các quy trình khác nhau về cơ bản giống như giữa các chuỗi thuộc cùng một quy trình. Chỉ có một bước bổ sung trong trường hợp đầu tiên - tải không gian địa chỉ ảo mới (dẫn đến tuôn ra TLB).
  3. Bối cảnh chủ đề được lưu trữ trong phần hạt nhân của ngăn xếp chủ đề hoặc trong chuỗi TCB (không phải trong PCB!).
  4. Chủ đề chuyển đổi giới thiệu hình phạt hiệu suất. Có chi phí chuyển đổi chủ đề trực tiếp đáng kể. Và thậm chí còn lớn hơn nhiều chi phí inderect tạo ra bởi ô nhiễm bộ nhớ cache và TLB tuôn ra (nếu không gian địa chỉ ảo được nạp lại trong quá trình chuyển đổi).
2
  1. Trong một chuyển đổi, trạng thái của quá trình hiện đang thực hiện phải được lưu bằng cách nào đó, để khi nó được dời lại, trạng thái này có thể được phục hồi.
  2. Trạng thái quy trình bao gồm tất cả các thanh ghi mà quá trình có thể đang sử dụng, đặc biệt là bộ đếm chương trình, cộng với bất kỳ dữ liệu hệ điều hành cụ thể nào khác có thể cần thiết. Điều này thường được lưu trữ trong một cấu trúc dữ liệu được gọi là process control block (PCB) hoặc khung công tắc.
  3. PCB có thể được lưu trữ trên một chồng trên mỗi quá trình trong bộ nhớ hạt nhân (trái ngược với ngăn xếp cuộc gọi chế độ người dùng), hoặc có thể có một số cấu hình dữ liệu được xác định hệ điều hành cụ thể cho thông tin này. Một xử lý cho PCB được thêm vào một hàng đợi các tiến trình đã sẵn sàng để chạy, thường được gọi là hàng đợi sẵn sàng.
  4. Vì hệ điều hành đã tạm ngưng thực thi một quy trình, nó có thể chuyển ngữ cảnh bằng cách chọn một quy trình từ hàng đợi sẵn sàng và khôi phục PCB của nó. Khi làm như vậy, bộ đếm chương trình từ PCB được nạp, và do đó việc thực hiện có thể tiếp tục trong quá trình đã chọn. Quy trình và ưu tiên luồng có thể ảnh hưởng đến quy trình nào được chọn từ hàng đợi sẵn sàng (nghĩa là, nó có thể là hàng đợi ưu tiên).

Context Switch

(Nguồn: Context switch)

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