Pull to refresh

Comments 12

Хорошая статья, важная, вот тут недавно задавался этим вопросом, но применительно к виртуальной машине v8.engine, считывал файлы в буфер, поскольку памятью в script -овых языка занимается специальные менеджеры, то прямого доступа к системным механизмам управления памятью нет и вот тут возникают очень много вопросов. Вот например, что будет делать менеджеры памяти в таких виртуальных машинах, если я буду загружать файлы в буферы памяти, теоретически я могу предположить, что например виртуальная машина такая умная, что она отобразит эти файлы на память процесса, а специально, созданные структуры в куче будут ссылаться на отображенные адреса в памяти процесса. Грубо говоря, в таких окружениях это все остается за кадром.
Многие удивляются, но все стандартные операции файлового ввода / вывода работают через страничный кэш.

В общем случае это не совсем так. Читать или не читать из кеша решает конкретная файловая система. Например, есть ФС целиком размещаемые в памяти. Им держать файлы в кеше смысла нет.

tmpfs — это POSIX интерфейс к page cache-у. Данные хранятся именно в последнем.
Почему столько Windows? DLL файлы в Linux, постоянные отсылки в винды. Нафига?
Для сравнения. А в чем проблема?
Есть один ньюанс. А именно невозможность асинхронных операций ввода-вывода при использовании отображения в память. Более того, процесс не имеет никакого контроля за тем, когда его выполнение прервётся для подкачки данных с диска. В ряде случаев это может весьма ощутимо влиять на производительность в худшую сторону.
процесс не имеет никакого контроля за тем, когда его выполнение прервётся для подкачки данных с диска

ровно так же, как и в случае использования выделенных буферов при наличии свопа. Ровно так же можно использовать mlock(all).
Оригинальное сообщение удалено.

Своп сам по себе убивает производительность, с этим ничего не сделать, только отключить его.
Невозможность асинхронного ввода-вывода с использованием page-cache — это проблема исключительно реализации линукса, в других ОС это утверждение может быть ложным.
Текущий поток блокируется, пока не будет подгружена соответствующая страница. Это by-design, так как поток стопорится при попытке обращения к памяти.
Вы определитесь, асинхронный ввод-вывод (AIO) или mmap :) Это, всё таки, разные интерфейсы.
В Linux на x86-платформе, ядро представляет файл в виде последовательности 4-килобайтных фрагментов. Если запросить прочтение всего навсего одного байта из файла, то этого приведет к тому, что 4-килобайтный фрагмент, содержащий данный байт, будет целиком прочитан с диска и помещен в страничный кэш. Вообще говоря, в этом есть смысл, потому что, во-первых, производительность при непрерывном чтении с диска (sustained disk throughput) является достаточно высокой, и, во-вторых, программы обычно читают более одного байта из некоторой области файла.

Так сделано не для того, чтоб ускорить чтение а потому что иначе сделать невозможно. С жесткого диска нельзя прочитать один байт. С диска можно прочитать только сектор(кластер) целиком. Аналогично и с записью. Поэтому операционная система, предоставляющая возможность читать файл побайтово, вынуждена читать с диска сектор(кластер) целиком а потом отдавать нужные байты по одному. При записи одного единственного байта в файл система прочитает нужный сектор(кластер), заменит нужный байт и запишет сектор(кластер) назад в файл. Такого рода механизмы были даже в MS-DOS, потому что так устроены интерфейсы жестких дисков.
Sign up to leave a comment.