example - pthreads create c



Os encadeamentos têm um heap distinto? (6)

Cada thread tem sua própria pilha e pilha de chamadas.

Cada thread compartilha o mesmo heap.

Tanto quanto eu sei que cada segmento recebe uma pilha distinta quando o segmento é criado pelo sistema operacional. Gostaria de saber se cada segmento tem um heap distinto para si mesmo também?


Answer #1

De modo geral, todos os encadeamentos usam o mesmo espaço de endereço e, portanto, geralmente têm apenas um heap.

No entanto, pode ser um pouco mais complicado. Você pode estar procurando por Armazenamento Local de Encadeamento (TLS), mas armazena apenas valores únicos.

Específico do Windows: O espaço TLS pode ser alocado usando o TlsAlloc e liberado usando o TlsFree (Visão Geral here ). Novamente, não é um heap, apenas DWORDs.

Estranhamente, o Windows suporta múltiplos here por processo. Pode-se armazenar o identificador do heap em TLS. Então você teria algo como um "heap local de discussão". No entanto, apenas o identificador não é conhecido para os outros segmentos, eles ainda podem acessar sua memória usando ponteiros como ainda é o mesmo espaço de endereço.

EDIT : Alguns alocadores de memória (especificamente jemalloc no FreeBSD) usam o TLS para atribuir "arenas" a threads. Isso é feito para otimizar a alocação de vários núcleos, reduzindo a sobrecarga de sincronização.


Answer #2

Depende do sistema operacional. O tempo de execução padrão c em Windows e Unices usa um heap compartilhado entre threads. Isso significa bloquear todos os malloc / free.

No Symbian, por exemplo, cada thread vem com seu próprio heap, embora os threads possam compartilhar ponteiros para dados alocados em qualquer heap. O design do Symbian é melhor na minha opinião, uma vez que não apenas elimina a necessidade de bloqueio durante a alocação / livre, mas também incentiva a especificação limpa da propriedade dos dados entre os encadeamentos. Também nesse caso, quando um thread morre, ele pega todos os objetos alocados junto com ele - isto é, ele não pode vazar objetos que ele alocou, o que é uma propriedade importante em dispositivos móveis com memória restrita.

Erlang também segue um design similar, onde um "processo" atua como uma unidade de coleta de lixo. Todos os dados são comunicados entre os processos por cópia, exceto pelos blobs binários que são contados de referência (eu acho).


Answer #3

Não. Todos os threads compartilham um heap comum.

Cada thread tem uma pilha privada , da qual pode rapidamente adicionar e remover itens. Isso torna a memória baseada em pilha rápida, mas se você usar muita memória de pilha, como ocorre na recursão infinita, você obterá um estouro de pilha.

Como todos os encadeamentos compartilham o mesmo heap, o acesso ao alocador / desalocador deve ser sincronizado. Existem vários métodos e bibliotecas para evitar a contenção de alocadores .

Algumas linguagens permitem que você crie pools privados de memória, ou heaps individuais, que você pode atribuir a um único thread.


Answer #4

Por padrão, C tem apenas um único heap.

Dito isso, alguns alocadores que são sensíveis a threads particionam o heap para que cada segmento tenha sua própria área para alocação. A ideia é que isso torne a escala de heap melhor.

Um exemplo de tal pilha é o Hoard .


Answer #5

Normalmente, os threads compartilham o heap e outros recursos, no entanto, existem construções semelhantes a threads que não. Entre essas construções de thread estão os processos leves de Erlang e os processos completos do UNIX (criados com uma chamada a fork() ). Você também pode estar trabalhando em simultaneidade de várias máquinas, em cujo caso suas opções de comunicação entre threads são consideravelmente mais limitadas.





stack