Модель памяти: записи активации
Я только что прочитал книгу, в которой говорится, что запись активации наверху стека (в памяти) всегда находится там, где находится точка выполнения. Поэтому мой вопрос будет таким: какая запись активации находится вверху во время параллельного выполнения? Особенно для одной и той же программы, но с несколькими потоками.
1 ответ
Книга представляет несколько идеализированный и упрощенный вид. В системах с сопрограммами концептуальная функция, которая выполняется в любой момент времени, может не быть той, чей кадр стека находится на вершине стека. (На практике это часто реализуется путем объединения всех записей активации сопрограмм в одну запись активации, так что можно утверждать, что утверждение все еще верно. Однако в этом духе вопроса понимание приходит из понимания деталей.) Множество систем heap выделяет записи активации для замыканий, и в этом случае запись активации текущей выполняемой функции вообще не находится в стеке.
Как отмечается в приведенном выше комментарии, типичные механизмы потоков реализуют отдельный стек для каждого потока, поэтому существует несколько верхних записей активации. Существуют альтернативные проекты, где понятие "стек" становится довольно размытым. Основным осложнением потоков является управление хранилищем для многих стеков, что усложняет работу. Часто наличие большого количества потоков означает, что стеки должны быть небольшими, но это ограничивает глубину вызовов, которые может сделать поток.
Когда поток выполнения входит в работающее ядро или получает прерывание, он часто переключается на другой стек по соображениям безопасности и корректности.