Процессы и потоки
Что такое процесс на самом деле, чем он отличается от потока и что происходит при переключении CPU.
Программа на диске — это просто байты. Процесс — это та же программа в исполнении: своя память, свои файловые дескрипторы, своё место в очереди CPU. Два экземпляра одной программы — это два разных процесса, которые просто делят один код.
Процесс почти никогда не бывает просто «выполняется». Он готов (ждёт CPU), выполняется (прямо сейчас на ядре) или заблокирован (ждёт ввод-вывод или блокировку). Большую часть жизни процесс проводит в состояниях «готов» или «заблокирован», а не «выполняется».
ОС отслеживает каждый процесс через блок управления процессом (PCB): идентификатор, состояние, где начинается память, какие файлы открыты и сохранённые регистры CPU. Для ядра PCB — это и есть процесс.
/* PCB — то, что ОС помнит о процессе, пока он не на CPU. */
struct pcb {
int pid; /* кто это */
int state; /* READY / RUNNING / WAITING */
void *page_table; /* где лежит его память */
struct regs saved; /* PC, SP — где он остановился */
int open_files[16]; /* что он открыл */
};Практика
Расставь состояния процесса в порядке, в котором программа обычно проходит через них.
Подсказки
- Процесс не начинает выполняться сразу после создания.
- Ждать чтения с диска — не то же самое, что ждать CPU.
12 XP
Два потока в одном процессе увеличивают один счётчик без блокировки. Что скорее всего получится?
Подсказки
- Подумай, что происходит между чтением значения и записью обратно.
- Планировщик может переключить поток между любыми двумя инструкциями.
12 XP
Объясни, почему переключение контекста — это накладные расходы и когда ОС вынуждена их платить.
Подсказки
- Спроси себя, какая полезная работа делается во время самого переключения.
- Блокирующий ввод-вывод не может удерживать CPU.
15 XP