Процессы могут также запрашивать отдельные отображения файла, что предотвращает просмотр любых сделанных ими изменений со стороны других процессов, отображающих файл, или обратную запись в сам файл.
Другим вопросом в системе виртуальной памяти является способ передачи информации в ядро при выполнении системных вызовов read или write. Для этих системных вызовов FreeBSD всегда копирует данные из адресного пространства процесса в буфер в ядре. Копия делается по ряду причин.
· Часто данные пользователя не выровнены по границе страницы и не являются кратным аппаратному размеру страницы.
· Если у процесса будет отобрана страница, на нее больше нельзя будет ссылаться. Некоторые программы зависят от того, что данные остаются в буфере даже после того, как эти данные будут записаны.
· Если процессу будет разрешено сохранить копию страницы (как это происходит в текущей семантике FreeBSD), страница должна быть помечена для копирования при записи. Страница для копирования при записи защищена от записи с помощью атрибута только для чтения. Если процесс попытается изменить страницу, ядро получит отказ записи. После этого ядро делает копию страницы, которую процесс может изменить. К сожалению, типичный процесс сразу же попытается записать новые данные в свой выходной буфер, так или иначе форсируя копирование данных.
· Когда страницы повторно отображаются на новые адреса виртуальной памяти, большая часть аппаратного обеспечения управления памятью требует, чтобы кеш преобразования адресов был выборочно очищен. Очистки кеша часто являются медленными. Общим результатом будет то, что для блоков данных менее 4-8 Кб перераспределение памяти медленнее, чем копирование.
Для операций чтения или записи, передающих большие объемы данных, копирование может требовать большого времени. Альтернативой копированию является переотображение памяти процесса в ядро. Самыми большими стимулами для отображения памяти являются потребности в доступе к большим файлам и в передаче больших объемов данных между процессами. Интерфейс предоставляет способ для выполнения обеих задач без копирования.
Системный вызов не поддерживается для процессов, работающих на различных машинах. Такие процессы должны взаимодействовать, используя сокеты, соединенные через сеть. Соответственно пересылка содержимого файла по сети является другой обычной операцией, для которой желательно избегать копирования. Исторически пересылка файла осуществлялась путем чтения файла в буфер приложения, а затем записи этого буфера в сокет. Этот подход требовал двух операций копирования данных: сначала из ядра в буфер приложения, затем из буфера приложения обратно в ядро, чтобы отправить их в сокет. В FreeBSD есть системный вызов sendfile, который посылает данные из файла в сокет, не используя никакого копирования.
- 12/05/2010 12:32 - Управление дескрипторами
- 12/05/2010 04:44 - Каналы 4.2BSD
- 11/05/2010 21:23 - Дескрипторы и ввод/вывод
- 11/05/2010 10:33 - Система ввода/вывода
- 11/05/2010 06:08 - Управление памятью внутри ядра
- 10/05/2010 11:56 - Проектные решения по управлению памятью BSD
- 10/05/2010 05:46 - Управление памятью
- 09/05/2010 22:28 - Группы процессов и сеансы
- 09/05/2010 13:03 - Сигналы
- 09/05/2010 05:44 - Управление процессами