5.4 Согласованность и долговечность данных
В этом разделе кратко рассматриваются проблемы согласованности и долговечности данных и метаданных при выполнении операций ввода-вывода.
Что касается долговечности, 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-5.4.0/gfortran/Data-consistency-and-durability.html