Điều gì xảy ra với nội dung bộ đệm trên bộ chuyển ngữ cảnh?


50

Trong bộ xử lý đa lõi, điều gì xảy ra với nội dung của bộ đệm của lõi (giả sử L1) khi chuyển đổi ngữ cảnh xảy ra trên bộ đệm đó?

Là hành vi phụ thuộc vào kiến ​​trúc hay nó là một hành vi chung theo sau bởi tất cả các nhà sản xuất chip?

Câu trả lời:


42

Điều đó phụ thuộc cả vào bộ xử lý (không chỉ loạt bộ xử lý, nó có thể thay đổi từ model này sang model khác) và các hệ điều hành, nhưng có những nguyên tắc chung. Việc một bộ xử lý là đa lõi không có tác động trực tiếp đến khía cạnh này; cùng một quá trình có thể được thực thi trên nhiều lõi cùng một lúc (nếu nó đa luồng) và bộ nhớ có thể được chia sẻ giữa các tiến trình, do đó không thể tránh khỏi việc đồng bộ hóa bộ đệm cho dù điều gì xảy ra trên chuyển đổi ngữ cảnh.

Khi bộ xử lý tìm kiếm một vị trí bộ nhớ trong bộ đệm, nếu có MMU , nó có thể sử dụng địa chỉ vật lý hoặc địa chỉ ảo của vị trí đó (đôi khi thậm chí là kết hợp cả hai, nhưng điều đó không thực sự phù hợp ở đây).

Với địa chỉ vật lý, không có vấn đề gì khi truy cập vào địa chỉ, nội dung có thể được chia sẻ. Vì vậy, không cần phải làm mất hiệu lực nội dung bộ đệm trong khi chuyển đổi ngữ cảnh. Nếu hai quá trình ánh xạ cùng một trang vật lý với các thuộc tính khác nhau, thì điều này được xử lý bởi MMU (hoạt động như một MPU (đơn vị bảo vệ bộ nhớ)). Nhược điểm của bộ đệm địa chỉ vật lý là MMU phải nằm giữa bộ xử lý và bộ đệm, do đó việc tra cứu bộ đệm bị chậm. Bộ nhớ cache L1 hầu như không bao giờ là địa chỉ vật lý; bộ nhớ cache cấp cao hơn có thể được.

Cùng một địa chỉ ảo có thể biểu thị các vị trí bộ nhớ khác nhau trong các quy trình khác nhau. Do đó, với bộ đệm gần như được xử lý, bộ xử lý và hệ điều hành phải hợp tác để đảm bảo rằng một quy trình sẽ tìm đúng bộ nhớ. Có một số kỹ thuật phổ biến. Mã chuyển đổi ngữ cảnh được cung cấp bởi hệ điều hành có thể làm mất hiệu lực toàn bộ bộ đệm; Điều này đúng nhưng rất tốn kém. Một số kiến ​​trúc CPU có chỗ trong dòng bộ đệm của chúng cho ASID (định danh không gian địa chỉ) phiên bản phần cứng của ID tiến trình, cũng được MMU sử dụng. Điều này có hiệu quả tách các mục bộ đệm khỏi các quy trình khác nhau và có nghĩa là hai quy trình ánh xạ cùng một trang sẽ có các chế độ xem không nhất quán của cùng một trang vật lý (thường có một giá trị ASID đặc biệt chỉ ra một trang được chia sẻ, nhưng những điều này cần phải được xóa nếu chúng không được ánh xạ tới cùng một địa chỉ trong tất cả các quy trình nơi chúng được ánh xạ). Nếu hệ điều hành quan tâm rằng các quy trình khác nhau sử dụng các không gian địa chỉ không chồng lấp (làm thất bại một số mục đích sử dụng bộ nhớ ảo, nhưng đôi khi có thể được thực hiện), thì các dòng bộ đệm vẫn còn hiệu lực.

Hầu hết các bộ xử lý có MMU cũng có TLB . TLB là bộ đệm của ánh xạ từ địa chỉ ảo đến địa chỉ vật lý. TLB được tư vấn trước khi tra cứu trong bộ đệm địa chỉ vật lý, để xác định địa chỉ vật lý một cách nhanh chóng khi có thể; bộ xử lý có thể bắt đầu tra cứu bộ đệm trước khi tra cứu TLB hoàn tất, vì thông thường các dòng bộ đệm ứng cử viên có thể được xác định từ các bit giữa của địa chỉ, giữa các bit xác định phần bù trong dòng bộ đệm và các bit xác định trang. Bộ nhớ cache địa chỉ hầu như bỏ qua TLB nếu có một lần nhấn bộ đệm, mặc dù bộ xử lý có thể bắt đầu tra cứu TLB trong khi nó đang truy vấn bộ đệm, trong trường hợp bị lỗi.

Bản thân TLB phải được quản lý trong quá trình chuyển đổi ngữ cảnh. Nếu các mục TLB chứa ASID, chúng có thể giữ nguyên vị trí; hệ điều hành chỉ cần xóa các mục TLB nếu ASID của chúng đã thay đổi ý nghĩa (ví dụ: vì một quy trình đã thoát). Nếu các mục TLB là toàn cầu, chúng phải bị vô hiệu khi chuyển sang một bối cảnh khác.


2
Rất nhiều thông tin. Nếu bạn có thể thêm một số ví dụ về cách thực hiện trong các kiến ​​trúc thực thì nó sẽ còn tốt hơn nữa.
JohnTortugo

2
@JohnTortugo Những gì tôi đã viết tương đối gần với những gì bạn có thể làm trên ARMv7 (ví dụ: CPU của điện thoại thông minh của bạn) (kiến trúc duy nhất mà tôi từng viết mã xử lý MMU). Tôi hy vọng các nền tảng khác như x86 tương đối giống nhau nhưng tôi không thể viết về chúng. Nếu bạn đang tìm kiếm thông tin cụ thể về một nền tảng thực, Khoa học máy tính không phải là trang web phù hợp, bạn có thể hỏi về Stack Overflow hoặc Electrical Engineering hoặc Embeddedd (đề xuất) .
Gilles 'SO- ngừng trở nên xấu xa'

10

Bộ nhớ cache thường không biết gì về chuyển đổi ngữ cảnh. Chỉ chuỗi địa chỉ bộ nhớ được truy cập xác định dòng bộ đệm nào được thay thế.

Chính sách thay thế thường là một heuristic phụ thuộc vào nhà sản xuất và vi kiến ​​trúc cụ thể. Vấn đề là heuristic không thể dự đoán tương lai, địa chỉ nào và do đó dòng bộ đệm sẽ được truy cập tiếp theo.

Các heuristic có thể là một đơn giản như LRU (ít được sử dụng gần đây nhất). Nhưng với các CPU hiện đại, các heuristic phức tạp hơn.

Hãy xem Hướng dẫn sử dụng dành cho nhà phát triển phần mềm Intel® 64 và IA-32 Architectures Tập 3 Chương 11 giải thích về bộ nhớ cache và các cơ chế kiểm soát bộ đệm. AMD có điều này trong Chương 7 của Hướng dẫn lập trình kiến ​​trúc AMD64 Tập 2: Lập trình hệ thống . Đối với CPU dựa trên ARM, dường như các tệp PDF chỉ dành cho khách hàng đã đăng ký.


Bạn có thể đưa ra một tài liệu tham khảo cho đoạn đầu tiên? Hoặc các tài liệu liên kết đề cập đến vấn đề này?
Raphael

Hành vi phụ thuộc rất nhiều vào việc bộ đệm được xử lý vật lý hay hầu như được xử lý. Chính sách thay thế không liên quan ở đây. Đối với ARM, có thông tin trong hướng dẫn kỹ thuật của bộ xử lý, công khai, ví dụ L1 trên Cortex-A9 (những gì bạn nhận được trong điện thoại di động thế hệ mới nhất), mặc dù có thể khó hiểu nếu không có hướng dẫn tham khảo kiến ​​trúc ngoài công cộng .
Gilles 'SO- ngừng trở nên xấu xa'

1
@Raphael Tôi đã viết một cách điển hình là bởi vì với các bộ xử lý mà tôi đã gặp, bản thân bộ đệm không có bất kỳ kiến ​​thức nào về các luồng, tiến trình, bối cảnh, v.v. Nó chỉ phản ứng với các truy cập bộ nhớ. Nếu bộ đệm dữ liệu bị xóa và bộ đệm hướng dẫn không hợp lệ trên bộ chuyển ngữ cảnh, thì đó là hệ điều hành kích hoạt hành động này không phải bộ đệm. Nếu bạn cài đặt một hệ điều hành khác, hành vi này có thể thay đổi.
uli

@Gilles Lần đầu tiên tôi đã cố gắng đưa ra một câu trả lời ngắn gọn và quyết định không viết về bộ nhớ ảo, vì điều này ngay lập tức liên quan đến HĐH. Và có thời gian để xem xét quá. Không có gì thay đổi, có thể là một câu trả lời cho thời gian giữa chuyển đổi ngữ cảnh và truy cập bộ nhớ tiếp theo, vì nội dung bộ đệm có thể bị vô hiệu nhưng hoàn toàn không thay đổi.
uli
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.