Создание файлов, проецируемых в память
В общем случае, процессор ЭВМ не может работать непосредственно с содержимым файла до того, как он не будет прочитан в память. Если требуется просто прочитать файлы, а также модифицировать их, то помимо операции чтения данных из файла, должна быть выполнена операция записи модифицированных данных в файл. Поэтому стандартная процедура работы с дисковым файлом включает в себя следующие шаги:
1. Создание или открытие файла на диске;
2. Чтение требуемого участка файла в созданную заранее область памяти процесса;
3. Модификация прочитанных данных в программе процесса;
4. Запись модифицированных данных на прежнее место в дисковом файле.
Обычно, работа с файлом требует обращения не к одному участку внешней памяти, а к нескольким. Тогда перечисленные действия в программе должны выполняться многократно. Это ведет к снижению скорости выполнения программ. Более эффективно было бы чтение всего файла в ОП, поскольку в этом случае требуется только одна операция чтения в ОП в начале цикла обработки, и одна операция записи во внешнюю память в конце цикла. Однако такой подход возможен только для файлов относительно небольшого размера. Кроме того, в этом случае снижается надежность всей процедуры обработки, поскольку модифицированные данные записываются на диск только в конце сеанса обработки, и любой сбой в течение этого сеанса может привести к потере модифицированных данных.
В Windows существует способ работы с файлами, практически исключающий многократные физические операции чтения или записи в файл, которые должны выполняться средствами прикладной программы. Этот способ называется проецированием файла в память (FILE MAPPING). Он заключается в том, что конкретный файл включается в состав физической памяти процесса за счет создания системного объекта с названием «проекция файла».
Прим.Под ФП понимается совокупность участка ОП и участка файла внешней памяти.
Затем, в ВАП процесса выделяется участок (регион) достаточного размера, и часть физической памяти, включающая в себя объект типа «проекция файла», отображается на этот регион.
Отображение заключается в преобразовании адресов внешней памяти в виртуальные адреса региона. Дальнейшие операции с файлом заменяются операциями с его отображением, то есть проекцией файла в ВАП процесса. Для получения проекции файла и отображении её на регион ВАП используются соответствующие системные функции. В целом, схема проецирования файла в память заключается в следующем:
Основные этапы получения проекции файла в память включают:
1. Создание или открытие файла функциями CreateFile или OpenFile;
2. Создание в физической памяти системного объекта типа «проекция файла» с помощью системной функции CreateFileMapping;
3. Выделение в ВАП процесса региона и отображение на него созданной проекции с помощью функции MapViewOfFile;
4. Обращение по адресам региона, на который отображена проекция файла, с целью выполнения операций чтения и записи данных.
После проецирования файла в память, к нему возможны обращения как к обычной структуре данных типа массива, расположенной в ОП. В прикладной программе для этого не требуется выполнение файловых операций чтения или записи.
В действительности, файл, к содержимому которого осуществляется обращение, должен быть прочитан в память, но в данном случае, загрузку содержимого файла в память полностью осуществляют потоки ядра ОС, освобождая от этого программистов в прикладной программе.
Если размер файла таков, что он не помещается в память целиком, то система осуществляет последовательную загрузку тех участков файла, к которым в данный момент обращается программа.
В программе, в любой момент, файл, независимо от его размера, рассматривается как находящийся в ОП массив данных. Любая модификация записей спроецированного файла автоматически переносится во внешнюю дисковую память. Эта операция также выполняется средствами ОС, и прикладная программа в ней не участвует.