Chủ đề chia sẻ mọi thứ [1]. Có một không gian địa chỉ cho toàn bộ quá trình.
Mỗi luồng có ngăn xếp và thanh ghi riêng, nhưng tất cả các ngăn xếp của luồng đều hiển thị trong không gian địa chỉ dùng chung.
Nếu một luồng phân bổ một số đối tượng trên ngăn xếp của nó và gửi địa chỉ đến một luồng khác, cả hai sẽ có quyền truy cập như nhau vào đối tượng đó.
Trên thực tế, tôi chỉ nhận thấy một vấn đề rộng lớn hơn: Tôi nghĩ rằng bạn đang nhầm lẫn hai cách sử dụng phân đoạn từ .
Định dạng tệp cho tệp thực thi (ví dụ ELF) có các phần riêng biệt trong đó, có thể được gọi là phân đoạn, chứa mã được biên dịch (văn bản), dữ liệu khởi tạo, ký hiệu liên kết, thông tin gỡ lỗi, v.v. Không có phân đoạn heap hoặc stack ở đây, vì đó là các cấu trúc chỉ thời gian chạy.
Các phân đoạn tệp nhị phân này có thể được ánh xạ vào không gian địa chỉ quy trình một cách riêng biệt, với các quyền khác nhau (ví dụ: chỉ thực thi được đọc đối với mã / văn bản và sao chép không thể thực thi đối với dữ liệu khởi tạo).
Các khu vực của không gian địa chỉ này được sử dụng cho các mục đích khác nhau, như phân bổ heap và ngăn xếp luồng, theo quy ước (được thực thi bởi các thư viện thời gian chạy ngôn ngữ của bạn). Tất cả chỉ là bộ nhớ và có lẽ không được phân đoạn trừ khi bạn đang chạy ở chế độ 8086 ảo. Mỗi ngăn xếp của luồng là một khối bộ nhớ được phân bổ tại thời điểm tạo luồng, với địa chỉ đỉnh ngăn xếp hiện tại được lưu trữ trong một thanh ghi con trỏ ngăn xếp và mỗi luồng giữ con trỏ ngăn xếp riêng cùng với các thanh ghi khác.
[1] OK, tôi biết: mặt nạ tín hiệu, TSS / TSD, v.v. Không gian địa chỉ, bao gồm tất cả các phân đoạn chương trình được ánh xạ của nó, vẫn được chia sẻ.