Слайд 3Определение потока управления
Определим программу как набор переменных, в которых хранятся
данные, и набор инструкций, которые выполняют над этими данными некоторые
операции.
Последовательность инструкций, исполняемых во время работы программы, называется потоком управления внутри этой программы.
В общем случае, различные исходные данные порождают различные потоки управления.
Слайд 4Контекст потока
Поток управления можно представить как нить в программе, на
которую нанизаны инструкции, выполняемые микропроцессором.
Поэтому поток управления также называется нитью
(thread).
В русскоязычной литературе за потоком управления закрепилось название поток.
Cодержимое памяти, к которой поток имеет доступ во время своего исполнения, называется контекстом потока.
Слайд 5Пример программы
Например, рассмотрим следующую программу:
int a, b, с;
cin >> a
>> b;
if (a < b)
с = b - a;
else
c =
a - b;
cout << c << endl;
Слайд 6Пример потока
Предположим, что пользователь ввел следующие данные: 1 2.
Тогда
при работе программы будут выполняться следующие инструкции:
cin >> a >>
b;
if (a < b)
с = b - a;
cout << c << endl;
Слайд 7Пример потока
Теперь предположим, что пользователь ввел следующие данные: 2 1.
Тогда
при работе программы будут исполняться следующие инструкции:
cin >> a >>
b;
if (a < b)
else
c = a - b;
cout << c << endl;
Слайд 8Граф потока
Графически потоки управления могут быть представлен графом (блок схемой),
вершины которого обозначают инструкции, а дуги указывают последовательность исполнения инструкций.
Например,
для нашей программы граф потоков управления имеет следующий вид:
Слайд 10Многопоточные и однопоточные программы
Если в программе могут одновременно существовать несколько
потоков управления, то программа называется многопоточной.
А сами потоки в
этом случае называются параллельными.
Если в программе одновременно может существовать только один поток, то такая программа называется однопоточной.
Слайд 12Определение потока как пары
Потоки управления определяют динамическое поведение программы.
Для простоты
изложения предположим, что программа является однопоточной.
Программы исполняются процессором.
Поэтому поток можно
рассматривать как пару
поток = (процессор, программа)
Слайд 13Условия готовности программы к исполнению
Программа может исполняться процессором только в
том случае, если выполняются следующие условия:
процессор свободен и готов к
исполнению этой программы;
все системные ресурсы, необходимые для исполнения этой программы, свободны для использования.
В этом случае говорят, что программа готова к исполнению.
Слайд 14Состояния процессора и программы
Для формального описания условий готовности программы к
исполнению вводятся понятия:
состояние процессора,
состояние программы.
Слайд 15Возможные состояния процессора
Предполагают, что процессор может находиться в следующих состояниях:
процессор
не выделен для исполнения программы;
процессор выделен для исполнения программы.
Слайд 16Возможные состояния программы
Предполагают, что программа может находиться в следующих состояниях:
программа
не готова к исполнению процессором;
программа готова к исполнению процессором.
Слайд 17Краткие обозначения состояний процессора и программы
Для краткости записи, введем для
этих состояний следующие названия:
состояния процессора:
«не выделен»;
«выделен»;
состояния программы:
«не готова»;
«готова».
Слайд 18Состояния потока
Тогда состояние потока можно определить как пару состояний:
состояние потока
= (состояние процессора, состояние программы)
Перечислив различные комбинации состояний процессора и
программы, можно описать всевозможные состояния потока.
Слайд 19Возможные состояния потока
Введем для состояний потока следующие названия:
поток блокирован =
(не выделен, не готова);
поток готов к выполнению = (не выделен,
готова);
поток выполняется = (выделен, готова).
Будем считать, что состояние (выделен, не готова) является недостижимым для потока.
Т. е. процессор не выделяется программе, не готовой к исполнению.
Слайд 20Краткие обозначения состояний потока
Более кратко эти состояния потока будем обозначать
словами:
«блокирован»,
«готов»,
«выполняется».
Слайд 21Начальное и конечное состояния потока
Кроме того, введем для потоков состояния,
которые обозначают:
существование программного кода для создания потока;
завершение исполнения потока.
Назовем эти
состояния соответственно:
«новый»;
«завершен».
Слайд 23Диаграмма состояний потока
Переход потока из состояния в состояние выполняется посредством
некоторой операции, которая выполняется над потоком.
На диаграмме состояний эти операции
обозначаются дугами.
Название каждой операции указано рядом с дугой.
Слайд 24Операции над потоками, которые выполняются самими потоками
Create – создание нового
потока.
Выполняется потоком, который создает новый поток из функции.
Exit –
завершение исполнения потока.
Выполняется самим исполняемым потоком и завершает его.
Слайд 25Операции над потоками, которые выполняются операционной системой
Run – запускает готовый
поток на выполнение, то есть потоку выделяется процессорное время.
Выполняется над
потоком только в том случае, если подошла его очередь к процессору на обслуживание.
Interrupt – прерывает исполнение потока.
Выполняется над потоком только в том случае, если истекло процессорное время, выделенное потоку на исполнение.
Слайд 26Операции над потоками, которые выполняются операционной системой
Block – блокирует исполнение
потока.
Выполняется над потоком в том случае, если он ждет наступления
некоторого события, например, завершения операции ввода-вывода или освобождения ресурса.
Unblock – разблокирует поток.
Выполняется над потоком в том случае, если событие, ожидаемое потоком, наступило.
Слайд 28Определение процесса
Процессом или задачей называется исполняемое на компьютере приложение вместе
со всеми ресурсами, которые требуются для его исполнения.
Слайд 29Контекст процесса
Все ресурсы, необходимые для исполнения процесса, называются контекстом процесса.
Слайд 30Необходимые ресурсы процесса
Процессу обязательно принадлежат следующие ресурсы:
адресное пространство процесса;
потоки, исполняемые
в контексте процесса.
Слайд 31Адресное пространство процесса
Адресное пространство – это виртуальная память, выделенная процессу
для запуска программ.
Адресные пространства разных процессов не пересекаются.
Процесс не
имеет непосредственного доступа в адресное пространство другого процесса.
Это позволяет избежать влияния ошибок, произошедших в каком-либо процессе, на исполнение других процессов, что повышает надежность системы в целом.
Слайд 32Взаимодействие потоков процесса
Потоки, исполняемые в контексте одного процесса, запускаются в
адресном пространстве этого процесса.
Поэтому потоки одного процесса могут обращаться к
общим адресам памяти, что упрощает их взаимодействие.
На языках программирования высокого уровня это значит, что потоки могут взаимодействовать через глобальные переменные.
Слайд 33Взаимодействие потоков процесса
В принципе основной причиной, вызвавшей введение в системное
программирование понятия потока, и было разделении адресных пространств процессов, используя
виртуальную память.
Дело в том, что взаимодействие между параллельными процессами, адресные пространства которых не пересекаются, требует больших затрат на пересылку данных, так как выполняется посредством вызова функций ядра ОС.
А это сильно замедляет работу приложений.
Слайд 35Определение в Windows
Потоком в Windows называется объект ядра, которому операционная
система выделяет процессорное время для выполнения приложения.
Слайд 36Идентификация потока в Windows
С каждым потоком в Windows связаны:
уникальный
дескриптор (HANDLE);
уникальный идентификатор.
Дескрипторы используются программами пользователя для управления
потоками.
Идентификаторы используются служебными программами, которые позволяют пользователям системы отслеживать работу потоков.
Слайд 37Контекст потока в Windows
Каждому потоку в Windows принадлежат следующие ресурсы:
код
исполняемой функции;
набор регистров процессора;
стек для работы приложения;
стек для работы операционной
системы;
маркер доступа, который содержит информацию для системы безопасности.
Все эти ресурсы образуют контекст потока в Windows.
Слайд 38Типы потоков в Windows
В Windows различаются потоки двух типов:
системные
потоки;
пользовательские потоки.
Системные потоки выполняют различные сервисы операционной системы и
запускаются ядром операционной системы.
Пользовательские потоки служат для решения задач пользователя и запускаются приложением.
Слайд 39Типы потоков в приложении
В приложении различаются потоки двух типов:
рабочие потоки (working threads);
потоки интерфейса пользователя (user interface threads).
Рабочие
потоки выполняют различные задачи в приложении.
Потоки интерфейса пользователя выполняют обработку сообщений к окнам, с которыми они связаны.
Слайд 40Первичный поток приложения
Каждое приложение имеет, по крайней мере, один поток,
который называется первичным (primary) или главным (main) потоком.
В консольных приложениях
это поток, который исполняет функцию main.
В приложениях с графическим интерфейсом это поток, который исполняет функцию WinMain.
Слайд 41Функции управления потоками в Windows
CreateThread – один поток создает другой
поток;
ExitThread – поток завершает свою работу;
GetExitCodeThread – получить код завершения
потока;
TerminateThread – один поток завершает работу другого потока;
SuspendThread – один поток приостанавливает исполнение другого потока;
ResumeThread – один поток возобновляет исполнение другого потока;
Sleep – поток приостанавливает свое исполнение на заданный интервал времени.
Слайд 43Определение процесса в Windows
В Windows под процессом понимается объект ядра,
которому принадлежат системные ресурсы, используемые исполняемым приложением.
Поэтому можно сказать, что
в Windows процессом является исполняемое приложение.
Слайд 44Идентификация процесса в Windows
С каждым процессом в Windows связаны:
уникальный
дескриптор (HANDLE);
уникальный идентификатор.
Дескрипторы используются программами пользователя для управления процессами.
Идентификаторы
используются служебными программами, которые позволяют пользователям системы отслеживать работу процессов.
Слайд 45Ресурсы процесса в Windows
Каждый процесс в Windows владеет следующими ресурсами:
виртуальным
адресным пространством;
рабочим множеством страниц в реальной памяти;
первичным потоком;
маркером доступа, содержащим
информацию для системы безопасности;
таблицей для хранения дескрипторов объектов ядра, которые используются процессом.
Слайд 46Начало и завершение процесса в Windows
Выполнение каждого процесса начинается с
первичного потока.
В процессе своего исполнения процесс может создавать другие потоки.
Исполнение
процесса заканчивается при завершении работы всех его потоков.
Слайд 47Функции для управления процессами в Windows
CreateProcess – один процесс создает
другой процесс;
ExitProcess – процесс завершает свою работу;
GetExitCodeProcess – получить код
завершения процесса;
TerminateProcess – один процесс завершает работу другого процесса.
Слайд 48Дочерние процессы
Процесс, который создается функцией CreateProcess, называется дочерним или потомком
процесса, который его создает.
В свою очередь процесс, который вызывает функцию
CreateProcess, называется родительским или предком процесса, который он создает.
Слайд 492.6. Наследование дескрипторов объектов в ОС Windows
Слайд 50Определение наследуемого объекта в Windows
Объект называется наследуемым, если дочерний процесс
имеет доступ к этому объекту через дескриптор, который получен в
родительском процессе при создании этого объекта.
Для того чтобы сделать объект наследуемым дочерними процессами, нужно в родительском процессе установить свойство наследования в дескрипторе этого объекта.
Причем это свойство должно быть установлено до создания дочернего процесса, который должен получить доступ к наследуемому объекту.
Слайд 51Установка свойства наследования дескриптора объекта
В Windows свойство наследования объекта устанавливается
двумя способами:
функцией Create при создании объекта;
функцией SetHandleInformation.
Для того чтобы узнать,
является ли дескриптор наследуемым, нужно использовать:
функцию GetHandleInformation.
Слайд 52Решение проблемы уникального именования объектов
Использование свойства наследования дескрипторов объектов позволяет
избежать решения задачи уникального именования объектов, используемых в родительских и
дочерних процессах.