Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мои шпоры ОСиСП(1).doc
Скачиваний:
32
Добавлен:
26.09.2019
Размер:
1.63 Mб
Скачать

Билет 10

1. Файлы, отображаемые в память (10) – 33

Альтернативой стандартному вводу/выводу является интерфейс представленный ядром ОС, который позволяет приложению отображать файл в память, то есть создавать соответствие один к одному между адресом в памяти и словом в файле. За счет такого механизма программа может обращаться к файлу через память как к любым другим данным, находящимся в памяти. Имеется механизм прозрачного отображения действий по отношению к данным в области памяти на данные, находящиеся в файле на диске:

#include <sys/mman.h>

Void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

Этот системный вызов запрашивает у ядра ОС разрешение на отображение этих len байтов из файла fd, начиная со смещения в файле offset. Разрешение на доступ отображает параметр prot, а допустимые возможности определяет flags.

Возможные значения prot:

PROT_READ, страница доступна для считывания

PROT_WRITE, страница доступна для записи

PROT_EXEC, страница доступна для выполнения

PROT_NONE, доступ к странице запрещен

Допустимые варианты flags:

MAP_FIXED, позволяет считать первый параметр, а если ядро не может разместить данные по указанному адресу, то выводит сообщение об ошибке

MAP_PRIVATE, отображение приватно для файла по отношению к процессу, изменения не видны для других процессов и не повторяются в физическом файле

MAP_SHAKE, действие видны для остальных процессов и отображаются на физических файлах

Первый же параметр addr служит для того, чтобы определять место в ОП, куда лучше всего отображать данные в файл. Если в качестве данного параметра представлено значение NULL (или 0), то ОС сама выбирает, куда отображать данные.

Отображение ведется по страницам. Страница – это наименьшая единица памяти, которая может обладать собственным разрешением и поведением. Отображения области памяти должны быть кратны размеру страницы, и оба параметра addr и offset должны быть выровнены на границе страницы.

Если параметр len не кратен страницам, для отображения формы области памяти с числом страниц, которое обеспечивает разрешение больше len, но ближнее по числу страниц. Но при этом пользовательский процесс не может выходить за границу len.

Для того, чтобы узнать размер страницы:

#include <unistd.h>

long sysconf(int name);

long page_size=sysconf(_SC_PAGESIZE);

В случае успешного завершения функции mmap возвращается адрес отображения в памяти, а в случае ошибки значение MAP_FAILED и устанавливает значения errno:

EACCESS – файл, указанный при помощи файлового дескриптора fd, не является обычным файлом или же режим, в котором открыт файл, конфликтует со значением prot или flags

EAGAIN – файл заблокирован

EBADF – значение fd не является допустимым

EINVAL – один или несколько параметров имеют недопустимое значение

ENFILE – достигнуто максимальное количество открытых файлов

ENODEV – используемая файловая система не поддерживает отображение в память

ENOMEM – у процесса недостаточно памяти

EOVERFLOW – выход за пределы адресного пространства

Программа принимает в качестве аргумента имя текстового файла и выводит содержимое этого файла на экран дисплея.

Достоинствами системного вызова mmap можно назвать то, что при его использовании не требуется дополнительное копирования, выполняемое при вызове read и write, что процесс выполнения действий достигается путем прямой работы с ОП, что для

поиска необходимых данных в отображении необходимо просто манипулировать указателем, а действия по позиционированию производить не требуется. Но отображение системного вызова mmap занимает целое число страниц, в памяти оно не должно выходить за пределы адресного пространства процесса, а манипулирование отображения в памяти требует определенной затраты ядра ОС.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]