Repository navigation
Program Memory Layout & Concurrency
Oğuzhan Düğüncü edited this page Dec 9, 2025
·
3 revisions
+-----------------------------+ Yüksek Adresler
| STACK | (Thread’e özel)
| - Local değişkenler |
| - Fonksiyon çağrı frame’leri
+-----------------------------+
| HEAP | (Dinamik bellek)
| - new / malloc alanı |
+-----------------------------+
| .BSS | (Zero-initialized globals)
| - int x; |
| - static int y; |
+-----------------------------+
| .DATA | (Initialized globals)
| - int x = 5; |
| - static bool ready=true; |
+-----------------------------+
| .RODATA | (Read-only constants)
| - String literal’ler |
| - constexpr tablolar |
+-----------------------------+
| .TEXT | (Makine kodu)
| - Fonksiyonlar |
| - Program talimatları |
+-----------------------------+ Düşük Adresler
- Programın derlenmiş makine kodu burada bulunur.
- Salt-okunur ve çalıştırılabilirdir (R-X).
- Tüm thread'ler aynı
.textsegmentini paylaşır. - Concurrency açısından veri yarışı içermez, çünkü state değil koddur.
- String literal'ler ve
constexprveriler. - Thread-safe'dir çünkü değiştirilemez.
- Cache açısından en verimli alandır.
int x = 42;
static bool ready = false;- Program başlamadan önce değerleri hazırdır.
- Tüm thread'ler tarafından paylaşılır.
- Başlangıç değeri deterministiktir.
- Concurrency için güvenli bir başlangıç alanıdır.
int x;
static bool ready;- Açık initializer yoktur ama program başlarken otomatik sıfırlanır.
- OS loader + runtime tarafından sıfırlanır.
- Global
readyiçinfalsegaranti edilir.
auto p = new int; // Çöp değer
auto q = new int(0); // Güvenli- Otomatik sıfırlanmaz.
- Tüm thread'ler tarafından paylaşılabilir.
- Başlangıç değeri mutlaka programcı tarafından atanmalıdır.
void f() {
int x; // Thread’e özel, çöp
std::atomic<bool> ready; // Sıfırlanmaz
}- Her thread'in kendi stack'i vardır.
- Başlangıç değeri belirsizdir.
- Paylaşımlı değildir; ancak pointer/reference ile paylaşılabilir.
-
std::threadher çağrıldığında:- OS yeni kernel thread oluşturur.
- Yeni bir stack alanı tahsis eder.
- Lambda veya fonksiyon o stack üzerinde çalışır.
- Güvenli başlangıç sadece:
.data-
.bsssegmentlerinden gelir.
- Heap ve stack için açık başlangıç zorunludur.
- Thread'ler başlatılmadan önce paylaşılan state hazır olmalıdır.
- Stack değişkenleri thread'e özel olduğu için doğrudan false sharing olmaz.
- Ancak:
- Bir struct pointer ile başka thread'e verilirse
- Aynı cache line'a düşen iki farklı thread stack'i temas ederse dolaylı false sharing oluşabilir.
(Bunu ayrıca özel başlık olarak detaylandıracağız.)
| Alan | Sıfırlı mı | Paylaşımlı mı | Thread-Safe Başlangıç |
|---|---|---|---|
| .text | Evet | Evet | Evet |
| .rodata | Evet | Evet | Evet |
| .data | Evet | Evet | Evet |
| .bss | Evet | Evet | Evet |
| heap | Hayır | Evet | Hayır |
| stack | Hayır | Hayır | Hayır |
- Ulrich Drepper -- What Every Programmer Should Know About Memory
- Intel Software Developer Manual, Vol 3
- C++ Standard -- Object Lifetime, Storage Duration
- Linux Process Memory Layout Documentation