![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Процессы, связанные с выполнением программ
Единицей планируемой работы в USIХ, как и в любой другой UNIХ-системе, является процесс. Процесс связан с выполнением отдельной программы (последовательности инструкций) в адресном пространстве. Процесс можно сопоставить с виртуальной машиной, которая определяет адресное пространство и логические ресурсы, выделенные пользователю (процессу). Адресное пространство процесса, которое разделяется на страницы (как правило, 4 Кбайта), является виртуальным, и обычно только часть его связана с оперативной памятью. Ядро системы хранит содержимое адресного пространства в различных объектах памяти, включая оперативную память, файлы на диске и специально резервируемые на диске области выгрузки. Система управления памятью загружает страницы с диска в оперативную память по мере необходимости обращения к ним. Функционирование USIX обеспечивается следующими способами: • пользовательский процесс запрашивает системный сервис через системные вызовы (system call). Ядро выполняет эти запросы для вызывающих процессов; • некоторые исключительные действия процесса (такие, как деление на нуль, переполнение стека пользователя) вызывают исключительные ситуации, которые управляются ядром от имени процесса; • ядро управляет аппаратными прерываниями от внешних устройств. Прерывания являются механизмом оповещения ядра системы о завершении операции ввода-вывода и об изменении состояния. Ядро обрабатывает прерывания как глобальные события. В общем случае архитектура Intel 80x86 обеспечивает четыре уровня выполнения инструкций. Система USIX, как и большинство USIX-систем, использует только два из них: более привилегированный — режим ядра и менее привилегированный - режим пользователя. Пользовательские программы выполняются в режиме пользователя, а большинство системных функций — в режиме ядра. Каждый процесс имеет собственное виртуальное пространство, которое отображается на оперативную память с помощью таблицы страниц. Отдельная часть виртуального адресного пространства каждого процесса отображается на данные и текст (выполняемый код) ядра. Эта часть, известная как системное пространство, или пространство ядра, может быть доступна только в режиме ядра. Процессы пользователя не имеют непосредственного доступа к ядру, а для получения системного сервиса используют системные вызовы. Когда процесс осуществляет системный вызов, выполняется специальная последовательность инструкций, переводящая систему в режим ядра и передающая управление ядру. Ядро выполняет требуемую функцию от имени процесса и возвращает систему в режим пользователя, передавая управление обратно процессу. Каждый процесс определяется своим контекстом, включающим информацию, требуемую для планирования управления при его выполнении. Контекст процесса включает следующие компоненты: • адресное пространство процесса — выполняемый код, данные, стек пользователя, регионы разделяемой памяти и др.; • управляющую информацию — приоритет и ресурсы процесса, стек ядра, отображение адресного пространства, идентификатор процесса; • аппаратный контекст — содержание общих и специальных регистров процессора. Ядро функционально может выполняться или в контексте процесса, или в контексте системы. В контексте процесса ядро выполняется от имени текущего процесса (например, когда выполняется системный вызов). Оно может иметь доступ к адресному пространству, модифицировать его и системный стек этого процесса. Кроме того, ядро может блокировать текущий процесс, если он должен ждать освобождения ресурсов или активности внешнего устройства. В табл. 4.1 отражено обобщение различий между режимами, адресными пространствами и контекстами процесса и системы.
Таблица 4.1 Процессы имеют определенное время жизни, создаются системными вызовами типа fork и выполняются, пока не завершатся с помощью системного вызова ехit или по ошибке. За время своего существования процесс может выполнить одну или несколько программ. Для выполнения новой программы используется системный вызов ехес. Процессы имеют четко определенную иерархию. Каждый процесс имеет своего родителя и может содержать один порожденный процесс или несколько. Init-процесс — первый пользовательский процесс. Он создается при загрузке системы и является прародителем всех пользовательских процессов. Активные порожденные процессы при завершении своего процесса-родителя наследуются от init-процесса. Новые процессы создаются по системному вызову forк. При этом сформированные для него таблицы и стек подобны состоянию, при котором процесс находился бы в прерванном состоянии. В этом случае процесс устанавливается от имени родительского процесса в очередь на планирование к выполнению. Когда процесс планируется на выполнение, он инициализируется в режиме ядра, при котором выполняется переключение контекста. Следующее состояние зависит от того, где процесс находился до переключения. Если процесс был вновь создан или выполнялся ранее в пользовательском режиме, он немедленно возвращается в режим пользователя. Если процесс был блокирован при выполнении системного вызова, процесс продолжает выполнение в режиме ядра. В каждый момент времени процессор и соответственно процессы могут находиться в одном из определенных состояний (фаз). Переход из одной фазы в другую — реакция на различные события. На рис. 4.3 представлены граф основных состояний процесса в USIХ и события, которые приводят к изменениям состояния. Каждая фаза работы процесса характеризуется набором аппаратных привилегий и собственным стеком. При переключении процессов необходимо переключать стеки пользовательских процессов, в которых сохраняется информация об их состоянии. Это обеспечивает возможность переключения процессов между процессорами без каких-либо ограничений. Функцию планирования процессов в USIХ, как и в большинстве других операционных систем, выполняет один из главных компонентов ядра системы — планировщик. Он определяет, какой процесс должен выполняться в каждый момент времени и как долго он будет выполняться. Планировщик выделяет процессор каждому процессу, как правило, на короткий промежуток времени — квант и затем переключается на другой процесс.
Работа планировщика связана с двумя основными аспектами. Первый определяет правила, устанавливающие, какой процесс выполнять и когда переключиться на другой процесс, второй — структуру данных и алгоритмы, реализующие выполнение этих правил. Система USIХ использует аппаратные часы — таймер, который прерывает систему через фиксированные интервалы времени. Этот интервал времени называется тиком. Каждый тик составляет не более 10 мс. Служба времени. Таймер используется для ведения системного времени и управления таймерной очередью. Серверы, драйверы, а также планировщик имеют возможность самостоятельно помещать запросы в таймерную очередь и отменять их с помощью системных вызовов. Порт таймера проверяется при каждом прерывании. Если приоритет поставленного в очередь сообщения выше приоритета выполняемого процесса, запрашивается перепланирование. Ядро USIХ распознает прерывания по таймеру в трех фазах — процесса, пользователя и планировщика. Когда прерывается работа планировщика, возврат происходит без проверки кванта времени. Если таймер прерывает пользовательский процесс, корректируются таймеры выполнения процесса (режим пользователя и ядра) и проверяется квант времени. Если квант времени истек, процесс требует сохранения независимо от режима выполнения. Это обеспечивает полную прерываемость ядра и решает проблему внутренней синхронизации. Если процессу необходимо расширить квант времени по некоторой причине (например, чтобы не быть приостановленным другими процессами с тем же самым приоритетом), он может добавить несколько тиков к своему кванту времени. После выполнения критического участка процесс самостоятельно должен освободить процессор, для того чтобы могли выполняться другие процессы. Для блокировки прерываний могут использоваться различные механизмы: блокирование ресурсов (аппаратная блокировка); остановка перепланирования (программный блок); семафоры ядра (программный блок). В многопроцессорной среде и, в случае полной прерываемости, в однопроцессорной системе необходим механизм аппаратного блокирования ресурсов. Аппаратную блокировку можно использовать, когда блокировка требуется на короткое время. В системе USIХ аппаратное блокирование выполняется с помощью функций Р_1оск и У_1оск. Функция Р_1оск оперирует значением блокировки, задаваемым в качестве аргумента. Если аргумент содержит ненулевое значение, то ресурс свободен. В однопроцессорной среде Р_1оск запрещает прерывания, что автоматически защищает систему от перепланирования процессов. После манипулирования с критическими данными необходимо вызвать функцию V_1оск. Функция V_1оск восстанавливает предыдущее значение регистра флагов, разрешает прерывания, если они были разрешены перед вызовом Р_1оск, и устанавливает ненулевое значение блокировки. Остановка перепланирования. Этот механизм используется для временной отмены перепланирования процессов. Для этой цели служат две функции: StopScheduler() и ReleaseScheduler(). Функция StopScheduler() останавливает перепланирование, пока не случится одно из двух событий: 1) будет вызвана функция ReleaseSchedurel() для отмены планирования; 2) будет вызвана функция give up (добровольное освобождение процессом данного процессора). Функция StopScheduler() воздействует только на тот процессор, на котором выполняется процесс, и не воздействует на другие процессоры. Функция StopScheduler() обеспечивает задержку процессора на период времени не более одного тика. С помощью других средств процессы могут пребывать в режиме задержки в течение любого интервала времени. Семафоры ядра. Они используются для синхронизации активных процессов на длительное время, когда ресурсы назначаются процессам на максимально возможное время. Если ресурсы недоступны, процесс может перейти в ожидание либо немедленно вернуть управление. Очередь ожидания упорядочивается по приоритетам ожидающих процессов и каждый раз проверяется на освобождение ресурсов. Блокирование секции данных или некоторого ресурса от взаимного доступа в течение длительного времени обеспечивается двумя функциями: Р_ semlоск (&semlock) и V_semlоск (&8ет-1оск). Функция Р_setlоск использует аргумент sem1оск в качестве индикатора занятости общего ресурса, который управляется с помощью функций Р_1оск и V_1оск. Функция V_semlock проверяет использование требуемого ресурса другими процессами. Очередь ожидания упорядочивается по приоритетам ожидающих процессов. Планировщик программ включает набор независимых программ, выполняющих общие функции: переключение контекста, управление очередями и др. Он также определяет программный интерфейс для зависимых функций, таких, как вычисление приоритетов и их наследование. Например, для процессов реального времени используются фиксированные приоритеты, а для процессов разделения времени — динамически изменяемые приоритеты в ответ на определенные события. Все процессы в USIX делятся на три класса: 1) разделения времени (ТS — Тime Sharing); 2) системные (SУS); 3) реального времени (RT — Rеа1 Тime). Процессы имеют 160 уровней приоритетов, которые делятся на три группы: • 0 — 59 — процессы разделения времени; • 60 — 99 — системные процессы; • 100 - 159 — процессы реального времени. Очереди диспетчеризации создаются отдельно для каждого уровня приоритета. Больший уровень приоритета соответствует более приоритетному процессу. Процессы разделения времени наименее приоритетны. Они планируются к выполнению в соответствии с алгоритмами, используемыми в UNIХ-подобных системах. Т8-процессы имеют 60 уровней приоритета, которые назначаются процессам в зависимости от используемых ими системных ресурсов. Каждому Т8-процессу назначается квант времени (по умолчанию — одна секунда). Если в течение кванта времени процесс не выполнял системных вызовов, переводящих его в состояние приостанова, он снимается с выполнения и его приоритет понижается. Таким образом, вычислительные процессы, требующие много процессорного времени, штрафуются, что позволяет давать преимущество интерактивным процессам. Отложенный процесс с уменьшенным приоритетом устанавливается в конец соответствующей очереди готовых к выполнению процессов. Системные процессы предназначены для выполнения общесистемных функций. В основном это процессы-серверы (файловые серверы, драйверы ввода-вывода, процессы-демоны). Их планирование осуществляется аналогично планированию процессов реального времени. Предусмотрено 40 уровней приоритета для системных процессов. Процессы реального времени имеют 60 уровней приоритета, которые назначаются пользователем. Ядро не изменяет приоритеты процессов класса RT и SУS по своей инициативе. Процессы, находящиеся в фазе планирования, проверяют очереди всех классов. При этом класс очередей RТ-процессов находится в верхней части таблицы, класс 8У8 - в средней части, а класс Т8 — в нижней части. Анализ очередей осуществляется сверху вниз, и, таким образом, всегда выбирается на исполнение самый приоритетный процесс. Процессы классов SУS и RТ запускаются на выполнение с квантом времени, задаваемым пользователем. После этого дальнейшие действия зависят от наличия в очереди процессов с приоритетом, равным или большим приоритета выполняемого процесса. Если в очереди имеется процесс с равным приоритетом, текущий процесс по истечении кванта времени приостанавливается и помещается в конец очереди процессов данного приоритета, а новый равноприоритетный процесс запускается на выполнение. Если в очереди имеется более приоритетный процесс, текущий процесс приостанавливается сразу при наступлении события (тайм-аут или прерывание), его контекст сохраняется, и осуществляется переход в фазу планировщика. Таким образом, центральным звеном планирования процессов является набор приоритетных очередей процессов. С помощью этих очередей реализуется инвариантное переключение набора готовых к выполнению процессов на разные процессоры. |
Последнее изменение этой страницы: 2019-04-21; Просмотров: 191; Нарушение авторского права страницы