Управление процессами и потоками
Механизм многопоточной обработки.
Подсистема управления процессами и потоками ответственна за обеспечение процессов необходимыми ресурсами компьютера. В последнее время все чаще используется параллельные вычисления в рамках одного процесса. Примером необходимости распараллеливания является сетевой сервер баз данных. В этом случае параллелизм желателен как для обслуживания различных запросов к базе данных, так и для более быстрого выполнения отдельного запроса за счет одновременного просмотра различных записей базы.
Средством распараллеливания вычислений в современных ОС является механизм многопоточной обработки. При этом вводится новая единица работы – поток выполнения.
Понятию поток выполнения соответствует последовательный переход процессора от одной команды программы к другой.
Операционная система распределяет процессорное время между потоками. Процессу назначается адресное пространство и набор ресурсов, которые совместно используются всеми потоками.
Создание потоков требует от ОС меньше накладных расходов, чем процессов. В отличие от процессов, которые принадлежат разным конкурирующим за ресурсы приложениям, все потоки одного процесса всегда принадлежат одному приложению. Вследствие этого операционная система изолирует потоки в гораздо меньшей степени, нежели процессы в традиционной мультипрограммной системе. Чтобы организовать взаимодействие и обмен данными, потокам не требуется обращаться к ОС, им достаточно использовать общую память – один поток записывает данные, а другой их читает.
Таким образом, мультипрограммирование более эффективно на уровне потоков, а не задач. Каждый поток имеет в процессоре собственный счетчик команд и стек. Задача, оформленная в виде нескольких потоков в рамках одного процесса, может быть выполнена быстрее за счет псевдопараллельного (или параллельного в мультипроцессорных системах) выполнения ее отдельных частей. Особенно эффективна многопоточность в мультипроцессорных системах.
Создание процессов и потоков.
Создать процесс – это, прежде всего, означает создать описатель процесса(дескриптор процесса),в котором содержатся все сведения о процессе, необходимые операционной системе для управления им. Обычно описатель процесса состоит из двух частей – собственно дескриптора и контекста процесса, которые доступны только ядру ОС.
Дескриптор содержит информацию о процессе, необходимую ядру ОС в течение всего жизненного цикла процесса независимо от того, находится он в активном или пассивном состоянии. Дескрипторы отдельных процессов хранятся в таблице процессов, которая постоянно находится в оперативной памяти ядра операционной системы. В дескрипторе имеется указатель на место расположения контекста процесса.
Контекст процесса содержит менее оперативную, но более объемную часть информации о процессе, необходимую для возобновления процесса с прерванного места: содержимое регистров процессора, информацию о всех открытых данным процессом файлах, незавершенные операции ввода-вывода и другие данные. Контекст находится в оперативной памяти непосредственно рядом с образом процесса и перемещается вместе с ним на диск, если есть в этом необходимость.
Создание процесса включает загрузку кодов и данных исполняемой программы с диска в выделенную область оперативной памяти или в область подкачки – специальную область диска, где хранятся вытесненные из оперативной памяти процессы.
Создание описателя процесса знаменует собой появление в системе еще одного претендента на вычислительные ресурсы. Начиная с этого момента при распределении ресурсов ОС должна принимать во внимание потребности нового процесса.
При выполнении этих действий подсистема управления процессами тесно взаимодействует с подсистемой управления памятью и файловой системой.
В многопоточной системе операционная система при создании процесса создает для каждого процесса как минимум один поток выполнения. При этом так же, как и при создании процесса, операционная система генерирует специальную информационную структуру – описатель потока.
В исходном состоянии поток (или процесс – для систем без многопоточности) находится в приостановленном состоянии. Момент выборки потока на выполнение осуществляется в соответствии с принятым в данной системе правилом предоставления процессорного времени и с учетом всех существующих в системе процессов и потоков.
Планирование и диспетчеризация потоков.
На протяжении существования процесса выполнение его потоков может быть неоднократно прервано и продолжено. Переход от выполнения одного потока к другому осуществляется в результате планирования и диспетчеризации.
Планирование – это работа операционной системы по определению того, в какой момент необходимо прервать выполнение текущего активного потока и какому потоку предоставить возможность выполняться.
В большинстве ОС универсального назначения планирование осуществляется динамически, то есть решения принимаются во время работы системы на основе анализа текущей ситуации.
Почти во всех современных ОС реализованы вытесняющие алгоритмы планирования потоков, в которых решение о переключении процессора с выполнения одного потока на другой принимается операционной системой.
При планировании потоков, как правило, применяются смешанные алгоритмы планирования, основанные как на квантовании (выделении потоку кванта времени использования процессора), так и на приоритетах.
В основе планирования лежит квантование, но величина кванта и/или порядок выбора потока из очереди готовых определяется приоритетом потоков. При этом могут приниматься во внимание не только приоритет потоков, но время их ожидания в очереди, накопленное время выполнения и другие факторы. Часто низкоприоритетным процессам выделяется больший квант времени, чем высокоприоритетным. Поэтому хотя они и реже получают доступ к процессору, но зато дольше его могут занять.
Операционная система планирует выполнение потоков независимо от того, принадлежат ли они одному процессу или разным.
Диспетчеризация – это реализация найденного в результате планирования решения, то есть сам процесс переключения процессора с одного потока на другой.
Диспетчеризация сводится к следующему:
· сохранение контекста текущего потока, который требуется сменить;
· загрузка контекста нового потока, выбранного в результате планирования;
· запуск нового потока на выполнение.
В контексте потока можно выделить часть, общую для всех потоков процесса, и часть, относящуюся только к данному потоку. Потому часто общую часть выделяют как глобальный контекст, доступный всем потокам процесса и который не надо менять при смене потоков одного процесса. Меняется только локальный контекст, необходимый конкретному потоку. Это ускоряет переключение потоков.
В мультипрограммной системе поток может находиться в одном из трех основных состояний:
· выполнение – активное состояние потока, когда он выполняется процессором;
· ожидание – пассивное состояние потока, когда он заблокирован по своим внутренним причинам (ждет осуществления некоторого события или освобождения необходимого ресурса, кроме процессора);
· готовность– пассивное состояние потока, когда он заблокирован внешними обстоятельствами, то есть готов использовать процессор, но ему его не дают.
В состоянии выполнения в однопроцессорной системе может находиться не более одного потока, а в других состояниях – по несколько потоков, которые образуют очереди ожидающих и готовых потоков.