Как я понимаю, новый легкий процесс (поток) создается путем вызова clone()
с установленным флагом CLONE_VM
, что означает mm_struct
, следовательно, список vm_area_struct
является общим для всех потоков, идаже таблица страниц является общей, но тогда как ядро отслеживает пользовательский стек каждого отдельного потока?
Для обычного clone()
без CLONE_VM
таблица страниц будет продублирована, так что копирование при записи будет выполненоесли дочерний или родительский процесс изменяет какую-либо общую страницу, включая область стека.По сути, COW - это всего лишь хитрость, основанная на том факте, что новый процесс должен / будет иметь полностью независимое пространство памяти в будущем, он просто делится страницами со своим родителем, когда это возможно, по нескольким причинам, связанным с эффективностью.Ясно, что когда установлен CLONE_VM
, этот механизм больше не применяется.
Единственный способ, о котором я могу думать, - это наличие нескольких vm_area_struct
в mm_struct
, которые в основном являются стековым пространством каждого потока, хотя все потокимогут «видеть» стек друг друга, они используют только свои.Но даже если это так:
- какая функция отвечает за выделение нового стекового пространства после клонирования?Некоторая библиотечная функция, которая обтекает
clone()
, делает это? mm_struct
Поле start_stack
должно выбрать один из нескольких потоков, и если по умолчанию оно не изменено, оно будет указывать на потокстек лидера группы?
Не уверен, что мое понимание выше верно, помощь оценена.