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

Чем процесс отличается от потока, состояния процесса, планирование, взаимоблокировки, мьютексы и семафоры — база лабораторных по ОС.

Процесс и поток

ПризнакПроцессПоток
Адресное пространствоСобственное, изолированноеОбщее с другими потоками процесса
СозданиеДорогоеДешёвое
Обмен даннымиЧерез IPC: каналы, разделяемая память, сокетыЧерез общие переменные
ПадениеНе влияет на другие процессыРоняет весь процесс
Переключение контекстаМедленное (смена таблиц страниц)Быстрое

Формулировка для защиты: процесс — это единица владения ресурсами, поток — единица планирования и выполнения.

Состояния процесса

Ключевой переход: из состояния «ожидающий» процесс попадает не сразу на выполнение, а в очередь готовых. Это стандартная ловушка в тестах.

Алгоритмы планирования

АлгоритмСутьНедостаток
FCFSПервым пришёл — первым обслуженЭффект конвоя: длинный процесс держит всех
SJFКратчайший первымНужно знать время заранее; голодание длинных
Round RobinКаждому квант времени по кругуЧувствителен к размеру кванта
ПриоритетноеПо приоритетамГолодание низкоприоритетных (лечится старением)
Многоуровневые очередиРазные классы задач в разных очередяхСложность настройки

Проблема синхронизации

Состояние гонки (race condition) возникает, когда два потока одновременно меняют общие данные и результат зависит от порядка выполнения. Классический пример — счётчик: операция i++ не атомарна, она состоит из чтения, инкремента и записи.

import threading

counter = 0
lock = threading.Lock()

def worker():
    global counter
    for _ in range(100_000):
        with lock:          # критическая секция
            counter += 1

ts = [threading.Thread(target=worker) for _ in range(4)]
for t in ts: t.start()
for t in ts: t.join()
print(counter)   # без lock результат каждый раз разный

Средства синхронизации

Взаимоблокировка (deadlock)

Возникает при одновременном выполнении четырёх условий Коффмана: взаимное исключение, удержание с ожиданием, отсутствие вытеснения, циклическое ожидание. Чтобы не было deadlock, достаточно исключить любое из них.

  1. Предотвращение: захватывать ресурсы всегда в одном и том же порядке — разрывает циклическое ожидание.
  2. Избежание: алгоритм банкира, выдающий ресурсы только в безопасное состояние.
  3. Обнаружение и восстановление: строить граф ожидания, при цикле снимать один из процессов.
  4. Игнорирование («страусиный алгоритм») — то, что делают большинство ОС общего назначения.
Задача обедающих философов в лабораторной решается именно через нумерацию вилок: каждый берёт сначала вилку с меньшим номером. Асимметрия разрывает цикл.

Частые вопросы

Что такое голодание и чем оно отличается от deadlock?

При deadlock процессы блокируют друг друга навсегда. При голодании процесс в принципе может выполниться, но его постоянно обходят более приоритетные. Лечится старением приоритета.

Зачем нужны процессы, если потоки дешевле?

Изоляция. Падение или уязвимость в одном процессе не затрагивает остальные — поэтому браузеры запускают вкладки отдельными процессами.

Читайте также

Сделаем работу по этой теме

Опишите задачу — ответим в течение 15 минут в личных сообщениях ВКонтакте, назовём срок и цену. Предоплаты за оценку нет.

  • Оценка заявки бесплатно
  • Правки по замечаниям преподавателя
  • Работы по всем техническим и IT-дисциплинам

Нажимая кнопку, вы соглашаетесь на обработку указанных данных для ответа на заявку.