ВУЗ:
Составители:
7
Функция идентична lseek за исключением того, что работает с 64-битными
файлами.
Возможно открыть несколько дескрипторов для одного и того же файла. В этом
случае позиционирование указателя для одного дескриптора не влияет на другие.
off_t
Это арифметический тип данных, используемый для представления размеров
файлов. В Linux это значение равно long int. Если компиляция выполнялась с флагом
_FILE_OFFSET_BITS == 64, этот тип данных заменяется off64_t.
off64_t
Этот тип данных используется также, как и off_t.
Ввод/вывод с отображением на память
В современных операционных системах существует возможность отобразить
файл на область в оперативной памяти. Когда это сделано, доступ к файлу можно
получить как к обычному массиву.
Этот способ более эффективен, чем использование read и write, так как можно
загружать в память только те области файлы, которые необходимы программе.
Механизм доступа к еще не загруженных в память участкам файла идентичен тому,
который используется для виртуальной памяти при реализации свопинга. Так как
обработанные участки файла могут быть сохранены обратно на диск, существует
возможность отображать в память файлы гораздо большего размера, чем объем
оперативной памяти. Единственным ограничителем является размер адресного
пространства операционной системы. В 32-битной операционной системе
теоретический лимит размера файла – 4 Gb, в действительности этот размер несколько
меньше, так как некоторые участки памяти уже заняты операционной системой и
другими программами.
Отображение в память работает только с целыми страницами памяти. Поэтому
адреса буферов для отображения должны быть выровнены на страницу, а длина
округлена. Для определения размера страницы памяти можно использовать следующий
вызов:
size_t page_size = (size_t) sysconf (_SC_PAGESIZE);
Следующие функции определены в заголовочном файле <sys/mman.h>.
void * mmap (void *ADDRESS, size_t LENGTH,int PROTECT, int FLAGS,
int FILEDES, off_t OFFSET)
Функция создает новое отображение в память участка файла FILEDES,
ограниченного смещениями OFFSET и (OFFSET+LENGTH). ADDRESS задает
предпочтительный начальный адрес буфера отображения. Если начиная с этого адреса
существовало какое-либо другое отображения, оно уничтожается. Этот адрес может
быть динамически изменен если не задан флаг MAP_FIXED.
Аргумент PROTECT задает флаги, которые контролируют тип запрашиваемого
доступа. Он может принимать следующие значения: PROT_READ, PROT_WRITE и
PROT_EXEC, которые соответственно означают доступ на чтение, запись и исполнение.
Заметим, что многие аппаратные системы не могут предоставить доступ только на
запись без предоставления доступа на чтение.
Аргумент FLAGS контролирует метод отображения и может принимать
следующие значения:
MAP_PRIVATE Означает, что изменения, вносимый в данные, хранящиеся в
памяти никогда не будут отображены в соответствующем
файле. Другие процессы, работающие с тем же файлом не
смогут увидеть изменения, происходящие в файле. Такое
отображение называется частным;
Функция идентична lseek за исключением того, что работает с 64-битными файлами. Возможно открыть несколько дескрипторов для одного и того же файла. В этом случае позиционирование указателя для одного дескриптора не влияет на другие. off_t Это арифметический тип данных, используемый для представления размеров файлов. В Linux это значение равно long int. Если компиляция выполнялась с флагом _FILE_OFFSET_BITS == 64, этот тип данных заменяется off64_t. off64_t Этот тип данных используется также, как и off_t. Ввод/вывод с отображением на память В современных операционных системах существует возможность отобразить файл на область в оперативной памяти. Когда это сделано, доступ к файлу можно получить как к обычному массиву. Этот способ более эффективен, чем использование read и write, так как можно загружать в память только те области файлы, которые необходимы программе. Механизм доступа к еще не загруженных в память участкам файла идентичен тому, который используется для виртуальной памяти при реализации свопинга. Так как обработанные участки файла могут быть сохранены обратно на диск, существует возможность отображать в память файлы гораздо большего размера, чем объем оперативной памяти. Единственным ограничителем является размер адресного пространства операционной системы. В 32-битной операционной системе теоретический лимит размера файла – 4 Gb, в действительности этот размер несколько меньше, так как некоторые участки памяти уже заняты операционной системой и другими программами. Отображение в память работает только с целыми страницами памяти. Поэтому адреса буферов для отображения должны быть выровнены на страницу, а длина округлена. Для определения размера страницы памяти можно использовать следующий вызов: size_t page_size = (size_t) sysconf (_SC_PAGESIZE); Следующие функции определены в заголовочном файле. void * mmap (void *ADDRESS, size_t LENGTH,int PROTECT, int FLAGS, int FILEDES, off_t OFFSET) Функция создает новое отображение в память участка файла FILEDES, ограниченного смещениями OFFSET и (OFFSET+LENGTH). ADDRESS задает предпочтительный начальный адрес буфера отображения. Если начиная с этого адреса существовало какое-либо другое отображения, оно уничтожается. Этот адрес может быть динамически изменен если не задан флаг MAP_FIXED. Аргумент PROTECT задает флаги, которые контролируют тип запрашиваемого доступа. Он может принимать следующие значения: PROT_READ, PROT_WRITE и PROT_EXEC, которые соответственно означают доступ на чтение, запись и исполнение. Заметим, что многие аппаратные системы не могут предоставить доступ только на запись без предоставления доступа на чтение. Аргумент FLAGS контролирует метод отображения и может принимать следующие значения: MAP_PRIVATE Означает, что изменения, вносимый в данные, хранящиеся в памяти никогда не будут отображены в соответствующем файле. Другие процессы, работающие с тем же файлом не смогут увидеть изменения, происходящие в файле. Такое отображение называется частным; 7
Страницы
- « первая
- ‹ предыдущая
- …
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »