4.6 Согласованность и долговечность данных
В этом разделе представлен краткий обзор проблем согласованности и долговечности данных и метаданных при выполнении операций ввода-вывода.
Что касается долговечности, GNU Fortran не предпринимает никаких усилий для гарантии сохранения данных в устойчивом хранилище. Если это необходимо, программист GNU Fortran может использовать встроенную функцию FNUM для получения дескриптора файла низкого уровня, соответствующего открытому Fortran-единице. Затем, используя, например, функцию ISO_C_BINDING, можно вызвать системный вызов для записи необработанных данных в устойчивое хранилище, такой как fsync на POSIX, _commit на MingW или fcntl(fd,
F_FULLSYNC, 0) на Mac OS X. Следующий пример демонстрирует, как вызвать fsync:
! Declare the interface for POSIX fsync function
interface
function fsync (fd) bind(c,name="fsync")
use iso_c_binding, only: c_int
integer(c_int), value :: fd
integer(c_int) :: fsync
end function fsync
end interface
! Variable declaration
integer :: ret
! Opening unit 10
open (10,file="foo")
! ...
! Perform I/O on unit 10
! ...
! Flush and sync
flush(10)
ret = fsync(fnum(10))
! Handle possible error
if (ret /= 0) stop "Error calling FSYNC"
Что касается согласованности, для обычных файлов GNU Fortran использует буферизированный ввод-вывод для повышения производительности. Этот буфер автоматически очищается при заполнении и в некоторых других ситуациях, например, при закрытии единицы. Также его можно явно очистить с помощью оператора FLUSH. Кроме того, буферизацию можно отключить с помощью переменных окружения GFORTRAN_UNBUFFERED_ALL и GFORTRAN_UNBUFFERED_PRECONNECTED. Специальные файлы, такие как терминалы и каналы, всегда небуферизованы. Однако иногда могут потребоваться дополнительные действия для того, чтобы другие процессы могли увидеть данные, записанные GNU Fortran, как показано ниже.
Платформа Windows поддерживает ослабленную модель согласованности метаданных, где метаданные файла записываются в каталог лениво. Это означает, что, например, команда dir может показать устаревшее значение размера файла. Можно принудительно обновить метаданные каталога, закрыв единицу или вызвав _commit для дескриптора файла. Однако следует учитывать, что _commit принудительно запишет все необработанные данные в устойчивое хранилище, что часто является очень медленной операцией.
Система сетевых файлов (NFS) реализует ослабленную модель согласованности, называемую согласованностью «открытие-закрытие». Закрытие файла принуждает к записи необработанных данных и метаданных на сервер, а открытие файла заставляет клиента связаться с сервером, чтобы перепроверить кэшированные данные. fsync также заставит очистить необработанные данные и метаданные на сервере. Аналогично open и close, получение и освобождение fcntl блокировок файлов, если сервер их поддерживает, также принудит к проверке кеша и очистке необработанных данных и метаданных.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gfortran/Data-consistency-and-durability.html