Le discussioni condividono tutto [1]. C'è uno spazio di indirizzi per l'intero processo.
Ogni thread ha il proprio stack e registri, ma tutti gli stack dei thread sono visibili nello spazio degli indirizzi condiviso.
Se un thread alloca un oggetto nel suo stack e invia l'indirizzo a un altro thread, entrambi avranno uguale accesso a quell'oggetto.
In realtà, ho appena notato un problema più ampio: penso che stai confondendo due usi del segmento di parole .
Il formato del file per un eseguibile (ad es. ELF) ha sezioni distinte in esso, che possono essere indicate come segmenti, contenenti codice compilato (testo), dati inizializzati, simboli di linker, informazioni di debug, ecc. Non ci sono segmenti di heap o stack qui, poiché quelli sono costrutti solo di runtime.
Questi segmenti di file binari possono essere mappati separatamente nello spazio degli indirizzi di processo, con autorizzazioni diverse (ad es. Eseguibile di sola lettura per codice / testo e non eseguibile copia su scrittura per i dati inizializzati).
Le aree di questo spazio di indirizzi vengono utilizzate per scopi diversi, come allocazione di heap e stack di thread, per convenzione (imposto dalle librerie di runtime della lingua). Tuttavia, è tutta memoria, e probabilmente non segmentata, a meno che non sia in esecuzione in modalità 8086 virtuale. Lo stack di ogni thread è una porzione di memoria allocata al momento della creazione del thread, con l'attuale indirizzo superiore dello stack archiviato in un registro del puntatore dello stack e ogni thread mantiene il proprio puntatore dello stack insieme agli altri registri.
[1] OK, lo so: maschere di segnale, TSS / TSD ecc. Lo spazio degli indirizzi, compresi tutti i suoi segmenti di programma mappati, è comunque condiviso.