
- •На курсовий проект (роботу) студента
- •К алендарний план
- •1 Постановка задачи
- •2 Выбор архитектуры вычислительной системы
- •3 Проектирование командного языка ос
- •4 Определение состава и общей структуры системы
- •5 Формирование базы данных ос
- •6 Программная реализация
- •7 Определение состава и общей структуры ос
6 Программная реализация
6.1 Средства взаимодействия процессов
Наличие механизмов взаимодействия дает произвольным процессам возможность осуществлять обмен данными и синхронизировать свое выполнение с другими процессами.
Процессы взаимодействуют посредствам семафоров.
Семафор представляет собой глобальный объект, позволяющий синхронизировать работу двух или нескольких процессов или потоков. Для программиста семафор - это просто счетчик. Если счетчик равен N, это означает, что к ресурсу имеют доступ N процессов. Рассмотрим функции для работы с семафорами:
– CreateSemaphor - создаёт глобальный объект-семафор. Возвращает дескриптор семафора.
HANDLE CreateSemaphore
{LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName}
где, первый параметр - указатель на структуру, определяющую атрибуты доступа. Может иметь значение для Windows NT. Обычно данный параметр равен NULL.Второй параметр - начальное значение счётчика семафора. Определяет, сколько задач имеют доступ к ресурсу в начале.Третий параметр - количество задач, которые имеют одновременный доступ к ресурсу.Четвёртый параметр - указатель на строку, содержащую имя семафора.
– OpenSemaphor - открыть уже созданный семафор. Возвращает дескриптор семафора. Данную функцию используют не так часто. Обычно создают семафор и присваивают его дескриптор глобальной переменной, а потом используют этот дескриптор в порождаемых потоках.
HANDLE OpenSemaphore
{ DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName}
Параметры функции: первый параметр - определяет желаемый уровень доступа к семафору. Возможны значения: SEMAPHORE_MODiFY_STATE = 2H, разрешить использование функции ReleaseSemaphore, SYNCHRONIZE = 100000H, разрешить использование любой функции ожидания, только для Windows NT, SEMAPHORE_ALLACCESS = 0F0000h+ SYNCHRONIZE+3H, специфицирует все возможные флаги доступа к семафору.
– WaitForSingleObject – ожидать открытие семафора. При успешном завершении, т. е. открытии доступа к объекту, функция возвращает 0. Значение 102h будет означать, что заданный период ожидания.
DWORD WaitForSingleObject
{HANDLE hHandle,
DWORD dwMilliseconds}
Первый параметр – дескриптор семафора.Второй параметр – время ожидания в миллисекундах. Если параметр равен INFINITE = 0FFFFFFFFh, то время ожидания не ограничено.
– ReleaseSemaphore – освободить семафор и позволить получить доступ к ресурсу другим процессам.
BOOL ReleaseSemaphore
{HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount}
Первый параметр – дескриптор семафора. Второй параметр – определяет какое значение должно быть добавлено к счетчику семафора. Чаще всего этот параметр равен единице. Третий параметр – указатель на переменную, куда должно быть перемещено предыдущее значение счетчика.
На рисунке 6.1 представлена конфигурация выполняемых процессов.
Рисунок 6.1 – Конфигурация процессов
В каждой вершине представленного графа выполняются различные функции: 1 – IT, 2 – IT, 3 – IT, 4 – IT, 5 – IT, 6 – IT, 7 – SS, 8 – SS.
“начало” — начинает выполнение (результат всегда = 1);
“конец” — завершает выполнение– выводит на экран свой аргумент, закрывает все потоки, освобождает ресурсы;
SS — SS(Arg) – вычисление суммы ряда Σ ABS(sin(i)) для i от 1 до модуля Arg;
IT — IT(Arg) – вычисление определенного интеграла ABS(cos(x)*sin(x)) на интервале от -Arg до +Arg методом трапеций с разбиением на 100*Arg интервалов;
Arg = Σ Rez * Nblock * Nvar,
где, Σ Rez – сумма результатов входящих блоков; Nblock – номер блока в конфигурации.
Рассмотрим алгоритм работы с семафором. Сначала при помощи функции CreateSemaphore создадим семафор, и его дескриптор присваивается глобальной переменной. Пред попыткой обращения к ресурсам доступ, к которым необходимо ограничить, поток должен вызвать функцию WaitForSingleObject. При открытии доступа функция возвращает 0. По окончании работы с ресурсом следует вызвать функцию ReleaseSemaphor. Тем самым увеличивается счётчик доступа на 1. С помощью семафора можно регулировать количество потоков, которые одновременно могут иметь доступ к ресурсу. Максимальное значение счетчика как раз и определяет, сколько потоков могут получить доступ к ресурсу одновременно.
Листинг программного кода представлен в приложении В.
6.2 Реализация логики управления файловой системой
Организация файловой системы, применяемой в ОС, является UNIX. В результате выполнения курсового проекта был разработан эмулятор файловой системы UNIX. Который позволяет выполнять различные операции над файлами. Такими как запись, копирование, удаление а также удаление всех файлов сразу (Quick Format).
Рисунок 6.2 – Расположение файловой системы Unix
Расположение файловой системы на диске показано на рисунке 6.2. Все дисковое пространство, отведенное под файловую систему, делится на четыре области:
загрузочный блок (boot), в котором хранится загрузчик операционной системы;
суперблок (superblock) - содержит самую общую информацию о файловой системе: размер файловой системы, размер области индексных дескрипторов, число индексных дескрипторов, список свободных блоков и список свободных индексных дескрипторов, а также другую административную информацию;
область индексных дескрипторов, порядок расположения индексных дескрипторов в которой соответствует их номерам;
область данных, в которой расположены как обычные файлы, так и файлы-каталоги. Специальные файлы представлены в файловой системе только записями в соответствующих каталогах и индексными дескрипторами специального формата, но места в области данных не занимают.
Доступ к файлу осуществляется путем последовательного просмотра всей цепочки каталогов, входящих в полное имя файла, и соответствующих им индексных дескрипторов. Поиск завершается после получения всех характеристик из индексного дескриптора заданного файла. Эта процедура требует в общем случае нескольких обращений к диску, пропорционально числу составляющих в полном имени файла. Для уменьшения среднего времени доступа к файлу его дескриптор копируется в специальную системную область памяти.
Файловая система спроектирована по аналогии с UNIX и содержит её основные блоки:
а) Суперблок — 12 бит. Содержит:
размер блока;
размер индексного дескриптора;
размер файловой системы.
б) Блок индексных дескрипторов — 64 бита. Содержит:
имя файла;
номер дескриптора;
размер файла;
десять блоков указующие на блоки данных;
три блока содержащие косвенные дескрипторы.
в) Блок данных. Размер блоков задается при создании образа файловой системы.
Спецификация команд эмулятора:
а) Create(char *img_name, int size, int size_blocks) — создаёт файл-образ с именем img_name, размером size, параметр size_blocks — указывает на размер блоков данных файловой системы.
б) CopyFromHDD(char *img_name, char *file) — копирует в файл-образ с именем img_name файл с жесткого диска с именем file.
в) CopyToHDD(char *img_name,char *file, char *fileToHDD) — копирует из файла-образа (img_name) файл с именем file на жесткий диск. FileToHDD — задает имя итогового файла.
г) Delete (char *img_name, char *file) — удаляет с файла-образа (img_name) файл с именем file.
д) Format (char *img_name) — форматирует файл-образ (img_name).
е) ShowRoot — показывает информацию о файловой системе и выводит информацию о файлах содержащихся в ней.
Листинг программного кода представлен в приложении В.