Pull to refresh

Как работает многозадачность

Programming *
Sandbox
В ответ на Как вы считаете, как работает многозадачность на 80386?. По моему мнению, ни один из предлагавшихся вариантов ответа не верен, а верен такой:

Процессор ничего не знает ни о потоках, ни о процессах. Он просто последовательно выполняет инструкции, пока не случится прерывание. Обработка прерывания сводится к вызову процедуры, не заданному в исполняемом коде. Эта процедура (являющаяся частью операционной системы) производит при необходимости переключение процессов и потоков. Чаще всего процедура прерывания просто делает выход и прерванный поток продолжает свою работу, ничего не заметив.

Шаги этого процесса элегантны и поучительны.

Каждый поток (thread) имеет свой стек — область памяти для хранения состояния исполняемых в данный момент времени процедур. При вызове процедуры состояние процессора записывается в стек, про выходе из процедуры оно оттуда считывается обратно на регистры процессора. Важнейшим элементом состояния является адрес исполняемой команды. Еще более важным элементом состояния является указатель стека — адрес, по которому записываются или считываются данные состояния. Сам указатель стека в стек не записывается.

К процессору от внешних устройств (в том числе от таймера) ведут несколько проводов. Сигнал на любом из этих проводов заставляет процессор выполнить процедуру прерывания, начальный адрес которой задан в таблице прерываний по индексу, равному номеру провода.

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

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

Множество деталей в этом изложении опущено (например, приоритет прерываний), их можно найти в соответствующей литературе.

Советская терминология отличалась от американской. Поток назывался процессом, а процесс — задачей, в соответствии с работой Дейкстры Взаимодействие последовательных процессов.
Tags: Многозадачностьпроцессорпроцессы
Hubs: Programming
Total votes 93: ↑63 and ↓30 +33
Comments 48
Comments Comments 48

Popular right now