Atualmente estou estudando Linux. Eu sei que o thread é um tipo de processo leve no Linux. Mas gostaria de saber de onde vem o espaço da pilha de threads.
A pilha do encadeamento é privada. É independente da pilha de processos. Com base na minha pesquisa, algumas pessoas disseram que a pilha de threads foi criada por mmap()
. E também, algumas pessoas disseram que mmap()
o espaço não é heap
. Está entre pilha e heap. Portanto, a pilha de threads vem do segmento de mapeamento de memória do processo. Isso é correto?
No que diz respeito ao kernel do Linux, threads são processos com um pouco mais de compartilhamento do que o normal ( por exemplo , seu espaço de endereço, seu tratamento de sinal e seu id de processo, que é realmente o id do grupo de threads).
Quando um processo inicia, ele tem um único thread, com uma pilha etc. Quando esse thread inicia outro thread, cabe ao thread criador fornecer uma pilha para o novo thread; isso normalmente é feito usando
mmap
, porquemmap
suporta vários sinalizadores que ajudam a garantir que a memória alocada seja adequada para uso como uma pilha. Veja o programa de exemplo emman 2 clone
. No entanto, não há necessidade de usarmmap
, qualquer bloco de memória alocado que atenda aos requisitos de uma pilha pode ser usado.As pilhas configuradas para encadeamentos não são privadas: elas são visíveis para outros encadeamentos que compartilham o mesmo espaço de endereçamento. No entanto, eles devem ser reservados para o uso de um único thread como uma pilha (vários threads compartilhando uma única pilha não funcionarão bem, para dizer o mínimo).
Consulte Os threads são implementados como processos no Linux? para mais contexto e história.