Кэш страниц
Кэш страниц — это главный дисковый кэш, используемый ядром Linux. Как правило, ядро обращается к кэшу страниц, когда читает данные с диска или записывает их. Для удовлетворения запросов на чтение, исходящих от процессов в режиме пользователя, в кэш добавляются новые страницы. Если страницы еще нет в кэше, в нем создается новая запись, которая заполняется данными, прочитанными с диска. Когда памяти достаточно, страница хранится в кэше неопределенно долго и может быть использована другими процессами, что избавляет их от необходимости обращаться к диску.
Аналогичным образом, прежде чем записать страницу данных на блочное устройство, ядро проверяет, имеется ли в кэше соответствующая страница. Если нет, в нем создается новая запись, которая заполняется данными, подлежащими записи на диск. Ввод/вывод данных не начинается немедленно; обновление диска откладывается на несколько секунд, что дает другим процессам шанс еще раз изменить данные, подлежащие записи (иными словами, в ядре реализованы отложенные операции записи).
Код и структуры ядра никогда не считываются с диска и не записываются на него. Следовательно, страницы, включенные в кэш, могут быть следующих типов:
- страницы, содержащие данные обычных файлов. В главе16 мы обсудим, как ядро обрабатывает операции чтения, записи и отображения в память в отношении этих файлов;
- страницы, содержащие каталоги, Linux обрабатывает каталоги почти так же, как обычные файлы;
- страницы, содержащие данные, напрямую прочитанные из файлов блочных устройств (в обход слоя файловой системы). ядро обрабатывает их с помощью того же набора функций, что и страницы, содержащие данные обычных файлов;
- страницы, содержащие данные процессов, работающих в режиме пользователя, которые были выгружены на диск. можно заставить ядро держать в кэше страниц несколько страниц, чье содержимое было уже записано в область подкачки (обычный файл или раздел на диске);
- страницы, принадлежащие файлам специальных файловых систем, например, файловой системы shm, которая обеспечивает совместно используемую память для межпроцессного взаимодействия Нетрудно заметить, что каждая страница, включенная в кэш, содержит данные, принадлежащие какому-нибудь файлу. Этот файл, а точнее, его индексный дескриптор, называется владельцем страницы.
Практически все операции read и write работают с кэшем страниц. Единственное исключение бывает, когда процесс открывает файл с установленным флагом o direct. В этом случае кэш страниц не используется, а весь ввод/вывод происходит с участием буферов в адресном пространстве процесса, работающего в режиме пользователя. Некоторые приложения для работы с базами данных устанавливают флаг o direct, чтобы иметь возможность применять собственный алгоритм кэширования.
Разработчики ядра реализовали кэш страниц так, чтобы он удовлетворял двум главным требованиям:
- быстро находить конкретную страницу, содержащую данные, имеющие отношение к указанному владельцу. Чтобы от кэша страниц была заметная польза, поиск в нем должен происходить очень быстро;
- хранить информацию о том, как именно должна обрабатываться каждая страница в кэше при чтении или записи ее содержимого. Например, чтение страницы из обычного файла, блочного устройства или области выгрузки должно выполняться по-разному, и ядро должно выбрать правильную операцию, в зависимости от того, кто владеет страницей.
Естественно, что единицей информации, хранящейся в кэше страниц, является страница данных. страница не обязательно должна содержать физически смежные блоки диска, поэтому ее нельзя идентифицировать номером устройства и номером блока. Поэтому страница в кэше идентифицируется владельцем и индексом внутри данных владельца — как правило, индексным дескриптором и смещением внутри соответствующего файла.
Предыдущая страница | 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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница