8.4. Функции fsync() и fdatasync(): очистка дисковых буферов
8.4. Функции fsync() и fdatasync(): очистка дисковых буферов
В большинстве операционных систем при записи в файл данные не передаются на диск немедленно. Вместо этого операционная система помещает их в резидентный кэш-буфер с целью сокращения числа обращений к диску и повышения оперативности программы. Когда буфер заполнится или произойдет какое-нибудь другое событие (например, истечет определенный промежуток времени), система запишет содержимое буфера на диск в ходе одной непрерывной операции.
В Linux тоже поддерживается такой тип кэширования. Обычно он способствует существенному повышению производительности. Но он же делает ненадежными программы, зависящие от целостности дисковых данных. Если система внезапно выйдет из строя, например вследствие сбоя ядра или отключения питания, любые данные, находящиеся в памяти и еще не записанные на диск, будут потеряны.
Предположим, создается программа обработки транзакций, которая ведет журнальный файл. В этот файл помещаются записи обо всех транзакциях, завершившихся на данный момент, чтобы в случае системного сбоя можно было восстановить целостность данных. Очевидно, не менее важна и целостность самого журнального файла: как только транзакция завершена, запись о ней должна быть немедленно занесена в дисковый файл.
Для реализации такого поведения ОС Linux предоставляет системный вызов fsync(). Эта функция принимает один аргумент — дескриптор записываемого файла — и принудительно переносит на диск все данные этого файла, находящиеся в кэш-буфере. Функция не завершается до тех пор, пока данные не окажутся на диске.
В листинге 8.3 показана функция, использующая данный системный вызов. Она записывает переданную ей строку в журнальный файл.
Листинг 8.3. (write_journal_entry.c) Запись строки в журнальный файл с последующей синхронизацией
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
const char* journal_filename = "journal.log";
void write_journal_entry(char* entry) {
int fd =
open(journal_filename,
O_WRONLY | O_CREAT | O_APPEND, 0660);
write(fd, entry, strlen(entry));
write(fd, " ", 1);
fsync(fd);
close(fd);
}
Аналогичное действие выполняет другой системный вызов: fdatasync(). Но если функция fsync() гарантирует, что дата модификации файла будет обновлена, то функция fdatasync() этого не делает, а лишь гарантирует запись данных. В принципе это означает, что функция fdatasync() способна выполняться быстрее, чем fsync(), так как ей требуется выполнить одну операцию записи на диск, а не две. Но в настоящее время в Linux обе функции работают одинаково, обновляя дату модификации.
Файл можно также открыть в режиме синхронного ввода-вывода, при котором все операции записи будут немедленно фиксироваться на диске. Для этого в функции open() следует указать флаг O_SYNC.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Буферы и заголовки буферов
Буферы и заголовки буферов Когда блок хранится в памяти (скажем, после считывания или в ожидании записи), то он хранится в структуре данных, называемой буфером (buffer). Каждый буфер связан строго с одним блоком. Буфер играет роль объекта, который представляет блок в
3.2 СТРУКТУРА ОБЛАСТИ БУФЕРОВ (БУФЕРНОГО ПУЛА)
3.2 СТРУКТУРА ОБЛАСТИ БУФЕРОВ (БУФЕРНОГО ПУЛА) Ядро помещает информацию в область буферов, используя алгоритм поиска буферов, к которым наиболее долго не было обращений: после выделения буфера дисковому блоку нельзя использовать этот буфер для другого блока до тех пор,
3.4 ЧТЕНИЕ И ЗАПИСЬ ДИСКОВЫХ БЛОКОВ
3.4 ЧТЕНИЕ И ЗАПИСЬ ДИСКОВЫХ БЛОКОВ Теперь, когда алгоритм выделения буферов нами уже рассмотрен, будет легче понять процедуру чтения и записи дисковых блоков. Чтобы считать дисковый блок (Рисунок 3.13), процесс использует алгоритм getblk для поиска блока в буферном кеше. Если
4.7 ВЫДЕЛЕНИЕ ДИСКОВЫХ БЛОКОВ
4.7 ВЫДЕЛЕНИЕ ДИСКОВЫХ БЛОКОВ Когда процесс записывает данные в файл, ядро должно выделять из файловой системы дисковые блоки под информационные блоки прямой адресации и иногда под блоки косвенной адресации. Суперблок файловой системы содержит массив, используемый для
Очистка диска
Очистка диска Говорят, что жесткий диск – «зеркало души» пользователя. Файлы у нерях всегда разбросаны как попало, «чайники» вообще с трудом представляют, что и где у них вообще может находиться... И лишь у опытных пользователей все разложено по полочкам, удобно и
Очистка диска
Очистка диска Для удаления информации с CD-RW щелкните мышью на команде Очистка диска меню Инструменты. Откроется окно Очистка диска (рис. 9.14).С помощью переключателя Выберите необходимый способ очистки укажите нужный способ очистки перезаписываемого
Очистка ячеек
Очистка ячеек Выше я уже говорила о том, что для удаления содержимого ячейки достаточно выделить ее и нажать Delete. Точно также можно поступить и с диапазоном ячеек. Однако имейте в виду, что при использовании клавиши Delete удаляются только данные, а форматирование ячейки и
10.11. Несколько буферов
10.11. Несколько буферов Во многих программах, обрабатывающих какие-либо данные, можно встретить цикл видаwhile ((n = read(fdin, buff, BUFFSIZE)) > 0) { /* обработка данных */ write(fdout, buff, n);}Например, программы, обрабатывающие текстовые файлы, считывают строку из входного файла, выполняют с ней
2.2.7.1 . Зеркалирование дисковых областей
2.2.7.1 . Зеркалирование дисковых областей Зеркалирование в INFORMIX-OnLine DS - это дублирование связной дисковой области, выделенной под базу данных, на такую же по размеру область. Исходная область называется первичной, а ее копия - зеркальной. Цели, для которых применяется
9.1. Очистка CD/DVD
9.1. Очистка CD/DVD Рассмотрим подробно задачу очистки дисков, которая находится в категории Extras (Дополнения). Прежде всего надо отметить, что не все диски можно очистить. Воспользоваться этой возможностью можно только для перезаписываемых CD-RW и DVD-RW. Чтобы очистить диски
5.3. Очистка реестра
5.3. Очистка реестра Под очисткой реестра понимается поиск и удаление неверных параметров реестра. Например, если в значении параметра указан путь, которого в вашей системе не существует, то этот параметр точно неверен, а значит, его следует
Очистка диска
Очистка диска Любой пользователь знает, что компьютер не только приносит пользу, но и вызывает головную боль. Все потому, что о нем, как и о домашнем любимце, нужно постоянно заботиться. Ежедневные разговоры с друзьями, серфинг в Интернете, установка и удаление
10.1. Очистка диска
10.1. Очистка диска Очистка диска – первый этап в его профилактике и ускорении работы.Существует множество программ для облегчения процесса поиска и очистки жесткого диска от ненужных данных. Примером такой программы может служить утилита The Mop (в переводе с английского
Очистка мыши
Очистка мыши Загрязнение мыши – нормальное явление, особенно если в помещении, где находится компьютер, редко проводится влажная уборка. Оптические мыши, в которых нет механических частей, засоряются реже, однако налипшая на коврик грязь все равно мешает нормальной
Очистка ячеек
Очистка ячеек В предыдущем уроке уже упоминалось, что для очистки ячейки достаточно сделать ее активной и нажать клавишу Delete. Таким же образом можно очистить сразу несколько ячеек, предварительно выделив нужный диапазон.Очистка приводит к удалению только имеющихся в