Существует ли способ posix, обеспечивающий последовательную очистку двух файлов без блокировки? - PullRequest
1 голос
/ 05 мая 2010

В моей программе у меня есть два файла, открытых для записи: файл содержимого, содержащий куски данных, и индексный файл, содержащий карту, поверх которой записаны куски данных.

Я хотел бы записать их оба на диск, насколько это возможно, с единственным ограничением, что блоки в файле данных должны быть записаны перед соответствующими блоками в файле карты (естественно).

Загвоздка в том, что я хотел бы избежать блокирования I.E. выполнение fsync как из-за задержек, так и из-за пропускной способности.

Есть идеи?

1 Ответ

1 голос
/ 06 мая 2010

Я не думаю, что вы можете сделать это легко за один путь выполнения. Вам нужен fsync, чтобы гарантировать запись на диск - и это должно будет ждать записи.

Я подозреваю, что это возможно (но не просто), делегировав задачу записи в отдельный поток или процесс. Создайте данные в вашей существующей программе и «запишите» их во второй поток / процесс, используя любой метод, который выглядит разумным. Это может быть неблокирующим. Затем второй поток записывает любые новые данные в данные в ваш файл содержимого, затем fsync, затем записывает файл индекса и снова проверяет наличие новых данных. Ключевые проектные решения касаются того, как вы разделяете два пути выполнения, как вы общаетесь между ними, и если вам нужно сообщить о обратной записи в основную программу. Это может по-прежнему иметь проблемы с задержкой и пропускной способностью, но это часть стоимости выбора синхронизации файла индекса и файла содержимого. По крайней мере, был бы шанс выполнить работу во время ожидания на диске.

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

...