Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП. Часть 2. Контрольная работа 2.doc
Скачиваний:
87
Добавлен:
01.04.2014
Размер:
190.98 Кб
Скачать

Вопрос 2. Файлы, проецируемые в память. Отличие проецируемых файлов в ос Windows и unix.

  1. Файлы, проецируемые в память

Проецируемые в память файлы позволяют работать с файлами на диске так, как будто бы они целиком располагаются в виртуальной памяти. Для поддержки этого механизма операционная система используя менеджер виртуальной памяти и драйвер файловой системы проецирует файл на адресное пространство процесса.

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

Совместное использование данных в этом случае происходит по следующей схеме. Несколько процессов проецируют в память представления одного и того же объекта «проекция файла», то есть делят одни и те же страницы физической памяти. Поэтому, когда один процесс записывает данные в представление общего объекта «проекция файла», эти изменения немедленно отражаются в других процессах. Но для этого все процессы должны использовать одинаковое имя объекта «проекция файла».

Проецирование файла данных в адресное пространство процесса предоставляет разработчику мощный механизм работы с файлами. Спроецировав файл на адресное пространство процесса, программа получает возможность работать с ним, как с массивом. Это очень удобно при манипуляциях с большими потоками данных.

Для работы с проекциями файлов выполните следующие шаги:

  1. Создайте объект “файл”, вызовом функции CreateFile.

  2. Создайте объект “проекция файла”, вызовом функции CreateFileMapping. (Таблица 4).

  3. Закройте описатель файла, если он вам больше не нужен, вызовом CloseHandle.

  4. Отобразите весь или часть файла на адресное пространство, вызовом функции MapViewOfFile. (Таблица 5).

  5. Для отключения отображения воспользуйтесь UnmapViewOfFile. (Таблица 6).

  6. После окончания работы с проекцией файла закройте его описатель, вызовом функции CloseHandle.

Таблица 1 - Функция CreateFileMapping

HANDLE CreateFileMapping(    HANDLE hFile, // Описатель файла    LPSECURITY_ATTRIBUTES lpAttributes, // атрибут защиты    DWORD flProtect, // защита страниц    DWORD dwMaximumSizeHigh, // старшие 32 разряда размера файла    DWORD dwMaximumSizeLow, // младшие 32 разряда размера файла    LPCTSTR lpName // название объекта );

HANDLE hFile - описатель файла для отображения.

LPSECURITY_ATTRIBUTES lpAttributes - атрибут защиты. По умолчанию – NULL.

DWORD flProtect - атрибут защиты страниц проекции файла: PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY.

DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow - размер проекции файла. Для отображения всего файла передайте 0.

LPCTSTR lpName - название объекта для разделения между процессами. Может быть NULL.

Возвращаемое значение: Описатель объекта “проекция файла” в случае удачи. В случае ошибки – NULL.

Таблица 2 - Функция MapViewOfFile

LPVOID MapViewOfFile(    HANDLE hFileMappingObject, // описатель объекта “проекция файла”    DWORD dwDesiredAccess, // режим доступа к проекции    DWORD dwFileOffsetHigh, // старшие 32 разряда смещения в файле    DWORD dwFileOffsetLow, // младшие 32 разряда смещения в файле    SIZE_T dwNumberOfBytesToMap // число байт файла для проецирования );

HANDLE hFileMappingObject – описатель “проекция файла”

DWORD dwDesiredAccess – запрашиваемый доступ к представлению: FILE_MAP_WRITE, FILE_MAP_READ, FILE_MAP_COPY.

DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow – позиция в файле для начала проекции.

dwNumberOfBytesToMap – число байт для проецирования из файла. 0 для проецирования всего файла.

Возвращаемое значение: В случае удачи виртуальный адрес представления файла. NULL в случае ошибки.

Таблица 3 - Функция UnmapViewOfFile

BOOL UnmapViewOfFile(   LPCVOID lpBaseAddress // Начальный адрес );

Таблица 4 - Использование проецируемого в память файла

int _tmain(int argc, _TCHAR* argv[]) {    HANDLE hFile, hMap;    LPBYTE pData = NULL;

   // Открываем файл для чтения и записи    hFile = CreateFile("e:\\Sample.txt", GENERIC_WRITE | GENERIC_READ, 0,       NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTAL_SCAN, NULL);    if (hFile != INVALID_HANDLE_VALUE)    {       // Создаём проекцию всего файла      hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);      if (hMap)      {             // Получаем размер файла и закрываем его описатель за ненадобностью          DWORD dwSize = GetFileSize(hFile, NULL);          CloseHandle(hFile);          // Проецируем представление всего файла на адресное пространство          pData = (LPBYTE)MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);          if (pData)          {             // Заполняем оптимистичным значком содержимое             // !! Код ASCII             memset(pData, 1, dwSize);             // Закрываем представление файла             UnmapViewOfFile(pData);          }          // Закрываем проекцию файла          CloseHandle(hMap);      }   }   return 0; }

Мы рассмотрели проецирование представления файла, размещенного на диске. Но для целей обмена данными между разными процессами хранение этих данных на диске было бы очень неудобным. К счастью, Win32 API предусматривает возможность проецирования файлов непосредственно на физическую память из страничного файла, а не из специально создаваемого дискового файла.

Этот способ даже проще стандартного, рассмотренного выше. Во-первых, не нужно вызывать функцию CreateFile. Вы просто вызываете функцию CreateFileMapping и передаете значение INVALID_HANDLE_VALUE (или константу -1) в параметре hFile. Но при вызове функции CreateFileMapping следует передать в последнем ее параметре С-строку, содержащую имя этого объекта. Тогда другие процессы, если им понадобится доступ к разделяемой памяти, смогут вызвать функцию OpenFileMapping и передать ей то же самое имя. Учтите, что если разделяемая память используется в режиме записи данных более чем одним потоком, то вы должны предусмотреть синхронизацию работы этих потоков. Пример такой синхронизации при помощи объектов-событий рассматривается чуть ниже. Когда работа с объектом «проекция файла» завершена, процесс должен вызвать функцию CloseHandle. Как только все дескрипторы объекта будут закрыты, система освободит память, переданную из страничного файла.

Описанную технологию можно проиллюстрировать следующим фрагментом кода:

HANDLE hFile. hFileMapping:

PVOID pArray;

hFile = CreateFileC'File Name", ... );

hFileMapping = CreateFileMapping(hFile, ... ):

CloseHandle(hFile) :

pArray - MapViewOfFile(hFileMapping. ... );

CloseHandle(hFileMapping) ;

//

/ Работаем с файлом, как с массивом рАrrау /

//

UnmapVi ewOfFi1е(pArray);

В этом примере «закрывающие» операции выполняются сразу после использования соответствующего дескриптора объекта. Это уменьшает вероятность утечки ресурсов.

Таблица 5 - Функции для работы с файлами, проецируемыми в память

Win32

Linux

CreateFileMapingOpenFileMapping

mmapshmget

UnmapViewOfFile

munmapshmdt

MapViewOfFile

mmapshmat

UnmapViewOfFile(token->location);CloseHandle(token->hFileMapping);

munmap(token->location, token->nSize);close(token->nFileDes); remove(token->pFileName); free(token->pFileName);

mmap — POSIX-совместимый (англ. Portable Operating System Interface for Unix — Переносимый интерфейс операционных систем Unix) системный вызов Unix, позволяющий выполнить отображение файла или устройства на память. Является методом ввода/вывода через отображение файла на память и естественным образом реализует выделение страниц по запросу, поскольку изначально содержимое файла не читается с диска и не использует физическую память вообще. Реальное считывание с диска производится в «ленивом» режиме, то есть при осуществлении доступа к определённому месту.

В Linux, Mac OS X и BSD mmap может создавать несколько типов отображений.

Анонимные отображения — отображения пространства виртуальной памяти процесса, а не файла в пространстве файловой системы. По этой причине анонимное отображение схоже с функцией malloc и используется в некоторых реализациях malloc для определённых размещений. Следует заметить, что анонимные отображения не являются частью стандарта POSIX, хотя и реализованы почти во всех системах.

Файловые отображения позволяют отобразить файл в виртуальной памяти. Доступ к этим участкам памяти приводит к чтению файла. Если отображения распределено между процессами, запись в это пространство в одном процессе окажет воздействие на другие процессы. Если используется частное (private) отображение, то изменения не будут видны другим процессам и не будут записаны в файл.

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

mmap файлов может значительно уменьшить нагрузку на память для приложений, осуществляющих доступ к одному файлу. Если файл отображён в памяти, приложения могут разделять участок памяти, заключающей файл, вместо загрузки файла для каждого приложения, желающего осуществить доступ к нему.

К памяти, распределённой с помощью mmap, можно осуществлять доступ из дочерних процессов.

mmap можно использовать для реализации межпроцессного взаимодействия (IPC). В современных операционных системах mmap обычно предпочтительней взаимодействию через распределённую память в System V.

Основное различие между распределённой памятью System V (shmem) и вводом-выводом с распределением памяти (mmap) состоит в том, что распределённая память System V постоянна: не будучи явно удалены, данные будут храниться в памяти и оставаться доступными до тех пор, пока система не будет отключена. Память mmap не является постоянной между запусками приложения (только если отображение не зарезервировано в файле).

Список использованных источников

  1. Win 32-эфффективная разработка приложений [Электронный ресурс] : http://efrazrabotka.ru/category/

  2. Википедия [Электронный ресурс] : http://ru.wikipedia.org

  3. Всё для программирования [Электронный ресурс] : http://club.shelek.ru/view.php?id=11&startpoint=15

  4. Ковтун В. Управление процессами, потоками и памятью в ОС Windows / В. Ковтун. Часть 2. Лекция. – 2010 [Электронный ресурс] : http://www.nrjetix.com/fileadmin/doc/publications/Lectures/Lecture11-2.pdf

  5. Коньков К. А. Основы организации операционных систем Microsoft Windows / К. А. Коньков [Электронный ресурс] : http://www.intuit.ru/department/os/osmswin/9/3.html

  6. Операционные системы. Электронный учебник [Электронный ресурс] : http://avinout.com

  7. Операционные системы. [Электронный ресурс] : http://www.ist.ugtu.net/Methods/OS/contex.html

  8. Рихнер Дж. Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows / Дж. Рихнер. – Изд. 4. – СПб.: Питер; М.: Русская Редакция. – 2008. – 720 с.: ил.

  9. ТаненбаумЭ. Современные операционные системы /Э. Таненбаум. — СПб.: Питер, 2005. — 1038 с.: ил. ISBN 5-318-00299-4

  10. ТаненбаумЭ. Операционные системы: Разработка и реализация / Э.Таненбаум, А.Вудхалл. — СПб.: 2006. — ISBN 5-469-00148-2

  11. Фролов А. Операционная система Microsoft Windows 3.1 для программиста / А. Фролов, Г. Фролов. - Том 11, М.: Диалог-МИФИ, 1993 [Электронный ресурс] : http://frolov-lib.ru/books/bsp/v11/ch5.htm

24