Skip to content

Program Memory Layout & Concurrency

Oğuzhan Düğüncü edited this page Dec 9, 2025 · 3 revisions

Program Memory Layout & Concurrency

Genel Bellek Yerleşimi (Process Memory Layout)

+-----------------------------+  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

1. .text Segmenti (Kod)

  • Programın derlenmiş makine kodu burada bulunur.
  • Salt-okunur ve çalıştırılabilirdir (R-X).
  • Tüm thread'ler aynı .text segmentini paylaşır.
  • Concurrency açısından veri yarışı içermez, çünkü state değil koddur.

2. .rodata Segmenti (Salt-Okunur Veriler)

  • String literal'ler ve constexpr veriler.
  • Thread-safe'dir çünkü değiştirilemez.
  • Cache açısından en verimli alandır.

3. .data Segmenti (Initialized Globals)

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.

4. .bss Segmenti (Zero-Initialized Globals)

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 ready için false garanti edilir.

5. Heap (Dinamik Bellek Alanı)

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.

6. Stack (Thread-Özel Bellek)

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.

7. Thread Oluşturma ve Stack İlişkisi

  • std::thread her çağrıldığında:
    • OS yeni kernel thread oluşturur.
    • Yeni bir stack alanı tahsis eder.
  • Lambda veya fonksiyon o stack üzerinde çalışır.

8. Concurrency Bağlantılı Kritik Kurallar

  • Güvenli başlangıç sadece:
    • .data
    • .bss segmentlerinden 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.

9. False Sharing Stack'te Olur mu? (Ön Bilgi)

  • 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.)


Kısa Özet Tablosu

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

Referanslar

  • 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