Возьмите следующий фрагмент кода:
f = open("/mnt/remoteserver/bar/foo.bin", O_RDONNLY);
while (true)
{
byteseread = read(f, buffer, 1000);
if (bytesread > 0)
ProcessBytes(buffer, bytesread);
else
break;
}
В приведенном выше примере допустим удаленный файл foo. bin имеет размер 1 МБ и никогда ранее не использовался клиентом. Итак, это примерно 1000 вызовов «чтения» для получения всего файла.
Далее, предположим, что сервер с каталогом, смонтированным на клиенте, находится через Интернет, а не локально. Быстрая пропускная способность для клиента, но с большой задержкой.
Каждый ли вызов «чтения» вызывает обратный путь к серверу и обратно для запроса дополнительных данных? Или протокол клиент / сервер распознает, что последующие чтения удаленного файла часто являются последовательными, и поэтому последующие блоки выталкиваются вниз до того, как приложение фактически сделало для него вызов read (). Следовательно, последующие вызовы чтения возвращаются быстрее, потому что данные были предварительно извлечены и кэшированы.
Выполняют ли современные протоколы сетевой файловой системы (NFS, SMB / Samba, любые другие?) Подобные оптимизации. Существуют ли протоколы сетевой файловой системы, настроенные для Интернета, которые имеют подобную оптимизацию?
Я изучаю личный проект, который может включать реализацию сетевой файловой системы через Интернет. Меня поразило, что производительность может быть выше, если можно уменьшить количество циклов обработки для файлового ввода-вывода.