Операционные системы
Однозадачный режим в MS DOS
Система прерываний
Аппаратные прерывания
Прерывания
Обработка прерывания в контексте текущей задачи
Обработка прерывания с переключением на новую задачу
Блок состояния задачи TSS
Борьба с нехваткой памяти
Программный интерфейс DOS-программ
Структура оконных приложений
Оконная функция
Механизм сообщений
Программный интерфейс Windows
Виды многозадачности
Архитектура ОС Windows 3.1
Архитектура ОС Windows 95/98/Me
Архитектура ОС Windows NT/2000/XP
Квантование времени
Классы приоритетов
Граф состояния задачи
Мониторинг использования режимов ОС
Синхронизация задач
Синхронизация задач
Ожидание завершения задачи
Типы задач в Win32
Реализация множественных прикладных сред в Windows NT
Статическая компоновка
Динамическая компоновка
Динамически подключаемые библиотеки
Явное использование DLL
Службы в Win32
Обмен данных между задачами
DDE сервер
DDE сервер
DDE клиент
DDE клиент
Каналы
Каналы
Отображение файлов в память
Передача данных через сообщение
Передача данных через буфер обмена
Обмен данными через сетевой сокет

Процессы и задачи. Операционные системы. Лекция 2

1. Операционные системы

Лекция 2
Процессы и задачи

2. Однозадачный режим в MS DOS

• Однозадачный режим
• Монопольное использование ресурсов
компьютера
• Возможно прямое обращение к аппаратуре
• Два вида исполняемых файлов
– COM – все сегментные регистры равны, объем
программы 64K
– EXE – сегментные регистры содержат разные
значения, объем памяти ограничен 640K

3. Система прерываний

Номер
Описание
0
Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате
деления происходит переполнение (например, при делении на 0).
1
Прерывание пошагового режима. Вырабатывается после выполнения каждой машинной команды, если в
слове флагов установлен бит пошаговой трассировки TF. Используется для отладки программ.
2
Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных
машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от
сопроцессора.
3
Прерывание для трассировки. Это прерывание генерируется при выполнении однобайтовой машинной
команды с кодом CCh и обычно используется отладчиками для установки точки прерывания.
4
Переполнение. Генерируется машинной командой INTO, если установлен флаг OF. Если флаг не
установлен, то команда INTO выполняется как NOP. Это прерывание используется для обработки ошибок
при выполнении арифметических операций.
5
Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно используется для
печати образа экрана.
6
Неопределенный код операции или длина команды больше 10 байт (для процессора 80286).
7
Особый случай отсутствия математического сопроцессора (процессор 80286).
8
IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду.
9
IRQ1 - прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши.
19
Загрузка операционной системы.
1A
Обслуживание часов.
1B
Обработчик прерывания Ctrl-Break.
1C
Прерывание возникает 18.2 раза в секунду, вызывается программно обработчиком прерывания таймера.

4. Аппаратные прерывания

Номер
Описание
8
IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду.
9
IRQ1 - прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши. Используется
для чтения данных с клавиатуры.
A
IRQ2 - используется для каскадирования аппаратных прерываний в машинах класса AT.
70
IRQ8 - прерывание от часов реального времени.
71
IRQ9 - прерывание от контроллера EGA.
72
IRQ10 - зарезервировано.
73
IRQ11 - зарезервировано.
74
IRQ12 - зарезервировано.
75
IRQ13 - прерывание от математического сопроцессора.
76
IRQ14 - прерывание от контроллера жесткого диска.
77
IRQ15 - зарезервировано.
B
IRQ3 - прерывание асинхронного порта COM2.
C
IRQ4 - прерывание асинхронного порта COM1.
D
IRQ5 - прерывание от контроллера жесткого диска для XT.
E
IRQ6 - прерывание генерируется контроллером флоппи-диска после завершения операции.
F
IRQ7 - прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной
операции. Многие адаптеры принтера не используют это прерывание.

5. Прерывания

6. Обработка прерывания в контексте текущей задачи

7. Обработка прерывания с переключением на новую задачу

8. Блок состояния задачи TSS

9. Борьба с нехваткой памяти

• Оверлейные программы
Резидентный
модуль
Доступная память
Оверлей 1
Оверлей 2
Оверлей 3
Оверлей 4
• Использование EMS памяти
• Использование XMS памяти
• Использование DOS Extender’ов (расширителей)
DOS Extender – мини ОС, запускаемая до старта основной программы. Как
правило, реализует только функции управления памятью, остальные задачи
перепоручаются DOS. Пример 16-разрядного DOS-расширителя – RTM.EXE –
реализует DPMI (DOS Protected Mode Interface), использовался в компиляторе
Borland Pascal. Пример 32-разрядных расширителей – GO32, DOS4GW. Многие
игровые программы (DOOM) использовали их. Системы Windows сами могут
выступать в роли расширителей DOS.

10. Программный интерфейс DOS-программ

Mov AH,01h ; Поместить номер функции 21-го прерывания
Int 21h
; Выполнить 21-е прерывание
Mov BL,AL ; Поместить код прочитанного символа в регистр BL

11. Структура оконных приложений

int WINAPI WinMain( … )
{ HWND hWnd;
// дескриптор окна
WNDCLASS WndClass;
// струтура класса окна
MSG Msg;
// структура "сообщение"
/* заполнение класса окна */
WndClass.style = CS_HREDRAW | CS_VREDRAW; // стиль окна
WndClass.lpfnWndProc = ExamWndProc; // указатель на оконную функцию!

/* регистрация класса окна */
if (!RegisterClass(&WndClass)) return 1; // завершаем приложение при неудаче
/* создание окна */
hWnd = CreateWindow(szClassName, // имя класса окна
"Example N1", // заголовок окна (имя задачи)
...
if (!hWnd) { return 2; }// завершаем приложение, если не удалось создать окно
ShowWindow(hWnd,nCmdShow); // отображаем окно (только системные части)
UpdateWindow(hWnd); // посылаем себе сообщение WM_PAINT минуя очередь
/* цикл обработки сообщений завершается по сообщению WM_QUIT */
while (GetMessage(&Msg, NULL, 0,0))
{
}
DispatchMessage(&Msg); // диспетчеризация сообщений
return Msg.wParam; // вернуть код возврата, по сообщению WM_QUIT
}

12. Оконная функция

LRESULT CALLBACK ExamWndProc
( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam )
{ …
switch (Message)
{
case WM_CREATE :
hPen = CreatePen(PS_SOLID,5,RGB(0,0,200)); // создаем карандаш
return 0; // возвращаем 0, если мы обрабатывали сообщение
case WM_PAINT
:
// всегда начинаем рисование с вызова функции BeginPaint
hDC = BeginPaint(hWnd,&PaintStruc); // контекст устройства рисования
GetClientRect(hWnd,&Rect); // определяем размеры окна
SelectObject (hDC,hPen); // выбираем наш кранадаш
MoveTo(hDC,0,0); LineTo(hDC,Rect.right,Rect.bottom);
EndPaint(hWnd,&PaintStruc); // заканчиваем рисование
return 0; // возвращаем 0, если мы обрабатывали сообщение
case WM_DESTROY :
PostQuitMessage(0); // обязательно посылаем себе сообщение WM_QUIT
return 0;
// с кодом возврата, в нашем случае 0
default :
// ВСЕ НЕОБРАТАВЫАЕМЫЕ сообщения передаем следующей функции:
return DefWindowProc(hWnd,Message,wParam,lParam);
}
}

13. Механизм сообщений

HANDLE hWnd
int nMsg
int wParam
int lParam
TIME time
POINT pt

14. Программный интерфейс Windows

15. Виды многозадачности

• Однозадачность (с элементами многозадачности в виде
резидентных программ) – DOS
• Согласованная многозадачность (добровольная) –
Win16
• Вытесняющая многозадачность (принудительная) –
OS/2, UNIX, Win32
• Наличие системы приоритетов
• Динамическое квантование

16. Архитектура ОС Windows 3.1

17. Архитектура ОС Windows 95/98/Me

18. Архитектура ОС Windows NT/2000/XP

19. Квантование времени

Процесс 1
Задача 1
Процесс 2
Задача 3
Задача 4
Задача 5
Задача 2
Квантование времени
В Win32 любой процесс (программа) может состоять из нескольких
задач (нитей). Каждая из задач может иметь свой приоритет.
Каждый процесс обладает определенным уровнем привилегий,
обеспечивающих доступ его к ресурсам системы. Задачи
наследуют привилегии родительского процесса.

20. Классы приоритетов

Класс приоритета
Уровень приоритета
REALTIME_PRIORITY_CLASS
24 - процессы реального времени
HIGH_PRIORITY_CLASS
13 - высокоприоритетные процессы
NORMAL_PRIORITY_CLASS
9-переднего плана, 7 - обычные процессы
IDLE_PRIORITY_CLASS
4 - низкоприоритетные процессы
Значение
Относительное изменение уровня приоритета
THREAD_PRIORITY_TIME_CRITICAL
Устанавливается абсолютный уровень приоритета 15 или
31
THREAD_PRIORITY_HIGHEST
+2
THREAD_PRIORITY_ABOVE_NORMAL
+1
THREAD_PRIORITY_NORMAL
0
THREAD_PRIORITY_BELOW_NORMAL
-1
THREAD_PRIORITY_LOWEST
-2
THREAD_PRIORITY_IDLE
Устанавливается абсолютный уровень приоритета 1 или 16

21. Граф состояния задачи

22. Мониторинг использования режимов ОС

23. Синхронизация задач

• Критическая секция – в один момент может выполняться только
одна критическая секция с заданным идентификатором. Две нити
не могут выполнять одну и туже критическую секцию.
• Событие – многие объекты имеют состояние отмечен/не
отмечен. Например, файлы, задачи и собственно события.
Несколько нитей могут ожидать одно событие.
• Мютекс – взаимоисключающее событие. Несколько нитей могут
ждать мьютекс, но управление получит только одна, другим
придется ждать дальше.
• Семафор – имеет заданное начальное целое значение,
уменьшающееся тогда, когда нить его использует. Когда значение
семафора становится равным нулю, то нить, которая желает
получить семафор должна его ждать.

24. Синхронизация задач

Задача 1
hThread1
Создание неотмеченного события
Ожидание
WaitForSingleObject(hEvent, INFINITE)
Задача 2
hEvent
hThread2
Открывание события
Выполнение
длительной
работы
Отметка и сброс события
Выполнение работы
Продолжение работы задачи
Удаление события
Продолжение работы задачи

25. Ожидание завершения задачи

Задача 1
hThread1
Ожидание
WaitForSingleObject(hThread2, INFINITE)
Задача 2
Выполнение
длительной
работы
hThread2

26. Типы задач в Win32


GUI-приложение. Оконное приложение, которое может получать
сообщения. Окно может быть и невидимым, но все равно, оно может
получать сообщения.
Консольное приложение – не создает графического окна и не получает
сообщения. Использует консольный ввод/вывод в текстовом режиме,
может использовать мышь. Может обращаться ко многим функциям Win32,
в том числе и связанным с многозадачностью. Консольное приложение –
совсем не тоже самое, что приложение MS DOS. В Win16 консольных
приложений нет.
Сервисные приложения – особый вид консольных приложений.
Организуют специальную функцию, которая может обрабатывать команды,
посылаемые приложением, использующий данный сервис. Многие
драйверы являются сервисными процессами.
Драйверы – приложения, создающие интерфейс к устройствам. Могут
быть сервисами в сочетании с DLL-библиотеками.

27. Реализация множественных прикладных сред в Windows NT

28. Статическая компоновка

Программа 1
Программа 2
...
sprintf(...)
...
...
sprintf(...)
...
Код функции
sprintf
Код других функций
Код функции
sprintf
Код других функций

29. Динамическая компоновка

Программа 1
Программа 2
...
sprintf(...)
...
...
sprintf(...)
...
Программа 3
...
sprintf(...)
...
Библиотека
динамической
компоновки
Код функции
sprintf
Код других функций

30. Динамически подключаемые библиотеки


Библиотека функций, загружаемая по требованию, либо
автоматически, либо программа явным образом загружает ее с
помощью функции LoadLibrary.
В случае автоматической загрузки ПЕРЕД выполнением этой
программы Windows будет искать библиотеку в следующем порядке





в каталоге, содержащим исполняемый файл
текущем каталоге процесса
в системном каталоге Windows
каталоге Windows
каталогах, указанных в PATH
Большинство модулей Windows представляет собой DLL, например
krnl386.exe, gdi.exe, user.exe, ole2.dll, commdlg.dll. Формат DLL имеют
все программы, шрифты и прочие ресурсы.
В каталоге WINNT\SYSTEM32 может находиться более 1000 dll.

31. Явное использование DLL

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{ HINSTANCE hDll; // дескриптор библиотеки
FARPROC MyProcAddr; // адрес функции библиотеки
if (hDll = LoadLibrary("dll.dll"))//ненулевое значение в случае успеха
{
if (MyProcAddr = GetProcAddress(hDll,(LPSTR) 1 ))
// 1 - номер экспортируемой функции
(MyProcAddr)(); // вызов DLL, параметры - проверяйте сами!!!
else
MessageBox(NULL,"Не смогла найти функцию в DLL",
"Error in DLL-loading",MB_OK);
FreeLibrary(hDll); // освобождение библиотеки
}
else MessageBox(NULL,"Не смогла найти DLL","Error in DLLloading",MB_OK);
return 0; }

32. Службы в Win32

33. Обмен данных между задачами

• Обмен через Clipboard – инициируется пользователем.
• DDE – «традиционный» способ обмена данными, появился еще в
16-разрядных версиях Windows. Пример: приложение создает
иконку на рабочем столе или передает данные в Excel таблицу.
• OLE – более сложный способ обмена данными, в основном
связанный с представлением документов. Пример: вставка рисунка,
формулы в документ Word. Был реализован еще в Win 3.1
• Обмен данными через файлы, отображаемые в память
• Передача данных через сообщения.
• Передача данных через именованные и анонимные каналы
• Передача данных через Mailslot
• Через сетевой сокет

34. DDE сервер

HDDEDATA CALLBACK DDEServerCallback(
WORD wType,
// код транзакции
...
{
switch (wType)
{ case XTYP_CONNECT: // создание канала передачи
...
case XTYP_REQUEST: // запрос данных от сервера
...
case XTYP_EXECUTE: // запрос на выполнение команды
...
case XTYP_POKE: // передача данных серверу
...
case XTYP_CONNECT_CONFIRM: // подтверждение создания канала
...
case XTYP_DISCONNECT: // завершение работы канала
...
}
return (HDDEDATA) NULL;
}

35. DDE сервер

if (DdeInitialize(&idInst, // адрес идентификатора приложения
(PFNCALLBACK)DDEServerCallback, // адрес функции обратного вызова
APPCLASS_STANDARD, // флаги
0L)) // зарезервировано
return false;
else // успешно зарегестрировано
{ // получаем идентификаторы строк для сервиса, раздела и элемента данных
hwnd = hWnd;
hszService = DdeCreateStringHandle(idInst,szService,CP_WINANSI);
hszTopic
= DdeCreateStringHandle(idInst,szTopic, CP_WINANSI);
hszItem
= DdeCreateStringHandle(idInst,szItem,
CP_WINANSI);
// регистрируем сервис
DdeNameService(idInst,hszService,(HSZ) NULL, DNS_REGISTER);

36. DDE клиент

if (DdeInitialize(&idInst, // адрес идентификатора приложения
(PFNCALLBACK)DDEClientCallback, // адрес функции обратного вызова
APPCMD_CLIENTONLY, // флаги
0L)) // зарезервировано
return NULL;
else // успешно зарегестрировано
{ // создаем идентификаторы строк для сервиса, раздела и элемента данных
hszService = DdeCreateStringHandle(idInst,szService,CP_WINANSI);
hszTopic
= DdeCreateStringHandle(idInst,szTopic, CP_WINANSI);
hszItem
= DdeCreateStringHandle(idInst,szItem,
CP_WINANSI);
hConv = DdeConnect(idInst,hszService,hszTopic,(PCONTEXT) NULL);
return hConv; // возвращаем идентификатор созданного канала связи

37. DDE клиент

// Создаем идентификатор данных
hData =
DdeCreateDataHandle(idInst,szString,lstrlen(szString)+1,0,hszItem,CF_TEXT,0);
// запускаем транзакцию записи данных
if (hData)
hData = DdeClientTransaction(
(LPBYTE)hData, // адрес данных, передаваемых серверу
-1, // размер данных или -1 в случае передаче HDDEDATA
hConv, // иденгтификатор канала
hszItem, // идентификатор элемента данных
CF_TEXT, // формат данных
XTYP_POKE, // код транзакции
1000, // продолжительнос периода ожидания
&dwResult);// указатель на двойной слова, куда будет записан результат

38. Каналы

Каналы Pipes
В среде операционной системы Microsoft Windows NT вам доступно такое удобное средство
передачи данных между параллельно работающими процессами, как каналы типа Pipe. Это
средство позволяет организовать передачу данных между локальными процессами, а также
между процессами, запущенными на различных рабочих станциях в сети.
Каналы типа Pipe больше всего похожи на файлы, поэтому они достаточно просты в
использовании.
Через канал можно передавать данные только между двумя процессами. Один из процессов
создает канал, другой открывает его. После этого оба процесса могут передавать данные через
канал в одну или обе стороны, используя для этого хорошо знакомые вам функции,
предназначенные для работы с файлами, такие как ReadFile и WriteFile. Заметим, что
приложения могут выполнять над каналами Pipe синхронные или асинхронные операции,
аналогично тому, как это можно делать с файлами. В случае использования асинхронных
операций необходимо отдельно побеспокоиться об организации синхронизации.
Имена каналов
Имена каналов в общем случае имеют следующий вид:
\\ИмяСервера\pipe\ИмяКанала
Если процесс открывает канал, созданный на другой рабочей станции, он должен указать имя
сервера. Если же процесс создает канал или открывает канал на своей рабочей станции, вместо
имени указывается символ точки:
\\.\pipe\ИмяКанала
В любом случае процесс может создать канал только на той рабочей станции, где он запущен,
поэтому при создании канала имя сервера никогда не указывается.

39. Каналы

Каналы передачи данных Mailslot
Каналы Mailslot позволяют выполнять одностороннюю передачу данных от одного
или нескольких клиентов к одному или нескольким серверам. Главная особенность
каналов Mailslot заключается в том, что они, в отличие от других средств,
рассмотренных нами в этой главе, позволяют передавать данные в
широковещательном режиме.
LPSTR lpszMailslotName = "\\\\.\\mailslot\\$MailslotName$";
hMailslot = CreateMailslot(lpszMailslotName, 0,
MAILSLOT_WAIT_FOREVER, NULL);
\\ИмяДомена\mailslot\[Путь]ИмяКанала
Для передачи сообщений одновременно всем рабочим станциям сети первичного
домена имя задается следующим образом:
\\*\mailslot\[Путь]ИмяКанала

40. Отображение файлов в память

С помощью соответсвующей функции
программного интерфейса, приложение
Microsoft Windows NT может выбрать
любой фрагмент большого файла для
отображения в адресное пространство.
Поэтому, несмотря на ограничение
адресного пространства величиной 2
Гбайт, вы можете отображать (по
частям) в это пространство файлы
любой длины, возможной в Microsoft
Windows NT. В простейшем случае при
работе с относительно небольшими
файлами вы можете выбрать в
адресном
пространстве
фрагмент
подходящего размера и отобразить его
на начало файла.
Адресное пространство
приложения
Файл
5 Гбайт
2 Гбайт
1 Гбайт
1 Гбайт
0
Отображение
0

41. Передача данных через сообщение

// Записываем адрес и размер строки в структуру типа COPYDATASTRUCT
cd.lpData = szBuf; cd.cbData = strlen(szBuf) + 1;
// Посылаем сообщение серверному приложению RCLOCK
SendMessage(hWndServer, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&cd);
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ switch(msg)
{ case WM_COPYDATA: // Это сообщение посылается приложением-клиентом
{ // Копируем данные, полученные от приложения-клиента,во внутренний
буфер
strcpy(szBuf, ((PCOPYDATASTRUCT)lParam)->lpData);
break;}
..........
default: return(DefWindowProc(hWnd, msg, wParam, lParam));
}}

42. Передача данных через буфер обмена

OpenClipboard(hWnd) // открыть Clipboard
EmptyClipboard()
// очистить
SetClipboardData(CF_METAFILEPICT,hMem)// поместить данные
CloseClipboard()
// закрыть
OpenClipboard(hWnd);
if (IsClipboardFormatAvailable(CF_TEXT))// формат?
hMem=GetClipboardData(CF_TEXT)
CloseClipboard(); // обязательно закрыть

43. Обмен данными через сетевой сокет

Сервер
Клиент
Инициализация библиотеки
(функция WSASturtup)
Инициализация библиотеки
(функция WSASturtup)
Создание сокета
(функция socket)
Создание сокета
(функция socket)
Связывание сокета
(функция bind)
Подключение к серверу
(функция conect)
Прослушивание сокета
(функция Listen)
Прием подключения
(функция accept)
Прием и отсылка данных
(функции send recv)
Прием и отсылка данных
(функции send recv)
Закрытие сокета
(функции close)
Закрытие сокета
(функции close)
Освобождение ресурсов
(функции WSACleanup)
Освобождение ресурсов
(функции WSACleanup)
English     Русский Правила