Процессы и потоки в Windows

ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 1

1. Понятие ресурса. Редакторы и трансляторы ресурсов.

2. Состояния потока.

Трансля́тор — программа или техническое средство, выполняющее трансляцию программы[1][2].

Трансля́ция програ́ммы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой[1].

Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати текст программы и т. д.[1]

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

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

Существует несколько видов трансляторов[2].

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

· Синтаксически-ориентированный (синтаксически-управляемый) транслятор — транслятор, получающий на вход описание синтаксиса и семантикиязыка, текст на описанном языке и выполняющий трансляцию в соответствии с заданным описанием.

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

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

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

· Тестовый транслятор — транслятор, получающий на вход исходный код и выдающий на выходе изменённый исходный код. Запускается перед основным транслятором для добавления в исходный код отладочных процедур. Например, транслятор с языка ассемблера может выполнять заменумакрокоманд на код.

· Обратный транслятор — транслятор, выполняющий преобразование машинного кода в текст на каком-либо языке программирования.

Состояния потоков

На рис. 7.4, взятом из [9] (см. также [38], версию, обновленную Соломоном (Solomon) и Руссиновичем (Russinovych)), представлена схема планирования потоков и показаны их возможные состояния. Кроме того, этот рисунок иллюстрирует результаты работы программы. Такие диаграммы состояния являются общими для всех многозадачных ОС и помогают выяснить, каким образом планируется выполнение потоков и как они переходят из одного состояния в другое.

Процессы и потоки в Windows - student2.ru

Рис. 7.4. Состояния потоков и переходы между состояниями (Источник: Inside Windows NT,Copyright © 1993, by Helen Custer. Copyright Microsoft Press. Воспроизводится с разрешения Microsoft Press. Все права сохранены.)

Ниже приводится краткая сводка основных положений. Для получения более подробной информации по этому вопросу обратитесь в [38] или к руководству по ОС.

• Поток находится в состоянии выполнения (running state), если она фактически выполняется процессором. В SMP-системах в состоянии выполнения могут находиться одновременно несколько потоков.

• Планировщик переводит поток в состояние ожидания (wait state), если он выполняет функцию ожидания несигнализирующих объектов, например, потоков или процессов, или перехода в сигнальное состояние объектов синхронизации, о чем говорится в главе 8. Операции ввода/вывода также будут ожидать завершения передачи дисковых или иных данных, но ожидание может быть вызвано и другими многочисленными функциями. О потоках, находящихся в состоянии ожидания, нередко говорят как о блокированных (blocked) или спящих (sleeping).

• Поток находится в состоянии готовности (ready state), если она может выполняться. Планировщик в любой момент может перевести такой поток в состояние выполнения. Когда процессор станет доступным, планировщик запустит тот из потоков, находящихся в состоянии готовности, который обладает наивысшим приоритетом, а при наличии нескольких потоков с одинаковым высшим приоритетом запущен будет та, который пребывал в состоянии готовности дольше всех. При этом поток проходит через состояние простоя (standby state), или резервное состояние.

• Обычно, в соответствии с приведенным описанием, планировщик помещает поток, находящийся в состоянии готовности, на любой доступный процессор. Программист может указать маску родства процессоров (processor affinity mask) для потока (см. главу 9), предоставляя потоку процессоры, на которых он может выполняться. Используя этот способ, программист может распределять процессоры между потоками. Соответствующими функциями являются SetProcessorAffinityMask и GetProcessorAffinityMask. Функция SetThreadIdealProcessor позволяет указать предпочтительный процессор, подлежащий использованию планировщиком при первой же возможности.

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

• Планировщик переводит ожидающий поток в состояние готовности сразу же, как только соответствующие дескрипторы оказываются в сигнальном состоянии, хотя при этом поток фактически проходит через промежуточное переходное состояние (transition state). В подобных случаях принято говорить о том, что поток пробуждается (wakes).

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

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

• Поток переходит в состояние завершения (terminated state) тогда, когда его выполнение завершается, и остается в этом состоянии до тех пор, пока остается открытым хотя бы один из ее дескрипторов. Это позволяет другим потокам запрашивать состояние данного потока и его код завершения.

Поток описывает динамическое поведение всей программы или какой-

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

программа является однопоточной. Тогда поток можно рассматривать как пару:

поток = (процессор, программа).

Программа может исполняться процессором только в случае, если она

готова к исполнению. Кроме того необходимо, чтобы и сам процессор был

свободен и готов к исполнению этой программы.

Для записи состояний процессора и программы введем следующие

названия: для процессора - "не выделен", "выделен", а для программы - "не

готова", "готова".

Тогда состояние потока можно определить как пару состояний:

состояние потока = (состояние процессора, состояние программы).

Введем для состояний потока следующие названия: “блокирован” ("не

выделен", "не готова"), “готов” ("не выделен", "готова") и “выполняется”

("выделен", "готова").

Диаграмма возможных переходов потока из состояния в состояние может

быть изображена, как это показано на рис.2.1

Сами переходы потока из состояния в состояние, которые на диаграмме

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

На диаграмме показаны следующие состояния:

"новый" - поток, еще не начавший свою работу,

"завершен" - поток, завершивший свою работу,

"спит" - поток в сонном состоянии, т.е. приостановил свое исполнение на

некоторый интервал времени,

Сами переходы потока из состояния в состояние, которые на диаграмме

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

этих операций указаны рядом со стрелками. Кратко опишем эти операции.

- Операция create выполняется потоком, который создает новый поток и

переводит поток из состояния "новый" в состояние "готов".

- Операция Exit выполняется самим потоком в случае его завершения и

переводит поток из состояния "выполняется" в состояние "завершен".

- Операция Run выделяет ему процессорное время и переводит поток из

состояния "готов" в состояние "выполняется".

- Операция interrupt задерживает исполнение потока и переводит его из

состояния "выполняется" в состояние "готов". Эта операция выполняется, если

истекло процессорное время, или исполнение потока прервано по каким-либо

другим причинам.

- Операция Block переводит поток из состояния "выполняется" в

состояние "блокирован". Эта операция выполняется в случае, если он ждет

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

вывода или освобождения ресурса.

- Операция unblock переводит поток из состояния "блокирован" в

состояние "готов". Эта операция выполняется над потоком в том случае, если

событие, ожидаемое потоком, наступило.

- Операция suspend приостанавливает исполнение потока.

- Операция Resume возобновляет исполнение потока.

- Операция sleep переводит поток в состояние "спит".

- Операция wakeup позволяет операционной системе разбудить поток.

3. Управление процессами. Процессы и потоки в Windows.

Процесс содержит собственное независимое виртуальное адресное

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

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

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

и новые независимые процессы, а также управлять сообщением и

синхронизацией объектов.

Создавая процессы и управляя ими, приложения могут одновременно

выполнять задачи по обработке файлов, производить вычисления и

взаимодействовать с другими системами в сети. Возможно даже использование

нескольких процессоров для ускорения обработки.

Процессы и потоки в Windows

Каждый процесс содержит один или более потоков. Поток в Windows—

основная единица выполнения.

С точки зрения программиста, каждый процесс в Win32 включает

компоненты, перечисленные ниже.

• Один или несколько потоков.

• Виртуальное адресное пространство, отличное от адресных пространств

других процессов, за исключением случаев явного разделения памяти.

Отметим, что отображаемые в память файлы разделяют физическую память,

но разные процессы для доступа к отображенному файлу будут

использовать разные виртуальные адреса.

• Один или более сегментов кода, включая код DLL.

• Один или более сегментов данных, содержащих глобальные переменные.

• Строки окружения с информацией о переменных окружения, таких как

текущий путь поиска.

• Память кучи процесса.

• Такие ресурсы, как открытые дескрипторы и другие кучи.

Процесс

Блок окружения

Код

Глобальные переменные

Память кучи процесса

Ресурсы процесса

Открытые файлы

Кучи

Поток 1

Локальная область памяти потока

Стек

Поток N

Локальная область памяти потока

Стек

Наши рекомендации