Що відбувається із вмістом кеша в контекстному комутаторі?


50

Що в багатоядерному процесорі, що відбувається з вмістом кешу ядра (скажімо L1), коли в цьому кеші відбувається контекстний комутатор?

Чи поведінка залежить від архітектури чи це загальна поведінка, яку дотримуються всі виробники чіпів?

Відповіді:


42

Це залежить як від процесора (не лише серії процесорів, він може змінюватись від моделі до моделі), так і операційних систем, але є загальні принципи. Чи є процесор багатоядерним, це не має прямого впливу на цей аспект; той самий процес може виконуватись на декількох ядрах одночасно (якщо це багатопотокова), і пам’ять може бути поділена між процесами, тому синхронізація кешу неминуча, незалежно від того, що відбувається в контекстному комутаторі.

Коли процесор шукає місце пам'яті в кеші, якщо є MMU , він може використовувати або фізичну, або віртуальну адресу цього місця (іноді навіть комбінацію обох, але це не дуже актуально тут).

Що стосується фізичних адрес, не має значення, який процес отримує доступ до адреси, вміст може бути спільним. Таким чином, немає необхідності недійсність вмісту кешу під час переключення контексту. Якщо два процеси відображають однакову фізичну сторінку з різними атрибутами, цим обробляється MMU (виступаючи як MPU (блок захисту пам'яті)). Мінусом фізично адресованого кешу є те, що MMU повинен сидіти між процесором і кешем, тому пошук кешу відбувається повільно. Кеш-пам'ять L1 майже ніколи не є фізичною адресою; можуть бути кеші вищого рівня.

Одна і та ж віртуальна адреса може позначати різні місця пам'яті в різних процесах. Отже, з практично адресованим кешем процесор і операційна система повинні співпрацювати, щоб процес знайшов потрібну пам'ять. Існує кілька загальних методик. Код комутації контексту, наданий операційною системою, може визнати недійсним весь кеш; це правильно, але дуже дорого. Деякі архітектури процесора мають у своєму кеш-рядку місце для ASID (ідентифікатор адресного простору) апаратну версію ідентифікатора процесу, що також використовується MMU. Це ефективно відокремлює записи кеша від різних процесів, і означає, що два процеси, які відображають одну і ту ж сторінку, матимуть непослідовні перегляди тієї самої фізичної сторінки (зазвичай існує спеціальне значення ASID, що вказує на спільну сторінку, але їх потрібно очистити, якщо вони не відображаються в одній і тій же адресі у всіх процесах, де вони відображені). Якщо операційна система дбає про те, щоб різні процеси використовували адресні простори, що не перекриваються (що перемагає певну мету використання віртуальної пам’яті, але іноді це можна зробити), рядки кешу залишаються дійсними.

Більшість процесорів, що мають MMU, також мають TLB . TLB - це кеш відображень від віртуальних адрес до фізичних адрес. Перед тим, як шукати фізичні адреси кешів, слід проводити консультації з TLB для швидкого визначення фізичної адреси; процесор може почати пошук кешу до завершення пошуку TLB, оскільки часто рядки-кандидати можуть бути ідентифіковані із середніх бітів адреси, між бітами, що визначають зміщення в лінії кешу, і бітами, що визначають сторінку. Фактично керовані кеші обходять TLB, якщо трапляється кеш-пам'ять, хоча процесор може ініціювати пошук TLB, коли він запитує кеш, у разі пропуску.

Самим TLB слід керувати під час переключення контексту. Якщо записи TLB містять ASID, вони можуть залишатися на місці; операційній системі потрібно лише очистити записи TLB, якщо їх ASID змінив значення (наприклад, через те, що процес закінчився). Якщо записи TLB є глобальними, вони повинні бути визнані недійсними при переході в інший контекст.


2
Дуже інформативні. Якби ви могли додати кілька прикладів того, як це робиться в реальних архітектурах, було б ще краще.
JohnTortugo

2
@JohnTortugo Те, що я написав, досить близько відповідає тому, що ви можете зробити на ARMv7 (наприклад, процесорі вашого смартфона) (єдиній архітектурі, де я коли-небудь писав код обробки MMU). Я очікую, що інші платформи, такі як x86, будуть досить схожими, але я не міг про них писати. Якщо ви шукаєте конкретну інформацію про реальну платформу, Комп'ютерна наука не є правильним сайтом, ви можете попросити про переповнення стека або електротехніку або вбудовану (запропоновану) .
Жил "ТАК - перестань бути злим"

10

Кеш типово не звертає уваги на контекстний комутатор. Тільки послідовність звернень до пам'яті визначає, які лінії кеша замінюються.

Політика заміни зазвичай є евристичною залежністю від виробника та конкретної мікроархітектури. Проблема полягає в тому, що евристика не може передбачити майбутнє, до якої адреси і, отже, кеш-лінія буде доступна далі.

Евристичний може бути простим, як LRU (найменш останнім часом). Але з сучасними процесорами евристика є більш складною.

Погляньте на посібник для розробників програмного забезпечення Intel® 64 та IA-32 архітектури Том 3 Розділ 11 пояснює кеш пам'яті та механізми управління кешем. AMD має це у розділі 7 Посібника з архітектурної програми AMD64 Том 2: Системне програмування . Для процесорів на базі ARM схоже, що PDF-файли доступні лише зареєстрованим клієнтам.


Чи можете ви дати посилання на перший абзац? Або пов'язані документи стосуються цього питання?
Рафаель

Поведінка сильно залежить від того, чи кеш фізично чи практично адресований. Політика заміни тут не стосується. Для ARM є інформація в технічних посібниках для процесорів, які є загальнодоступними, наприклад L1 на Cortex-A9 (що ви отримуєте в мобільних телефонах останнього покоління), хоча це може бути важко зрозуміти без посібника з непублічної архітектури .
Жил 'ТАК - перестань бути злим'

1
@Raphael я написав "типово", тому що з процесорами, з якими я стикався, кеш сам по собі не має ніяких знань про потоки, процеси, контексти тощо. Він просто реагує на доступ до пам'яті. Якщо кеш даних очищений і кеш інструкцій недійсний у контекстному комутаторі, то саме ця операція запускає цю дію, а не кеш-пам'ять. Якщо ви встановите іншу ОС, ця поведінка може змінитися.
uli

@Gilles Я раз спробував дати коротку відповідь і вирішив не писати про віртуальну пам’ять, оскільки це негайно стосується ОС. І є часовий графік, який слід також врахувати. "Нічого не змінюється" може бути відповіддю часу між контекстним комутатором та наступним доступом до пам'яті, оскільки вміст кешу може бути недійсним, але зовсім не змінено.
uli
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.