Системный вызов clone() в Linux принимает параметр, указывающий на стек для нового созданного потока. Очевидным способом сделать это является просто malloc некоторое пространство и передать это, но тогда вы должны быть уверены, что malloc'd столько же пространства стека, сколько этот поток будет использовать (трудно предсказать).Как смонтировать стек для системного вызова clone() на linux?
Я помню, что при использовании pthreads мне не пришлось это делать, поэтому мне было любопытно, что он сделал. Я натолкнулся на this site, в котором объясняется: «Лучшим решением, используемым реализацией pthreads Linux, является использование mmap для выделения памяти с флагами, определяющими область памяти, которая выделяется по мере ее использования. Таким образом, память выделяется для как это необходимо, и произойдет нарушение сегментации, если система не сможет выделить дополнительную память ».
Единственный контекст, который я когда-либо слышал в mmap, используется для сопоставления файлов в памяти и, действительно, чтения man-страницы mmap требуется дескриптор файла. Как это можно использовать для выделения стека динамической длины для предоставления clone()? Этот сайт просто сумасшедший? ;)
В любом случае, ядро не должно знать, как найти свободную связку памяти для нового стека, так как это то, что нужно делать все время, когда пользователь запускает новые процессы? Почему указатель стека даже нужно указать в первую очередь, если ядро уже может это понять?
Я хочу сказать, что он должен «найти кучу свободной памяти», потому что, по-видимому, он уже может «найти кучу свободной памяти». Вилка создает новый процесс, который отличается, и я знаю, что я мог бы абстрагировать любую деталь, используя библиотеку. Но я даю разработчикам ядра кредит и полагаю, что есть веские причины для того, чтобы все было так, и я хочу знать, почему. –
fork (exec действительно, поскольку fork просто копирует все) функции «найдите мне кучу свободной памяти». 'clone' - это функция« Я хочу контролировать детали моего процесса создания ». pthread_create - это «создайте мне поток, используйте функцию по умолчанию». Это ваш выбор. Новые потоки нуждаются в собственном стеке, и вы не можете использовать традиционный метод выделения стека (начинать в верхнем/нижнем (адресном) адресном пространстве и расти вниз/вверх в сторону кучи, которая растет другим путем), потому что есть только одна верхняя/нижняя часть адресного пространства. –
Я хочу сказать, что когда пользователь запускает процесс, даже если этот процесс получает свое собственное пространство памяти, на определенном уровне ядро должно выполнять управление памятью * физического * адресного пространства, в которое входят адресные пространства, относящиеся к процессу. Если он может это сделать, он должен иметь логику, чтобы иметь возможность обрабатывать, позволяя мне клонировать, но обрабатывать стек для меня. Возможно, я захочу использовать клон по причинам, которые, например, не имеют никакого отношения к стекам (см. Флаги клонов). –