Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
realizaciya_mnogozadachnosti_v_windows_vista.doc
Скачиваний:
22
Добавлен:
28.03.2015
Размер:
138.75 Кб
Скачать

Глава 3. Реализация многозадачности в Windows Vista

3.1. Фундаментальные концепции

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

Потоки – это абстракции ядра для планирования процессора в Windows. Каждому потоку присваивается приоритет (в зависимости от значения приоритета его процесса). Потоки могут быть аффинизированными (affinitized), чтобы они выполнялись только на определенных процессорах. Это помогает параллельным программам (работающим на нескольких процессорах) явным образом распределять нагрузку. Каждый поток имеет два отдельных стека вызовов, один – для выполнения в пользовательском режиме, другой – для режима ядра.

Процессы создаются из объектов сегментов, каждый из которых описывает объект памяти, основанный на дисковом файле. При создании процесса создающий процесс получает описатель для процесса, который позволяет ему модифицировать новый процесс (посредством отображения сегментов, выделения виртуальной памяти, записи параметров и данных окружения, дублирования дескрипторов файлов в свою таблицу описателей, создания потоков). Это отличается от того, как процессы создаются в системах UNIX, и демонстрирует разницу междуUNIXиWindows.UNIXбыла спроектирована для 16-битных однопроцессорных систем, которые применяли подкачку для совместного использования памяти процессами. В таких системах использование процесса как единицы параллельности и операцииfork для создания процессов было просто блестящей идеей. Для выполнения нового процесса в небольшом количестве памяти (при отсутствии аппаратных средств виртуальной памяти) приходилось процессы из памяти выгружать на диск. Первоначальноfork в системеUNIXбыла реализована при помощи простой выгрузки родительского процесса и передачи его физической памяти дочернему процессу.

На момент написания системы NTобычной аппаратной средой были 32-битные многопроцессорные системы с аппаратной виртуальной памятью, которая использовала от 1 до 16 Мбайт физической памяти. Наличие нескольких процессоров позволяет одновременно выполнять части программ, поэтомуNTприменяла процессы как контейнеры для совместного использования памяти и ресурсов объектов, а потоки – как единицу параллельности (для планирования).

Windowsможет группировать процессы в задания, однако абстракция «задание» (job) имеет не очень общий характер. Она была специально создана для группирования процессов с целью применения ограничений к содержащимся в них потокам, таких как ограничение использования ресурсов при помощи совместно используемой квоты или применение маркера ограниченного доступа (restrictedtoken), который не позволяет потокам обращаться ко многим системным объектам. Самым важным свойством заданий (в плане управления ресурсами) является то, что с того момента, как процесс оказался в задании, все созданные (в этих процессах) потоками процессы будут также находиться в этом задании. Выхода нет. В полном соответствии со своим названием задания были предназначены для таких ситуаций, которые скорее напоминали пакетную обработку заданий, чем обычные интерактивные вычисления.

Процесс может находиться внутри только одного задания (максимум).

На рис. 1 Приложения 3 показана связь между заданиями (jobs), процессами (processes), потоками (threads) и волокнами (fibers). Задания содержат процессы. Процессы содержат потоки. Но потоки не содержат волокна. Связь между потоками и волокнами обычно имеет тип «многие-ко-многим».

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

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

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

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

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

Семафоры – это объекты режима ядра и поэтому они имеют дескрипторы безопасности и описатели. Семафор создается при помощи функции CreateSemaphore интерфейса Win32API, которая может инициализировать его заданным значением, а также задать максимальное значение.

Мьютексы – это тоже объекты режима ядра, используемые для синхронизации, но они проще семафоров (поскольку не имеют счетчиков). По существу это блокировки, имеющие функции APIдля блокирования(WaitForSingleObject) и разблокирования(ReleaseMutexТретий механизм синхронизации называется «критическая секция» (criticalsection). Он реализует концепцию «критических областей». ВWindowsон похож на мьютекс, за исключением того, что он является локальным для адресного пространства создающего потока. Поскольку критические секции не являются объектами режима ядра, они не имеют явных описателей или дескрипторов безопасности и не могут передаваться между процессами. Блокирование и разблокирование выполняется соответственно вызовамиEnterCriticalSection иLeaveCriticalSection. Поскольку эти функцииAPIвыполняются первоначально в пространстве пользователя и делают вызовы ядра только при необходимости в блокировке, то они гораздо быстрее мьютексов. Критические секции оптимизированы для комбинированного использования спин-блокировок (на многопроцессорных системах) и синхронизации ядра (при необходимости). Во многих приложениях большинство критических секций так редко становятся объектом соперничества или имеют такое краткое время удерживания, что необходимость в выделении объекта синхронизации ядра никогда не возникает. Это приводит к очень существенной экономии памяти ядра.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]