Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Проецирование файловых данных на адресное пространство процесса
Проецирование файловых данных на адресное пространство процесса выполняет следующая функция: function MapViewOfFile(hFileMappingObject: THandle; dwDesiredAccess: DWORD; dwFileOffsetHigh: DWORD; dwFileOffsetLow: DWORD; dwNumberOfBytesToMap: DWORD): Pointer; Где hFileMappingObject – дескриптор объекта «файл, проецируемый в память», возвращаемый функцией CreateFileMapping или OpenFileMapping. dwDesiredAccess – определяет вид доступа к данным. Возможные значения параметра dwDesiredAccess приведены в таблице 4.6.
Таблица 4.6 Возможные значения параметра dwDesiredAccess
dwFileOffsetHigh, dwFileOffsetLow - определяют смещение в файле. Так как Windows поддерживает файлы и их проекции размером до 16 экзабайтов, то данные параметры используются для определения 64-битового адреса: dwFileOffsetHigh определяет старшие 32-бита, а dwFileOffsetLow –младшие 32 бита. Задаваемое смещение должно быть кратно гранулярности выделения ресурсов. dwNumberOfBytesToMap – определяет сколько байтов файла данных должно быть спроецировано на адресное пространство процесса. Если этот параметр равен 0, то операционная система пытается спроецировать файл, начиная с указанного смещения и до конца файла. Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память» Для освобождения региона адресного пространства, содержащего спроецированный файл необходимо вызвать следующую фунцию: function UnmapViewOfFile(lpBaseAddress: Pointer): Boolean; где lpBaseAddress – базовый адрес освобождаемого региона, который должен совпадать со значением, полученным после вызова функции MapViewOfFile. Закрытие объектов ядра «файл, проецируемый в память» и «файл» Для закрытия объектов ядра «файл, проецируемый в память» и «файл» дважды вызывается функция: function CloseHandle(hObject: THandle): Boolean; где hObject – дескриптор объекта. Объекты ядра следует закрывать, после того, как работа с ними закончена, так как операционная система хранит информацию обо всех объектах ядра, используя для этих целей свои ресурсы. Следовательно, во избежание утечки ресурсов, неиспользуемые объекты ядра должны быть закрыты.
Примеры программ, выполняющих проецирование в память Пример 1 Приведенная программа с помощью механизма проецирования в память добавляет строку к существующему файлу. VAR hFile,hFileMap:THandle; pFile,Str:PChar; Size:Integer; begin Str:='Работа с файлами, проецируемыми в память'+#0; hFile:=CreateFile('C:\file1.txt',GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); If hFile=INVALID_HANDLE_VALUE then begin ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]); exit; end; Size:=GetFileSize(hFile,nil)+StrBufSize(Str)+1; hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil); If hFileMap=INVALID_HANDLE_VALUE then begin ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"', [GetlastError]); CloseHandle(hFile); exit; end; pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0); If pFile=nil then begin ShowMessageFmt('Ошибка %d при проецировании в память', [GetlastError]); CloseHandle(hFile); CloseHandle(hFileMap); exit; end; pFile[GetFileSize(hFile,nil)]:=#0; //Добавление строки Str в конец файла, проецируемого в память Strcat(pFile,Str); UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap); end;
Пример 2 Данная программа перед каждым словом вставляет три восклицательных знака. VAR hFile,hFileMap:THandle; pFile:PChar; Size,Size1,i,j,q:Integer; begin hFile:=CreateFile('file1.txt',GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); If hFile=INVALID_HANDLE_VALUE then begin ShowMessageFmt('Ошибка %d при открытии файла ',[GetLastError]); exit; end; Size1:=GetFileSize(hFile,nil); // Размер файла увеличивается на 30 байт (считаем, что этого будет достаточно при вставке новых символов) Size:=GetFileSize(hFile,nil)+30; hFileMap:=CreateFileMapping(hFile,nil,PAGE_READWRITE,0,Size,nil); If hFileMap=INVALID_HANDLE_VALUE then begin ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"',[GetlastError]); CloseHandle(hFile); exit; end; pFile:=MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0); If pFile=nil then begin ShowMessageFmt('Ошибка %d при проецировании в память',[GetlastError]); CloseHandle(hFile); CloseHandle(hFileMap); exit; end; For i:=Size1 to Size1+30 do pFile[i]:=' '; //Поиск слов i:=0; While i<Size1 do begin If ((i=0) and (pFile[0]<>' ')) or((pFile[i]<>' ') and (pFile[i-1]=' ')) then begin For q:=1 to 3 do begin For j:=Size1+1 Downto i+1 do pFile[j]:=pFile[j-1]; Size1:=Size1+1; end; pFile[i]:='!'; pFile[i+1]:='!'; pFile[i+2]:='!'; i:=i+4;
end else i:=i+1; end; UnMapViewOfFile(pFile); CloseHandle(hFile); CloseHandle(hFileMap); end; 4.4. Задания для самостоятельной работы 1. С помощью механизма проецирования в память запишите в обратном порядке содержимое текстового файла. 2. С помощью механизма проецирования в память замените в текстовом файле все строчные буквы на прописные и удвойте вхождение каждой цифры. 3. С помощью механизма проецирования в память замените в текстовом файле все прописные буквы на строчные и удалите все знаки препинания. 4. С помощью механизма проецирования в память добавьте к текстовому файлу вводимые с клавиатуры предложения. Каждое предложение начинайте с новой строки. 5. С помощью механизма проецирования в память выполните поиск и замену слов в текстовом файле. 6. С помощью механизма проецирования в память выполните удаление в текстовом файле всех вхождений любой введенной строки. 7. С помощью механизма проецирования в память добавьте к текстовому файлу содержимое другого файла. 8. С помощью механизма проецирования в память измените содержимое текстового файла таким образом, чтобы каждое слово начиналось с большой буквы, а каждое предложение начиналось с новой строки. 9. С помощью механизма проецирования в память удалите в текстовом файле все пробелы. 10. С помощью механизма проецирования в память замените в текстовом файле все пробелы на три символа «_». 11. С помощью механизма проецирования в память замените в текстовом файле все двухзначные числа на четыре символа «*». 12. С помощью механизма проецирования в память удалите из текстового файла все буквы латинского алфавита. 13. С помощью механизма проецирования в память удалите из текстового файла все знаки препинания. 14. С помощью механизма проецирования в память удвойте все вхождения некоторой буквы в файле. Например, текст «мама папа» должен иметь вид — «маамаа паапаа». Удваиваемая буква вводится с клавиатуры. 15. С помощью механизма проецирования в память удалите все вхождения некоторой буквы из файла. Например, текст «мама папа» должен иметь вид — «мм пп». Удаляемая буква вводится с клавиатуры. Подсчитайте количество удалений. 16. С помощью механизма проецирования в память проверьте, являются ли все слова в текстовом файле идентификаторами. Идентификатор – любое слово, состоящее из букв и цифр, причем, первый символ – буква. 17. С помощью механизма проецирования в память удалите из текстового файла все слова являющиеся целыми числами. 18. С помощью механизма проецирования проверьте в текстовом файле правильность написания сочетаний «жи», «ши», «ча», «ща», «чу» и «щу» и исправьте ошибки. 19. По правилам машинописи после запятой в тексте всегда ставится пробел. Составьте программу исправления ошибок такого типа в текстовом файле, используя механизм проецирования в память. 20. С помощью механизма проецирования в память удалите из текстового файла первое и последнее слова.
КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Для каких целей используется механизм проецирования в память? 2. Чем механизм проецирования в память отличается от работы с виртуальной памятью? 3. Опишите последовательность действий при проецировании в память. 4. Что случится, если при завершении проецирования в память не закрывать дескрипторы объектов с помощью функции CloseHandle?
5. Можно ли при проецировании в память увеличить размер файла? 6. Каким образом выполняется проецирование в память файлов, размер которых больше 4 Гбайт? ЛАБОРАТОРНАЯ РАБОТА № 5 СОЗДАНИЕ ПРОЦЕССОВ И ПОТОКОВ Цель работы Целью работы является изучение основных принципов организации многозадачных операционных систем. Все многозадачные операционные системы используют концепцию процесса и потока. В данной работе рассматриваются следующие вопросы: · Чередование выполнения нескольких процессов с целью повышения степени использования процессора; · Разделение ресурсов между процессами; · Организация обмена данными между процессами и потоками; · Изменение класса приоритета процесса и уровня приоритета потока. Теоретическое введение В теоретическом введении рассматриваются процедуры и функции ядра ОС Windows, применяемые для работы с процессами потоками. Создание процесса Для создания процесса используется функция CreateProcess, имеющая следующий вид: function CreateProcess (lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: Boolean; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): Boolean; stdcall; Входные параметры данной функции перечислены в таблице 5.1. Таблица 5.1 Параметры функции CreateProcess
Продолжение таблицы 5.1
Структура TStartupInfo. имеет следующий вид: TStartupInfo = record
cb: DWORD; lpReserved: Pointer; lpDesktop: Pointer; lpTitle: Pointer; dwX: DWORD; dwY: DWORD; dwXSize: DWORD; dwYSize: DWORD; dwXCountChars: DWORD; dwYCountChars: DWORD; dwFillAttribute: DWORD; dwFlags: DWORD; wShowWindow: Word; cbReserved2: Word; lpReserved2: Byte; hStdInput: THandle; hStdOutput: THandle; hStdError: THandle; end; Описание полей структуры TStartupInfo приведены в таблице 5.2. Таблица 5.2 Основные поля структуры TStartupInfo
Продолжение таблицы 5.2
Структура TProcessInformation имеет следующий вид: TProcessInformation =record hProcess: THandle; hThread: THandle; dwProcessId: DWORD; dwThreadId: DWORD; end; Описание полей структуры TProcessInformation приведены в таблице 5.3. Структура TProcessInformation содержит выходные данные и заполняется функцией CreateProcess.
Таблица 5.3 Основные поля структуры TProcessInformation
Если функция CreateProcess успешно выполнена, она возвращает значение true. Если произошла ошибка – возвращается false. Тогда информацию об ошибке можно получить, вызвав функцию GetLastError.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-06; просмотров: 477; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.8.247 (0.046 с.) |