1) На самом деле и то и другое, но почему это не так.
2) Кэши работают с блоками данных, называемыми линиями, а байты в строке являются как виртуальными, так и физически смежными.Типичные размеры строки составляют 16,32,64 байта.Две смежные строки кэша должны быть физически смежными, если они находятся на одной странице.Типичные размеры страниц составляют 4,8,16 К. Таким образом, машина с 32-байтовой строкой кэша и 4K базовой страницы имеет 128 строк на страницу.
3,4) В элементах C структуры, объединения или массивапрактически смежные.От операционной системы зависит, будет ли она физически смежной.
(1) Часть 2: Существует еще один кэш, называемый буфером преобразования просмотра (TLB), в котором хранятся недавно использованные отображения страниц.Без такого механизма для каждой ссылки на память потребовались бы две ссылки на физическую память: одна для загрузки преобразования адресов памяти, которая затем применялась бы для генерации требуемой ссылки на память.
Предположим, что в вашем TLB было 32 записи (глупо малов эти дни), и у вас был код, который обходил массив следующим образом:
char *p;
for (p = array; p < array + 4096; p++) {
char *q;
for (q = p; q < p + 32 * 4096; q += 4096) {
*q += 1;
}
}
Вы бы эффективно имитировали машину без TLB, поскольку каждая ссылка на память '* q' будет отсутствовать в TLB инеобходимо извлекать из памяти.
Вы можете создать аналогичный патологический случай для кеша памяти, если вам известны детали ассоциативности и размера кеша;или если вам не повезло, вы можете случайно ударить его и задаться вопросом, почему ваша программа работает так медленно.