Threads membagikan semuanya [1]. Ada satu ruang alamat untuk seluruh proses.
Setiap utas memiliki tumpukan dan registernya sendiri, tetapi semua tumpukan utas terlihat di ruang alamat bersama.
Jika satu utas mengalokasikan beberapa objek pada tumpukannya, dan mengirimkan alamat ke utas lain, keduanya akan memiliki akses yang sama ke objek tersebut.
Sebenarnya, saya baru saja memperhatikan masalah yang lebih luas: Saya pikir Anda membingungkan dua penggunaan segmen kata .
Format file untuk yang dapat dieksekusi (mis., ELF) memiliki bagian yang berbeda di dalamnya, yang dapat disebut sebagai segmen, yang berisi kode kompilasi (teks), data yang diinisialisasi, simbol tautan, info debug, dll. Tidak ada segmen tumpukan atau tumpukan di sini, karena itu hanya konstruksi runtime.
Segmen file biner ini dapat dipetakan ke dalam ruang alamat proses secara terpisah, dengan izin yang berbeda (mis. Read-only executable untuk kode / teks, dan copy-on-write yang tidak dapat dieksekusi untuk data yang diinisialisasi).
Area ruang alamat ini digunakan untuk tujuan yang berbeda, seperti alokasi tumpukan dan tumpukan utas, berdasarkan konvensi (diberlakukan oleh pustaka runtime bahasa Anda). Itu semua hanya memori, dan mungkin tidak tersegmentasi kecuali Anda menjalankan dalam mode 8086 virtual. Setiap tumpukan thread adalah sepotong memori yang dialokasikan pada waktu pembuatan thread, dengan alamat top stack saat ini disimpan dalam register penunjuk tumpukan, dan setiap utas menyimpan penunjuk tumpukannya sendiri bersama dengan register lainnya.
[1] OK, saya tahu: masker sinyal, TSS / TSD dll. Ruang alamat, termasuk semua segmen program yang dipetakan, masih dibagikan.