Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС 2.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
111 Кб
Скачать
☆

15. Этапы жизненного цикла процесса в unix-системах.

Процесс порождается с помощью системного вызова fork или CreateProcess, при котором происходит проверка на наличие свободной памяти, доступной для размещения нового процесса: если требуемая память доступна, то создается дочерний процесс (потомок), представляющий собой точную копию вызывающего процесса; при этом в таблице процессов для нового процесса строится соответствующая структура; новая структура создается также в таблице пользователя, и все ее переменные инициализируются нулями; создаваемому процессу присваивается новый уникальный идентификатор, а идентификатор родительского процесса запоминается в блоке управления процессом.

В UNIX-системах каждому процессу присваивается идентификатор процесса PID - Process Identifier.

Основные события, приводящие к созданию процесса (вызов fork или CreateProcess):

  • загрузка системы;

  • работающий процесс подает системный вызов на создание процесса;

  • запрос пользователя на создание процесса.

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

16. В каких случаях происходит переключение контекста

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

  1. Ядро ОС может отобрать управление у выполняющегося процесса/потока при истечении кванта времени, выделенного на выполнение. С точки зрения программиста это означает, что управление могло уйти от потока в «самый неподходящий» момент времени, когда структуры данных могут находиться в противоречивом состоянии из-за того, что их изменение не было завершено.

  2. Выполнение блокирующего системного вызова. Когда приложение производит ввод-вывод, ядро может решить, что можно отдать управление другому потоку/процессу в ожидании, пока запрошенный данным потоком дисковый либо сетевой ввод-вывод будет выполнен. Данный вариант является самым производительным.

  3. Синхронизирующие примитивы ядра. Мьютексы, Семафоры и т. д. Это и есть основной источник проблем с производительностью. Недостаточно продуманная работа с синхронизирующими примитивами может в «плохих случаях» приводить к десяткам тысяч, а при плохом проектировании и сотням тысяч переключений контекста в секунду.

  4. Системный вызов, явно ожидающий наступления события (select, poll, epoll, pause, wait,…) либо момента времени (sleep, nanosleep,..). Данный вариант является относительно производительным, так как ядро ОС имеет информацию об ожидающих процессах.

17. Приоритеты процессов

Планирование процессов в UNIX-системах, как правило, основано на приоритетах процессов, т. к. планировщик процессов выбирает процесс с наивысшим приоритетом.

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

Если процесс готов к запуску и имеет наивысший приоритет, планировщик процессов приостанавливает выполнение текущего процесса (с более низким приоритетом), даже если последний не выработал свой временной квант.

Ядро UNIX-систем является непрерываемым (nonpreemptive), что означает – процесс, находящийся в режиме ядра (в результате системного вызова или прерывания) и выполняющий системные инструкции, не может быть прерван системой, а вычислительные ресурсы передаются другому высокоприоритетному процессу. Выполняющийся процесс не может освободить процессор по собственному желанию в результате недоступности какого-либо ресурса, перейдя в состояние сна. В противном случае, система может прервать выполнение процесса только при переходе из режима ядра в пользовательский режим. Такой подход значительно упрощает решение задач синхронизации и поддержки целостности структур данных ядра.

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