Как ядро ​​Linux разделяет стеки пользователей из нескольких потоков в одной группе потоков? - PullRequest
0 голосов
/ 22 сентября 2019

Как я понимаю, новый легкий процесс (поток) создается путем вызова clone() с установленным флагом CLONE_VM, что означает mm_struct, следовательно, список vm_area_struct является общим для всех потоков, идаже таблица страниц является общей, но тогда как ядро ​​отслеживает пользовательский стек каждого отдельного потока?

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

Единственный способ, о котором я могу думать, - это наличие нескольких vm_area_struct в mm_struct, которые в основном являются стековым пространством каждого потока, хотя все потокимогут «видеть» стек друг друга, они используют только свои.Но даже если это так:

  1. какая функция отвечает за выделение нового стекового пространства после клонирования?Некоторая библиотечная функция, которая обтекает clone(), делает это?
  2. mm_struct Поле start_stack должно выбрать один из нескольких потоков, и если по умолчанию оно не изменено, оно будет указывать на потокстек лидера группы?

Не уверен, что мое понимание выше верно, помощь оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...