Linux Kernel (Ядро линукса) (часть 3)


Системные вызовы fsyncO и fdatasyncQ

Системный вызов fsyncO заставляет ядро записывать на диск все "грязные" буферы, принадлежащие файлу, заданному с помощью параметра fd (включая и буфер, содержащий индексный дескриптор этого файла, если необходимо). Соответствующая служебная процедура вычисляет адрес файлового объекта и вызывает метод fsync. Как правило, этот метод сводится к вызову функции writeback_singie_inode, которая записывает как грязные страницы, ассоциированные с выбранным индексным дескриптором, так и сам индексный дескриптор.

Системный вызов fdatasynco весьма похож на fsyncO, но записывает на диск только буферы, содержащие данные файла, а не те, в которых хранится информация индексного дескриптора. Поскольку в Linux 2.6 нет специфического файлового метода для fdatasync , этот системный вызов использует метод fsync и, следовательно, идентичен системному вызову fsync о.

Работа с файлами

Обращение к файлу на диске является довольно сложным видом деятельности, в которую вовлечены абстрактный слой виртуальной файловой системы средства взаимодействия с блочными устройствами и кэш страниц. В этой главе показано, как ядро выполняет операции чтения и записи файлов, основываясь на упомянутых функциональных возможностях. Материал этой главы относится как к обычным файлам, которые хранятся в дисковых файловых системах, так и к файлам блочных устройств. Эти два типа файлов мы далее именуем просто файлами.

Этап работы, о котором идет речь в этой главе, начинается после вызова метода чтения или записи некоторого файла. Мы покажем здесь, как каждая операция чтения заканчивается доставкой требуемых данных процессу, работающему в режиме пользователя, а каждая операция записи — данными, помеченными к отправке на диск Существует много разных способов обращения к файлу. В этой главе мы рассмотрим следующие случаи:
- канонический режим — файл открывается при сброшенных флагах o sync и o direct, а доступ к его содержимому осуществляется системными вызовами read и write . В этом случае системный вызов read блокирует вызывающий процесс до тех пор, пока данные не будут скопированы в адресное пространство режима пользователя (впрочем, ядру разрешается возвратить меньше байтов, чем было запрошено!). Системный вызов write работает совсем по-другому, поскольку он завершается, как только данные оказываются скопированы в кэш страниц (это называется "отложенной записью"). Этот случай описывается в разд. "Чтение и запись файла”;
- синхронный режим — файл открывается с установленным флагом o sync, либо флаг устанавливается позже системным вызовом fcntio. Этот флаг влияет только на операцию записи (операция чтения всегда блокирует процесс), которая приостанавливает вызвавший процесс, пока данные не будут фактически записаны на диск. Этот случай тоже рассмотрен в разд. "Чтение и запись файла
- режим отображения в память — после открытия файла приложение делает системный вызов mmap , чтобы отобразить файл в память. В результате файл появляется в оперативной памяти в виде массива байтов, и приложение обращается к элементам массива напрямую, без помощи системных ВЫЗОВОВ read, write И lseek. ЭТОТ случай обсуждается В разд. "Отображение в память”;
- режим прямого ввода/вывода — файл открывается с установленным флагом o direct. Любая операция чтения или записи переправляет данные непосредственно из адресного пространства режима пользователя на диск или в обратном направлении, в обход кэша страниц. Мы рассматриваем этот случай в разд. ".Прямой ввод/вывод" (значения флагов o sync и
o direct могут быть скомбинированы четырьмя разными способами);
- асинхронный режим — обращение к файлу происходит (либо через группу API-интерфейсов POSIX, либо при помощи системных вызовов, специфичных для Linux) таким образом, чтобы был выполнен асинхронный ввод/вывод”. Это означает, что запросы на пересылку данных никогда не блокируют вызывающий процесс. Вместо этого они выполняются в фоновом режиме”, а приложение продолжает обычную работу. Этот случай обсуждается в разд. "Асинхронный ввод/вывод".

Предыдущая страница | 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 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...