Управление памятью
как Linux пользуется сегментацией в архитектуре 80x86 и блоками управления памятью для трансляции логических адресов в физические. Мы также говорили о том, что определенная часть оперативной памяти постоянно выделена ядру и служит для хранения кода ядра и статических структур с данными ядра.
Оставшаяся память называется динамической. Это ценный вычислительный ресурс, необходимый не только процессам, но и самому ядру. Фактически, производительность всей системы зависит от эффективности управления динамической памятью. Поэтому все современные многозадачные операционные системы пытаются оптимизировать использование оперативной памяти, выделяя ее только в случае необходимости и освобождая, как только это становится возможным.
Управление страничными кадрами
как процессор Intel Pentium может работать со страничными кадрами двух разных размеров 4 Кбайт и 4 Мбайт (или 2 Мбайт, если
включен механизм РАЕ). В операционной системе Linux в качестве стандартной единицы выделения памяти выбран размер страничного кадра 4 Кбайт.
Это упрощает управление памятью по двум причинам:
- исключения "ошибка обращения к странице”, возбуждаемые схемами управления памятью, легко интерпретируются. Либо запрошенная страница существует, но процессу запрещено к ней обращаться, либо страница отсутствует. Во втором случае аллокатор памяти должен выделить страничный кадр размером в 4 Кбайт и присвоить его процессу;
- хотя значения 4 Кбайт и 4 Мбайт и кратны размеру любого блока на диске, обмен данными между основной памятью и дисками в большинстве случаев происходит эффективнее при использовании меньшего размера.
Ядро должно отслеживать текущий статус каждого страничного кадра. Например, оно должно уметь отличать страничные кадры, содержащие страницы процессов, от страничных кадров с кодом или данными ядра. Аналогичным образом оно должно уметь определять, свободен ли страничный кадр, находящийся в динамической памяти. Страничный кадр в динамической памяти свободен, если он не содержит полезных данных. Он, наоборот, не свободен, когда содержит данные процесса, работающего в режиме пользователя, данные программного кэша, динамически выделенные структуры данных ядра, данные в буфере драйвера устройства, код модуля ядра и т. д.
Информация о состоянии страничного кадра хранится в дескрипторе страницы, имеющем тип раде, Все дескрипторы страниц образуют массив mem map. Поскольку каждый дескриптор имеет длину 32 байта, массив mem map занимает менее 1 всей оперативной памяти. Макрос virt to page(addr) возвращает адрес дескриптора страницы, соответствующего линейному адресу addr. Макрос pfn to page (pfn) возвращает адрес дескриптора страницы, ассоциированного со страничным кадром, имеющим номер pfn.
Читателю необязательно вникать в назначение всех полей дескриптора страницы прямо сейчас. В последующих главах мы будем неоднократно возвращаться к полям дескриптора страниц. Кроме того, некоторые поля могут нести разный смысл, в зависимости от того, свободен ли страничный кадр, и какой компонент ядра его использует.
Мы подробно опишем два поля:
- count— счетчик обращений к странице. Если он равен-1, соответствующий страничный кадр свободен и может быть присвоен любому процессу или самому ядру. Если счетчик имеет значение, большее или равное 0, страничный кадр присвоен одному или нескольким процессам или содержит какие-либо структуры данных ядра. Функция page count возвращает значение поля count, увеличенное на единицу, т. е. количество пользователей этой страницы;
- flags — включает в себя до 32 флагов, характеризующих состояние страничного кадра. Для каждого флага PG xyz в ядре определены макросы для манипуляций со значениями флага. Обычно макрос PageXyz возвращает состояние флага, а макросы setPageXyz и ciearPageXyz устанавливают и сбрасывают нужный бит, соответственно.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница