Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Экзамен ОС 2018

.pdf
Скачиваний:
117
Добавлен:
29.01.2018
Размер:
4.67 Mб
Скачать

Оглавление

LPOVERLAPPED lpOverlapped // указание начала участка ) ;

BOOL UnlockFileEx(

HANDLE hFile, // дескриптор файла

DWORD dwFlags, // вид блокировки и режим ожидания

DWORD dwReserved, // зарезервировано

DWORD nNumberOfBytesToUnlockLow, // млад. слово длины участка DWORD nNumberOfBytesToUnlockHigh, // старш. слово длины участка LPOVERLAPPED lpOverlapped // указание начала участка

) ;

dwFlags – определяет вид блокировки файла, а также режим ожидания доступности затребованной блокировки:

LOCKFILE_EXCLUSIVE_LOCK – запрос монопольной блокировки в режиме чтения/записи. Если это значение не задано, запрашивается разделяемая блокировка (только чтение).

LOCKFILE_FAIL_IMMEDIATELY – задает режим немедленного возврата функции с возвращаемым значением равным FALSE, если приобрести блокировку не удается. Если это значение не задано, функция переходит в режим ожидания.

lpOverlapped – используется для указания 64-битовой позиции начала участка файла, подлежащего блокированию;

dwReserved – значение этого параметра должно быть равным 0

Разреженные файлы

Прежде чем создать разреженный файл необходимо проверить поддержку

FILE_SUPPORTS_SPARSE_FILES со стороны файловой системы.

Для создания разреженного файла необходимо установить этому файлу атрибут FILE_ATTRIBUTE_SPARSE_FILE.

С помощью функции CreateFile () установить атрибут разреженного файла невозможно, для установки атрибута разреженного файла необходимо воспользоваться специальной функцией управления устройствами ввода-вывода

DeviceIoControl () с управляющим кодом FSCTL_SET_SPARSE.

Единственный способ сбросить бит этого атрибута состоит в том, чтобы переписать файл, например, при помощи вызова функция CreateFile () с флагом

CREATE_ALWAYS.

BOOL DeviceIoControl (

HANDLE hDevice, // дескриптор устройства

DWORD dwIoControlCode, // код операции

LPVOID lpInBufer, // буфер входных данных

DWORD nInBuferSize, // размер буфера входных данных

LPVOID lpOutBufer, // буфер данных результата

DWORD nOutBuferSize, // размер буфера результата

LPDWORD lpBytesReturned, // адрес данных для вывода

LPOVERLAPPED lpOverlapped // адрес структуры

Оглавление

Оглавление

// OVERLAPPED );

7.3 Организация асинхронной работы с файлами typedef struct _OVERLAPPED {

DWORD Internal;

//Используется операционной системой. //Хранит статус завершения операции.

DWORD InternalHigh; //Используется ОС. Хранит

//количество переданных байт. DWORD Offset;

//Позиция в файле, начиная с которой //необходимо производить операцию //чтения (записи).

DWORD OffsetHigh;//Количество байт для передачи. HANDLE hEvent;

//Описатель события, которое произойдет //при завершении операции чтения //(записи).

} OVERLAPPED;

DWORD WaitForSingleObject (HANDLE hObject, DWORD dwMilliseconds); hObject – идентифицирует объект ядра, относительно которого будет

выполняться синхронизация, в случае асинхронного ввода-вывода файла это обычно дескриптор объекта «событие»;

dwMilliseconds – указывает, сколько времени (в миллисекундах) поток готов ждать синхронизации:

значение «0» – функция просто проверит состояние объекта синхронизации; значение INFINITE (-1) – ожидание будет «вечным», пока объект

синхронизации не сработает.

Функция WaitForSingleObject () возвращает одно из следующих значений: WAIT_OBJECT_0 – синхронизация была выполнена;

WAIT_TIMEOUT – функция была завершена по тайм-ауту, синхронизация не выполнена;

WAIT_ABANDONED – для объекта типа «событие» не используется (используется для «семафоров» и «мьютексов»); WAIT_FAILED – функция завершилась с ошибкой.

BOOL HasOverlappedIoCompleted (LPOVERLAPPED lpOverlapped);

BOOL ReadFileEx(

HANDLE hFile, LPVOID lpBuffer,

DWORD nNumberOfBytesToRead,

LPOVERLAPPED lpOverlapped,

Оглавление

Оглавление

LPOVERLAPPED_COMPLETION_ROUTINE lpcr)

BOOL WriteFileEx(

HANDLE hFile, LPVOID lpBuffer,

DWORD nNumberOfBytesToWrite,

LPOVERLAPPED lpOverlapped,

LPOVERLAPPED_COMPLETION_ROUTINE lpcr)

VOID CALLBACK FileIOCompletionRoutine(

DWORD dwErrorCode,

DWORD dwNumberOfBytesTransfered,

LPOVERLAPPED lpOverlapped);

VOID Sleep (DWORD dwMilliseconds);

Функция приостанавливает поток на dwMilliseconds миллисекунд. Особенности выполнения функции Sleep (): поток добровольно

отказывается от остатка кванта времени; система приостанавливает поток на период, примерно равный заданному;

Вы можете вообще запретить планировать поток, передав в качестве dwMilliseconds значение INFINITE (-1);

Вы можете вызвать Sleep и передать в качестве dwMilliseconds ноль. В этом случае поток будет вытеснен с процессора и помещен в очередь ожидания. Однако поток снова будет запущен, если нет других готовых потоков с тем же приоритетом.

DWORD SleepEx(DWORD dwMilliseconds, BOOL bAlertable);

Функция приостанавливает выполнения потока до наступления события ввода/вывода или на время.

Отличия выполнения от функции Sleep ():

если параметр bAlertable = FALSE, то функция ведет себя аналогично

Sleep();

если параметр bAlertable = TRUE, и этот поток переходит в ожидание оповещения и может продолжить выполнение после срабатывания вызова APC или истечение времени блокировки;

функция возвращает значение WAIT_IO_COMPLETION, если завершение произошло в результате срабатывания вызова APC.

Текущий поток помещает АРС в очередь целевого потока с помощью функции:

DWORD QueueUserAPC(

PAPCFUNC pfnAPC, // указатель на APC-функцию

HANDLE hThread, // дескриптор целевого потока ULONG_PTR dwData // передаваемое APC-функции значение

);

Оглавление

Оглавление

В случае успешного завершения функция возвращает – ненулевое значение, иначе – ноль.

С помощью функции FlushFileBuffers () вы можете принудительно заставить операционную систему записать на диск все изменения для файла, дескриптор которого передается этой функции через единственный параметр:

BOOL FlushFileBuffers (HANDLE hFile);

В случае успешного завершения функция возвращает значение TRUE, при ошибке – FALSE.

8. Классификация методов распределения памяти. Методы без использования внешней памяти. Защита памяти.

8.1 Классификация методов распределения памяти

8.2 Методы без использования внешней памяти Фиксированные разделы

Самым простым способом управления оперативной памятью является разделение ее на несколько разделов фиксированного, но не обязательно равного размера (Fixed Partitioning).

Разбиение памяти на разделы выполняется вручную оператором во время запуска системы, таким образом максимальное число одновременно выполняемых

Оглавление

Оглавление

программ ограничено числом разделов вне зависимости от того, какой размер имеют программы (Multiprogramming with a Fixed number of Tasks).

Эта схема была реализована в IBM OS/360, DEC RSX-11 и ряде других систем.

Задачами операционной системы при реализации данного метода управления памятью является: сравнение размера программы, поступившей на выполнение, и размера свободных разделов, и выбор подходящего раздела; загрузка программы и настройку её адресов.

Достоинства:

Простота реализации.

Быстрое переключение с выполнения одной программы на другую (переключение контекста).

Недостатки:

Жесткость реализации – в каждом разделе может выполняться только одна программа, то уровень мультипрограммирования заранее ограничен числом разделов

(Multiprogramming with a Fixed number of Tasks).

Внутренняя фрагментация – потеря части памяти, выделенной процессу, но не используемой им. Фрагментация возникает потому, что процесс не полностью занимает выделенный ему раздел.

Программа сохраняется в разделе строго непрерывно.

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

Алгоритмы распределения памяти фиксированными разделами

Для разделов разного размера: 1) использование общей очереди

-очередной процесс, поступивший на выполнение, помещается в общую очередь;

-высокая внутренняя фрагментация; 2) использование нескольких очередей

-для каждого размера раздела создается своя очередь; -стремится снизить внутреннюю фрагментацию; -однако очереди к некоторым разделам могут оказаться пустыми;

Для разделов равного размера: общая очередь для всех процессов.

Оглавление

Оглавление

Разделы переменной величины

В случае использования разделов переменной величины оперативная память машины не делится заранее на разделы и исходно вся считается свободной (Dynamic Partitioning).

Каждой вновь поступающей задаче выделяется необходимая ей память. Если достаточный объем памяти отсутствует, то задача не принимается на выполнение и стоит в очереди. После завершения задачи память освобождается, и на это место может быть загружена другая задача.

Таким образом, в произвольный момент времени оперативная память представляет собой случайную последовательность занятых и свободных участков (разделов) произвольного размера.

Задачами операционной системы при реализации данного метода управления памятью является:

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

при поступлении новой задачи – анализ запроса, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения поступившей задачи (стратегии выбора раздела см. далее);

загрузка задачи в выделенный ей раздел (настройка адресов) и корректировка таблиц свободных и занятых областей;

после завершения задачи корректировка таблиц свободных и

занятых областей.

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

Оглавление

Оглавление

Достоинства:

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

Разделы переменной величины используются процессами полностью, поэтому на уровне отдельных разделов полностью отсутствует фрагментация памяти (внутренняя фрагментация).

Недостатки:

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

Стратегии выбора свободного раздела:

First Fit - стратегия первого подходящего; (самый лучший) Best Fit - стратегия наиболее подходящего;

Worst Fit - стратегия наименее подходящего.

Перемещаемые разделы

Одним из методов борьбы с фрагментацией является перемещение всех занятых участков в сторону старших либо в сторону младших адресов, так, чтобы вся свободная память образовывала единую свободную область (Relocatable dynamic partitions).

Эта процедура называется «сжатием» (compact или garbage collection), она требует от операционной системы время от времени копировать содержимое разделов из одного места памяти в другое, корректируя таблицы свободных и занятых областей.

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

Хотя процедура сжатия и приводит к более эффективному использованию памяти, она может потребовать значительного времени, что часто перевешивает преимущества данного метода.

8.3 Защита памяти

Необходимость защиты памяти

Оглавление

Оглавление

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

Средства защиты при управлении памятью обычно выполняют: -проверку адреса ячейки памяти на корректность; -проверку разрешения доступа программы к адресуемой ячейке памяти;

-проверку прав доступа (разрешенных операций) программы по отношению к ячейке памяти.

Основные классические подходы защиты: -защита отдельных ячеек памяти; -методы граничных регистров; -метод ключей защиты; -защита памяти по привилегиям.

Защита отдельных ячеек памяти

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

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

Недостаток такого подхода – большая избыточность в кодировании информации из-за излишне мелкого уровня защищаемого объекта (ячейка).

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

Примеры реализации защиты отдельных блоков памяти

Система со страничной организацией ATLAS (1962) предоставляла для каждого блока памяти однобитовый флаг-замок. Любая попытка получения доступа к «запертому» блоку приводила к прерыванию.

В страничной системе XDS 940 (1969) для каждой страницы виртуальной памяти был назначен однобитовый флаг rol. Если rol == 1, то блок используется только для чтения, иначе разрешен любой тип доступа.

Методы граничных регистров

Методы граничных регистров реализовывают защиту по принципу «все или ничего» и заключаются в использовании одного или двух граничных регистров:

fence/fence register (однозадачная операционная система); base/bound registers (многозадачная операционная система).

Оглавление

Оглавление

fence/fence register

Простейший вариант предполагает использование одного граничного регистра (fence/fence register), который разделяет память программы и память для ОС.

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

Если адрес меньше значения регистра, то в доступе отказывается, если больше - доступ получен.

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

Обычно, адресное пространство компьютера начинается с нулевого адреса, ОС загружается в младшие адреса, а приложение, начиная со значения в граничном регистре + 1.

При использовании в ОС абсолютной адресации: -настройка во время компиляции

(если значение граничного регистра изменяется, то программа должна быть перекомпилирована)

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

перезагружена)

Первый вариант предполагает, что программа загружается в верхние адреса памяти в обратном порядке в направлении границы, таким образом граница может изменяться во время работы компьютера без перенастройки адресов приложения. Этот способ был реализован в ранних версиях PDP-11 (1970).

Оглавление

Оглавление

Другой вариант требует использования специального базового регистра, в котором будет храниться текущее смещение границы. Эта схема называется «динамическое перемещение» и она была реализована в суперкомпьютере CDC 6600 (1965).

base/bound registers

Более сложный вариант (base/bound registers) предполагает использование для каждого процесса верхнюю и нижнюю границы области памяти, куда программа имеет право доступа.

Значения граничных регистров устанавливаются ОС при загрузке программы в память.

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

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

Пример реализации – IBM 7090

Метод ключей защиты

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

Доступ программы к данному блоку памяти для чтения и записи разрешен, если ключи совпадают (то есть блок памяти относится к данной программе) или один из них имеет код «0» (код «0» присваивается операционной системе и блокам общей памяти).

Оглавление