Память и виртуальные адреса
Почему каждый процесс видит своё адресное пространство и как ОС делает эту иллюзию дешёвой.
Если бы процессы работали с физическими адресами напрямую, любая ошибка могла бы затереть данные другой программы, а каждая программа должна была бы знать, куда её загрузили. Ни то, ни другое недопустимо.
Виртуальная память делит адресное пространство на страницы фиксированного размера и отображает их на физические фреймы через таблицу страниц. MMU процессора делает преобразование при каждом обращении, поэтому программа никогда не видит реальных адресов.
Страницы, к которым давно не обращались, можно выгрузить на диск и снять отображение. Когда они понадобятся снова, страничное прерывание вернёт их обратно. Так программа может использовать больше памяти, чем есть физически — но не бесплатно.
/* Виртуальный адрес — это НЕ адрес в микросхеме памяти.
* MMU переводит его в физический на каждом обращении. */
#define PAGE_SHIFT 12 /* страница = 4 КиБ */
int vpn = vaddr >> PAGE_SHIFT; /* номер виртуальной страницы */
int off = vaddr & 0xFFF; /* смещение внутри страницы */
int pfn = page_table[vpn].frame; /* номер физического фрейма */
int paddr = (pfn << PAGE_SHIFT) | off;Практика
Почему два процесса могут использовать адрес 0x1000 и не мешать друг другу?
Подсказки
- Адрес, который видит программа, — не тот адрес, который видит микросхема памяти.
- Каждый процесс получает собственную таблицу преобразования.
12 XP
Расставь шаги обработки страничного прерывания по порядку.
Подсказки
- Аппаратура не может исправить это сама — ей придётся обратиться к ядру.
- Инструкция, вызвавшая прерывание, не теряется — она выполнится снова.
14 XP
В машине 8 ГБ RAM, а программе нужно 20 ГБ. Объясни, что произойдёт и почему это всё же может работать.
Подсказки
- Не вся программа нужна в один и тот же момент.
- У машины есть место помедленнее, чтобы положить остальное.
14 XP