Есть ли POSIX-способ для обеспечения двух файлов в последовательности, не блокируя?

StackOverflow https://stackoverflow.com/questions/2772134

Вопрос

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

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

Улов в том, что я хотел бы избежать блокировки, т.е. выполнять FSYNC, как для задержки, так и для пропускных способностей.

Есть идеи?

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top