Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
22700_62_OSBD_Prakticheskie.doc
Скачиваний:
25
Добавлен:
11.02.2015
Размер:
1 Мб
Скачать
☆

1. Структура и механизмы ос

1.1. Цель практического занятия

Данное занятие проводится интерактивнона основе самостоятельно проработанных и представленных материалов по построению ОС.

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

1.2. План занятия

Занятие организовано в форме изложений студентами подготовленных материалов, по которым организуется обсуждение следующих вопросов:

  • Ядро и вспомогательные модули ОС;

  • Многоуровневое построение ядра;

  • Системные вызовы;

  • Механизмы планирования;

  • Диспетчеризация процессов;

  • Организация очередей процессов.

1.3 . Используемые технологии

Для лучшего усвоения материала желательно проведение занятия с использованием компьютера.

1.4. Примеры для анализа

В качестве отправной точки анализа и обсуждения используется пример архитектуры UNIX:

Ядро и вспомогательные службы в UNIX

1.5. Вопросы и литература

1. Какие стратегии планирования применяются в системах с разделением времени?

2. Что такое «кольцевая очередь»?

3. Различаются ли понятия «время ожидания» и «время отклика»?

4. Когда процесс переводится в очередь готовых к исполнению процессов?

5. Какие виды планировщиков процессов существуют?

6. Какие требования предъявляют к алгоритмам планирования?

7. В чем заключается идея организации экзоядра?

8. Чем привилегированный режим ОС отличается от пользовательского?

9. Что означает системный вызов?

10. Зачем нужен API?

Литература

Учебник / Учебное пособие

Раздел

Страницы

Таненбаум Э. Современные операционные системы. 3-е изд. - СПб.: Питер, 2010. - 1120 е.: ил.

2.4.1-2.4.4,2.4.6

1.6.1, 1.6.4, 1.7.1-1.7.6

80-86, 90-100 181-200, 201-203 187-191, 216-234

2. Организация многопрограммной работы: процессы и потоки

2.1. Цель практического занятия

Целью практического занятия является более подробное ознакомление с основным понятием ОС – процессом и анализ функций ОС по управлению процессами.

2.2. План занятия

В рамках занятия рассматриваются нижеследующие вопросы:

  • функции ОС по управлению процессами (process) на примере Win32 API;

  • другие структурные единицы (thread, fiber, job), которым может выделяться время процессора;

  • функции ОС по управлению потоками (thread) на примере Win32 API.

2.3 . Используемые технологии

Для лучшего усвоения материала желательно проведение занятия с использованием компьютера.

2.4. Содержательная часть занятия

Процессы создаются:

  • При инициализации системы;

  • При выполнении работающим процессом системного вызова, предназначенного для создания процесса;

  • По запросу пользователя на создание нового процесса.

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

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

  • обычного выхода (добровольно);

  • выхода при возникновении ошибки (добровольно);

  • возникновения фатальной ошибки (принудительно);

  • уничтожения другим процессом (принудительно).

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

Доступ к функциональности ОС возможен с помощью интерфейса прикладного программирования, или API. Такой интерфейс определяет набор функций, которые можно использовать в прикладном программировании, устанавливается разработчиком ОС и зависит от архитектуры процессора (ов). Например, для семейства ОС Windows корпорации Microsoft существуют Win32 API и Win64 API.

Для более полного представления «управления процессами» и возможностей программиста по действию объектом «процесс» ниже приведены некоторые функции Win32 API, предназначенныедля управления процессами.

Функция

Описание

CreateProcess

Создает новый процесс и его первичный поток

CreateProcessAsUser

Создает новый процесс и его первичный поток. Новый процесс работает в контексте безопасности указанного пользователя

CreateProcessWithLogonW

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

ExitProcess

Завершает процесс и все его потоки

GetCurrentProcess

Извлекает псевдо дескриптор для текущего процесса

GetCurrentProcessId

Извлекает идентификатор процесса для вызывающего процесса

GetCurrentProcessorNumber

Возвращает номер процессора, на котором исполнялся текущий поток

GetExitCodeProcess

Извлекает состояние завершения указанного процесса

GetGuiResources

Извлекает счетчик дескрипторов объектов для ресурсов GUI (графического интерфейса пользователя), находящихся в распоряжении текущего процесса

GetLogicalProcessorInformation

Извлекает информацию о логических процессорах и связанных аппаратных средствах

GetPriorityClass

Извлекает класс приоритета для указанного процесса

GetProcessAffinityMask

Извлекает маску схожести процесса для указанного процесса и системную маску схожести для системы

GetProcessHandleCount

Извлекает число открытых дескрипторов, которые принадлежат указанному процессу

GetProcessId

Извлекает ИД_процесса для указанного процесса

GetProcessIdOfThread

Извлекает ИД_процесса для процесса, связанного с указанным потоком

GetProcessIoCounters

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

GetProcessShutdownParameters

Извлекает параметры завершения работы для текущего вызывающего процесса

GetProcessTimes

Извлекает информацию временной диаграммы (тактирования) для указанного процесса.

GetProcessVersion

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

GetProcessWorkingSetSize

Извлекает минимальные и максимальные размеры рабочего набора указанного процесса

GetStartupInfo

Извлекает содержимое STARTUPINFO

OpenProcess

Открывает существующий объект процесса

SetEnvironmentVariable

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

SetPriorityClass

Устанавливает класс приоритета для указанного процесса

SetProcessAffinityMask

Устанавливает маску схожести процессора для потоков указанного процесса

SetProcessShutdownParameters

Устанавливает параметры завершения работы для текущего вызывающего процесса

TerminateProcess

Завершить указанный процесс и все его потоки

Для сравнения функций, которые предназначены для процессов и потоков, представляет интерес рассмотрение некоторых функций управления потоками.

Функция

Описание

CreateRemoteThread

Создает поток, который работает в виртуальном адресном пространстве другого процесса

CreateThread

Создает поток для исполнения внутри виртуального адресного пространства вызывающего процесса

ExitThread

Завершает поток

GetCurrentThread

Извлекает псевдо дескриптор для текущего потока

GetCurrentThreadId

Извлекает идентификатор потока вызывающего процесса

GetExitCodeThread

Извлекает состояние завершения указанного потока

GetThreadId

Извлекает идентификатор потока для указанного потока

GetThreadPriority

Извлекает значение приоритета значение для указанного потока

OpenThread

Открывает существующий объект «поток»

ResumeThread

Уменьшает счетчик приостановок для потока

SetThreadIdealProcessor

Задает предпочтительный процессор для потока

SetThreadPriority

Устанавливает значение приоритета для указанного потока

Sleep

Приостанавливает выполнение текущего потока на указанный промежуток времени

SleepEx

Приостанавливает текущий поток до тех пор, пока не выполнится указанное условие

SuspendThread

Приостанавливает указанный поток

SwitchToThread

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

TerminateThread

Завершить поток

ThreadProc

Зависящая от конкретного приложения функция, использующаяся как начальный адрес для потока

Объект job(задание) позволяет, чтобы группой процессов можно было управлять как одной единицей. Объекты job - именуемые, защищаемые, допускающие совместное использование. Они управляют атрибутами процессов, связанных с ними. Операции, выполненные над объектом job, воздействуютна все процессы, связанные с объектом job. Процессы связываются с объектом job с помощью функции AssignProcessToJobObject. ФункцияTerminateJobObject завершаетвсе процессы, связанные с объектом job.

Fiber («нить») -единица исполнения, которую «вручную» можетпланироватьприложение. Нить работает в контексте потоков, которые могут осуществлять их планирование. Каждый поток может осуществлять планированиемножества нитей. Планирование нити осуществляетсяпереключениемна другую нить. За синхронизацию отвечаетприложение.

#include <windows.h>

#include <stdio.h>

void main( VOID )

{

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) ); //инициализация структуры STARTUPINFO

si.cb = sizeof(si);

ZeroMemory( &pi, sizeof(pi) ); // инициализация PROCESS_INFORMATION

// Создать дочерний процесс с параметрами:

if( !CreateProcess( NULL, // без имени модуля (use command line).

TEXT("MyChildProcess"), // командная строка

NULL, // handle процесса не наследуется not inheritable.

NULL, // handle потока не наследуется

FALSE, // установка наследования handle в FALSE

0, // нет флагов создания

NULL, // использовать блок окружения родителя

NULL, // использовать директорий родителя

&si, // указатель на структуру STARTUPINFO

&pi ) // указатель на структуру PROCESS_INFORMATION)

{

printf( "Ошибка при создании файла (%d).\n", GetLastError() );

return; //возврат из main

}

// Ожидать выхода из дочернего процесса

WaitForSingleObject( pi.hProcess, INFINITE );

// Закрыть дескрипторы процесса и потока

CloseHandle( pi.hProcess );

CloseHandle( pi.hThread );

}