Для чтения одного байта требуется долгий путь от магнитной пластины / флэш-ячейки до локальной переменной Java.Это путь, по которому проходит один байт:
- Магнитная пластина / флэш-ячейка
- Внутренний буфер жесткого диска
- Шина SATA / IDE
- Буфер SATA / IDE
- шина PCI / PCI-X
- шина данных компьютера
- оперативная память компьютера через DMA
- OS Page-cache
- буфер чтения Libc, также известный как пространство пользователя
fopen()
буфер чтения - локальная переменная Java
По соображениям производительности большинствобуферизация файлов, выполняемая ОС, сохраняется в кэше страниц, сохраняя содержимое последних файлов чтения и записи в оперативной памяти.
Это означает, что каждая операция чтения и записи из вашего кода Java выполняется из локального буфера и в ваш локальный буфер:
FileInputStream fis = new FileInputStream("/home/vz0/F.txt");
// This byte comes from the user space buffer.
int oneByte = fis.read();
Страница обычно представляет собой один блок объемом 4 КБ памяти.Каждая страница имеет некоторые специальные флаги и атрибуты, один из которых является «грязной страницей», что означает, что на странице есть некоторые измененные данные, не записанные на физический носитель.
Некоторое время спустя, когда ОС решает сброситьгрязные данные обратно на диск, он отправляет данные в противоположном направлении от того, откуда они пришли.
Всякий раз, когда два разных процесса записывают данные в один и тот же файл, в результате получается:
- Невозможно, если файл заблокирован.Второй процесс не сможет открыть файл.
- Не определено, если запись выполняется в одну и ту же область файла.
- Ожидается, если работа выполняется в разных областях файла.
«Регион» зависит от размеров внутреннего буфера, которые использует ваше приложение.Например, в файл размером два мегабайта могут записываться два разных процесса:
- Один на первые 1 КБ данных (0; 1024).
- Другой на последних 1 КБdata (2096128; 2097152)
Перекрытие буфера и повреждение данных будут иметь место, только если размер локального буфера составляет два мегабайта.В Java вы можете использовать Channel IO для чтения файлов с детальным контролем того, что происходит внутри.
Многие транзакционные базы данных заставляют некоторые записи из локальных буферов ОЗУ назад на дисквыдача операции sync
.Все данные, относящиеся к одному файлу, сбрасываются обратно на магнитные пластины или флэш-ячейки, эффективно гарантируя, что при сбое питания данные не будут потеряны.
Наконец, файл с отображением памяти являетсяобласть памяти, которая позволяет пользовательскому процессу выполнять чтение и запись непосредственно из кэша страниц и в него, минуя буферизацию пространства пользователя.
Система Page Cache крайне важна для производительности в многозадачном защищенном режиме . ОС и все современные операционные системы (Windows NT и выше, Linux, MacOS, * BSD) поддерживают все эти функции.