← ECMAScript 2027 · İçindekiler
ECMA-262 · 18inci Baskı
29

Bellek Modeli (Memory Model)

Bellek tutarlılık modeli (veya kısaca bellek modeli); bir SharedArrayBuffer tarafından desteklenen bir TypedArray örneğine erişilmesiyle ve Atomics nesnesi üzerindeki metotlar aracılığıyla ortaya çıkan Paylaşılan Veri Bloğu olaylarının (Shared Data Block events) olası sıralamalarını belirtir. Programda veri yarışı (aşağıda tanımlanmıştır) bulunmadığında, olayların sıralaması ardışık tutarlı (sequentially consistent) olarak görünür; yani her bir aracıdan (agent) gelen eylemlerin araya eklenerek sıralanması (interleaving) gibi görünür. Programda veri yarışları bulunduğunda, paylaşılan bellek işlemleri ardışık tutarsız görünebilir. Örneğin programlar nedensellik ihlal eden davranışlar ve diğer beklenmedik durumlar sergileyebilir. Bu beklenmedik durumlar, derleyici dönüşümlerinden ve işlemcilerin tasarımlarından (örneğin, sıra dışı yürütme (out-of-order execution) ve spekülasyon) kaynaklanır. Bellek modeli, hem bir programın ardışık tutarlı davranış sergilemesinin kesin koşullarını hem de veri yarışlarından okunabilecek olası değerleri tanımlar. Demek ki, tanımlanmamış davranış (undefined behaviour) yoktur.

Bellek modeli, bir değerlendirme sırasında SharedArrayBuffer üzerindeki soyut işlemler (abstract operations) veya Atomics nesnesi üzerindeki metotlar tarafından sunulan Bellek olayları (Memory events) üzerindeki ilişkisel kısıtlamalar olarak tanımlanır.

29.1 Bellek Modeli Temelleri (Memory Model Fundamentals)

Paylaşılan bellek erişimleri (okumalar ve yazmalar) iki gruba ayrılır: aşağıda tanımlanan atomik erişimler ve veri erişimleri. Atomik erişimler ardışık tutarlıdır, yani bir aracı kümesindeki (agent cluster) tüm aracılar (agents) tarafından kabul edilen kesin bir toplam olay sıralaması (strict total ordering) vardır. Atomik olmayan erişimlerin tüm aracılar (agents) tarafından kabul edilen kesin bir toplam sıralaması yoktur, yani sıralanmamıştır (unordered).

Bir Paylaşılan Veri Bloğu olayı (Shared Data Block event); bir ReadSharedMemory, WriteSharedMemory veya ReadModifyWriteSharedMemory Kaydıdır (Record). Bir okuma olayı ya bir ReadSharedMemory ya da bir ReadModifyWriteSharedMemory olayıdır. Bir yazma olayı ya bir WriteSharedMemory ya da bir ReadModifyWriteSharedMemory olayıdır.

Tablo 92: ReadSharedMemory Olay Alanları

Alan Adı Değer Anlamı
[[Order]] seq-cst veya unordered Olay için bellek modeli (memory model) tarafından garanti edilen en zayıf sıralama.
[[NoTear]] bir Boolean Bu olayın, kendisiyle aynı bellek aralığına (memory range) sahip birden fazla yazma olayından (write events) okuma yapmasına izin verilip verilmediği.
[[Block]] bir Paylaşılan Veri Bloğu (Shared Data Block) Olayın üzerinde çalıştığı blok.
[[ByteIndex]] negatif olmayan bir tamsayı (integer) [[Block]] içinde okunan bayt adresi.
[[ElementSize]] negatif olmayan bir tamsayı (integer) Okumanın boyutu.

Tablo 93: WriteSharedMemory Olay Alanları

Alan Adı Değer Anlamı
[[Order]] seq-cst, unordered veya init Olay için bellek modeli (memory model) tarafından garanti edilen en zayıf sıralama.
[[NoTear]] bir Boolean Bu olayın, kendisiyle aynı bellek aralığına (memory range) sahip birden fazla okuma olayı (read events) tarafından okunmasına izin verilip verilmediği.
[[Block]] bir Paylaşılan Veri Bloğu (Shared Data Block) Olayın üzerinde çalıştığı blok.
[[ByteIndex]] negatif olmayan bir tamsayı (integer) [[Block]] içinde yazılan bayt adresi.
[[ElementSize]] negatif olmayan bir tamsayı (integer) Yazmanın boyutu.
[[Payload]] bayt değerlerinin (byte values) bir Listesi (List) Diğer olaylar tarafından okunacak bayt değerlerinin (byte values) Listesi (List).

Tablo 94: ReadModifyWriteSharedMemory Olay Alanları

Alan Adı Değer Anlamı
[[Order]] seq-cst Okuma-değiştirme-yazma olayları (write events) her zaman ardışık tutarlıdır.
[[NoTear]] true Okuma-değiştirme-yazma olayları (write events) bölünemez (tear olamaz).
[[Block]] bir Paylaşılan Veri Bloğu (Shared Data Block) Olayın üzerinde çalıştığı blok.
[[ByteIndex]] negatif olmayan bir tamsayı (integer) [[Block]] içindeki okuma-değiştirme-yazma işleminin bayt adresi.
[[ElementSize]] negatif olmayan bir tamsayı (integer) Okuma-değiştirme-yazma işleminin boyutu.
[[Payload]] bayt değerlerinin (byte values) bir Listesi (List) [[ModifyOp]] işlemine geçirilecek bayt değerlerinin (byte values) Listesi (List).
[[ModifyOp]] bir okuma-değiştirme-yazma modifikasyon fonksiyonu Okunan bir bayt değerleri Listesi ve [[Payload]] değerinden değiştirilmiş bir bayt değerleri Listesi döndüren bir Soyut Kapanış (Abstract Closure).

Paylaşılan Veri Bloğu olayları, soyut işlemler (abstract operations) veya Atomics nesnesi üzerindeki metotlar tarafından aday yürütme (candidate execution) Aracı Olayları Kayıtlarına (Agent Events Records) dahil edilir. Bazı işlemler, hiçbir alana sahip olmayan ve yalnızca diğer olayların izin verilen sıralamalarını doğrudan kısıtlamak için var olan Synchronize olaylarını da sunar. Ve son olarak, ana bilgisayara (host) özgü olaylar vardır. Bir Bellek olayı (Memory event) ya bir Paylaşılan Veri Bloğu olayı, ya bir Synchronize olayı ya da bu tür bir ana bilgisayara (host) özgü olaydır.

Paylaşılan Veri Bloğu olayı e'nin bellek aralığı, e.[[ByteIndex]] (dahil) değerinden e.[[ByteIndex]] + e.[[ElementSize]] (hariç) değerine kadar olan aralıktaki (interval) tüm tamsayıların (integers) Kümesi olsun. İki olayın bellek aralıkları, olaylar aynı [[Block]], [[ByteIndex]] ve [[ElementSize]] değerlerine sahip olduğunda eşittir. İki olayın bellek aralıkları, olaylar aynı [[Block]] değerine sahip olduğunda, aralıklar eşit olmadığında ve kesişimleri boş olmadığında örtüşmektedir (overlapping). İki olayın bellek aralıkları, olaylar aynı [[Block]] değerine sahip olmadığında veya aralıkları ne eşit ne de örtüşen olduğunda ayrıktır (disjoint).

Olaylar, aday yürütmeler (candidate executions) içinde aşağıda tanımlanan ilişkilerle sıralanır.

29.2 Aracı Olayları Kayıtları (Agent Events Records)

Bir Aracı Olayları Kaydı (Agent Events Record), aşağıdaki alanlara sahip bir Kayıttır (Record).

Tablo 95: Aracı Olayları Kaydı Alanları

Alan Adı Değer Anlamı
[[AgentSignifier]] bir aracı belirteci (agent signifier) Değerlendirmesi bu sıralamayla sonuçlanan aracı (agent).
[[EventList]] Bellek olaylarının (Memory events) bir Listesi (List) Olaylar, değerlendirme sırasında listeye eklenir.
[[AgentSynchronizesWith]] Synchronize olaylarının çiftlerinden oluşan bir Liste (List) İşlemsel anlambilim (operational semantics) tarafından sunulan Synchronize ilişkileri.

29.3 Seçilen Değer Kayıtları (Chosen Value Records)

Bir Seçilen Değer Kaydı (Chosen Value Record), aşağıdaki alanlara sahip bir Kayıttır (Record).

Tablo 96: Seçilen Değer Kaydı Alanları

Alan Adı Değer Anlamı
[[Event]] bir Paylaşılan Veri Bloğu olayı Bu seçilen değer için sunulan ReadSharedMemory veya ReadModifyWriteSharedMemory olayı.
[[ChosenValue]] bayt değerlerinin (byte values) bir Listesi (List) Değerlendirme sırasında deterministik olmayan bir şekilde seçilen baytlar.

29.4 Aday Yürütmeler (Candidate Executions)

Bir aracı kümesinin (agent cluster) değerlendirmesinin bir aday yürütmesi (candidate execution), aşağıdaki alanlara sahip bir Kayıttır (Record).

Tablo 97: Aday Yürütme Kaydı Alanları

Alan Adı Değer Anlamı
[[EventsRecords]] Aracı Olayları Kayıtlarının bir Listesi (List) Bir aracıyı (agent), değerlendirme sırasında eklenen Bellek olaylarının (Memory events) Listelerine (Lists) eşler.
[[ChosenValues]] Seçilen Değer Kayıtlarının bir Listesi (List) ReadSharedMemory veya ReadModifyWriteSharedMemory olaylarını, değerlendirme sırasında seçilen bayt değerlerinin (byte values) Listesi (List) ile eşler.

Boş bir aday yürütme, alanları boş Listeler (Lists) olan bir aday yürütme Kaydıdır (Record).

29.5 Bellek Modeli için Soyut İşlemler (Abstract Operations for the Memory Model)

29.5.1 EventSet ( execution )

EventSet soyut işlemi; execution (bir aday yürütme) argümanını alır ve Bellek olaylarının (Memory events) bir Kümesini döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. events, boş bir Küme olsun.

  2. execution.[[EventsRecords]] listesindeki her bir Aracı Olayları Kaydı (Agent Events Record) aer için sırayla yap:

    1. aer.[[EventList]] listesindeki her bir Bellek olayı (Memory event) event için sırayla yap:

      1. events kümesine event ekle.
  3. events döndür.

29.5.2 SharedDataBlockEventSet ( execution )

SharedDataBlockEventSet soyut işlemi; execution (bir aday yürütme) argümanını alır ve Paylaşılan Veri Bloğu olaylarının (Shared Data Block events) bir Kümesini döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. events, boş bir Küme olsun.

  2. EventSet(execution) kümesindeki her bir Bellek olayı (Memory event) event için sırayla yap:

    1. Eğer event bir Paylaşılan Veri Bloğu olayıysa, events kümesine event ekle.
  3. events döndür.

29.5.3 HostEventSet ( execution )

HostEventSet soyut işlemi; execution (bir aday yürütme) argümanını alır ve Bellek olaylarının (Memory events) bir Kümesini döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. EventSet(execution) kümesinde bulunan ve SharedDataBlockEventSet(execution) içinde bulunmayan tüm elemanları içeren yeni bir Küme döndür.

ComposeWriteEventBytes soyut işlemi; execution (bir aday yürütme), byteIndex (negatif olmayan bir tamsayı (integer)) ve writes (ya WriteSharedMemory ya da ReadModifyWriteSharedMemory olaylarının bir Listesi (List)) argümanlarını alır ve bayt değerlerinin (byte values) bir Listesini (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. byteLocation, byteIndex olsun.

  2. bytesRead, yeni ve boş bir Liste (List) olsun.

  3. writes listesindeki her bir writeEvent elemanı için sırayla yap:

    1. Assert: writeEvent olayı, kendi bellek aralığında (memory range) byteLocation adresine sahiptir.

    2. payloadIndex, byteLocation - writeEvent.[[ByteIndex]] olsun.

    3. Eğer writeEvent bir WriteSharedMemory olayı ise, o zaman

      1. byte, writeEvent.[[Payload]][payloadIndex] olsun.
    4. Değilse,

      1. Assert: writeEvent bir ReadModifyWriteSharedMemory olayıdır.

      2. bytes, ValueOfReadEvent(execution, writeEvent) olsun.

      3. bytesModified, writeEvent.[[ModifyOp]](bytes, writeEvent.[[Payload]]) olsun.

      4. byte, bytesModified[payloadIndex] olsun.

    5. bytesRead listesine byte ekle.

    6. byteLocation değerini byteLocation + 1 olarak ayarla.

  4. bytesRead döndür.

29.5.5 ValueOfReadEvent ( execution, readEvent )

ValueOfReadEvent soyut işlemi; execution (bir aday yürütme) ve readEvent (bir ReadSharedMemory veya ReadModifyWriteSharedMemory olayı) argümanlarını alır ve bayt değerlerinin (byte values) bir Listesini (List) döndürür. Çağrıldığında aşağıdaki adımları gerçekleştirir:

  1. writes, execution içindeki reads-bytes-from(readEvent) olsun.

  2. Assert: writes, uzunluğu readEvent.[[ElementSize]] değerine eşit olan, WriteSharedMemory veya ReadModifyWriteSharedMemory olaylarının bir Listesidir (List).

  3. ComposeWriteEventBytes(execution, readEvent.[[ByteIndex]], writes) döndür.

29.6 Aday Yürütmelerin İlişkileri (Relations of Candidate Executions)

Aşağıdaki ilişkiler ve matematiksel fonksiyonlar, belirli bir aday yürütme (candidate execution) üzerinden parametrelendirilir ve onun Bellek olaylarını (Memory events) sıralar.

29.6.1 is-agent-order-before

Belirli bir execution aday yürütmesi (candidate execution) için, is-agent-order-before ilişkisi (Relation), bellek olayları üzerinde aşağıdakileri karşılayan en küçük ilişkidir (least Relation):

  • eventA ve eventB olayları için, eğer execution.[[EventsRecords]] listesinde, aer.[[EventList]] listesi hem eventA hem de eventB olaylarını içerecek şekilde bir aer Aracı Olayları Kaydı (Agent Events Record) varsa ve eventA olayı, aer.[[EventList]] Liste (List) sırasına göre eventB olayından önce geliyorsa, execution içinde eventA is-agent-order-before eventB'dir.

29.6.2 reads-bytes-from

Belirli bir execution aday yürütmesi (candidate execution) için, onun reads-bytes-from fonksiyonu, SharedDataBlockEventSet(execution) içindeki Bellek olaylarını (Memory events), SharedDataBlockEventSet(execution) içindeki olayların Listelerine (Lists) eşleyen ve aşağıdaki koşulları karşılayan matematiksel bir fonksiyondur:

Bir aday yürütme (candidate execution) her zaman bir reads-bytes-from fonksiyonunu kabul eder.

29.6.3 reads-from

Belirli bir execution aday yürütmesi (candidate execution) için, onun reads-from ilişkisi (Relation), Bellek olayları (Memory events) üzerinde aşağıdakileri karşılayan en küçük ilişkidir (least Relation):

  • readEvent ve writeEvent olayları için, eğer SharedDataBlockEventSet(execution) hem readEvent hem de writeEvent olaylarını içeriyorsa ve execution içindeki reads-bytes-from(readEvent) writeEvent olayını içeriyorsa, execution içinde readEvent reads-from writeEvent'tir.

29.6.4 host-synchronizes-with

Belirli bir execution aday yürütmesi (candidate execution) için, onun host-synchronizes-with ilişkisi (Relation), ana bilgisayar (host) tarafından sağlanan, ana bilgisayara özgü Bellek olayları (Memory events) üzerinde en azından aşağıdakileri karşılayan bir kesin kısmi sıralamadır (strict partial order):

  • Eğer execution içinde eventA host-synchronizes-with eventB ise, HostEventSet(execution) eventA ve eventB olaylarını içerir.

  • execution içinde host-synchronizes-with ve is-agent-order-before birleşiminde hiçbir döngü (cycle) yoktur.

29.6.5 synchronizes-with

Belirli bir execution aday yürütmesi (candidate execution) için, onun synchronizes-with ilişkisi (Relation), Bellek olayları (Memory events) üzerinde aşağıdakileri karşılayan en küçük ilişkidir (least Relation):

  • readEvent ve writeEvent olayları için, eğer execution içinde readEvent reads-from writeEvent ise, readEvent.[[Order]] değeri seq-cst ise, writeEvent.[[Order]] değeri seq-cst ise ve readEvent ve writeEvent eşit bellek aralıklarına (memory ranges) sahipse, execution içinde writeEvent synchronizes-with readEvent'tir.

  • execution.[[EventsRecords]] listesinin her bir eventsRecord elemanı için aşağıdakiler doğrudur:

    • eventA ve eventB olayları için, eğer eventsRecord.[[AgentSynchronizesWith]] (eventA, eventB) içeriyorsa, execution içinde eventA synchronizes-with eventB'dir.
  • eventA ve eventB olayları için, eğer execution.[[HostSynchronizesWith]] (eventA, eventB) içeriyorsa, execution içinde eventA synchronizes-with eventB'dir.

29.6.6 happens-before

Belirli bir execution aday yürütmesi (candidate execution) için, onun happens-before ilişkisi (Relation), Bellek olayları (Memory events) üzerinde aşağıdaki koşullardan herhangi biri doğru olduğunda karşılanan en küçük ilişkidir (least Relation):

  • eventA ve eventB olayları için, aşağıdaki koşullardan herhangi biri doğruysa, execution içinde eventA happens-before eventB'dir:

29.7 Geçerli Yürütmelerin Özellikleri (Properties of Valid Executions)

29.7.1 Geçerli Seçilmiş Okumalar (Valid Chosen Reads)

Bir execution aday yürütmesi (candidate execution), eğer aşağıdaki algoritma true döndürüyorsa geçerli seçilmiş okumalara (valid chosen reads) sahiptir.

  1. SharedDataBlockEventSet(execution) kümesindeki her bir ReadSharedMemory veya ReadModifyWriteSharedMemory readEvent olayı için sırayla yap:

    1. chosenValueRecord, execution.[[ChosenValues]] listesinin [[Event]] alanı readEvent olan elemanı olsun.

    2. chosenValue, chosenValueRecord.[[ChosenValue]] olsun.

    3. readValue, ValueOfReadEvent(execution, readEvent) olsun.

    4. chosenLength, chosenValue listesindeki eleman sayısı olsun.

    5. readLength, readValue listesindeki eleman sayısı olsun.

    6. Eğer chosenLengthreadLength ise, o zaman

      1. false döndür.
    7. Eğer chosenValue[i] ≠ readValue[i] olacak şekilde 0 (dahil) ile chosenLength (hariç) arasındaki bir i tamsayısı (integer) varsa, o zaman

      1. false döndür.
  2. true döndür.

29.7.2 Uyumlu Okumalar (Coherent Reads)

Bir execution aday yürütmesi (candidate execution), eğer aşağıdaki algoritma true döndürüyorsa uyumlu okumalara (coherent reads) sahiptir.

  1. SharedDataBlockEventSet(execution) kümesindeki her bir ReadSharedMemory veya ReadModifyWriteSharedMemory readEvent olayı için sırayla yap:

    1. writes, execution içindeki reads-bytes-from(readEvent) olsun.

    2. byteLocation, readEvent.[[ByteIndex]] olsun.

    3. writes listesinin her bir writeEvent elemanı için sırayla yap:

      1. Eğer execution içinde readEvent happens-before writeEvent ise, o zaman

         1. `false` döndür.
      2. Eğer bellek aralığında byteLocation adresini bulunduran, execution içinde writeEvent happens-before value ve value happens-before readEvent koşulunu sağlayan bir WriteSharedMemory veya ReadModifyWriteSharedMemory value olayı varsa, o zaman

         1. `false` döndür.
      3. byteLocation değerini byteLocation + 1 olarak ayarla.

  2. true döndür.

29.7.3 Bölünmesiz Okumalar (Tear Free Reads)

Bir execution aday yürütmesi (candidate execution), eğer aşağıdaki algoritma true döndürüyorsa bölünmesiz okumalara (tear free reads) sahiptir.

  1. SharedDataBlockEventSet(execution) kümesindeki her bir ReadSharedMemory veya ReadModifyWriteSharedMemory readEvent olayı için sırayla yap:

    1. Eğer readEvent.[[NoTear]] değeri true ise, o zaman

      1. Assert: readEvent.[[ByteIndex]] değerinin readEvent.[[ElementSize]] değerine bölünmesinden kalan 0'dır.

      2. execution içinde readEvent reads-from writeEvent olan ve writeEvent.[[NoTear]] değeri true olan her bir Bellek olayı (Memory event) writeEvent için sırayla yap:

         1. Eğer *readEvent* ve *writeEvent* eşit [bellek aralıklarına (memory ranges)](#sec-memory-model-fundamentals) sahipse ve *value* ve *writeEvent* eşit [bellek aralıklarına (memory ranges)](#sec-memory-model-fundamentals) sahip olacak şekilde bir [Bellek olayı (Memory event)](#sec-memory-model-fundamentals) *value* varsa, *value*.*[[NoTear]]* değeri `true` ise, *writeEvent* ve *value* aynı [Paylaşılan Veri Bloğu olayı (Shared Data Block event)](#sec-memory-model-fundamentals) değilse ve *execution* içinde *readEvent* [reads-from](#sec-reads-from) *value* ise, o zaman
           
                    1. `false` döndür.
  2. true döndür.

29.7.4 Ardışık Tutarlı Atomikler (Sequentially Consistent Atomics)

Belirli bir execution aday yürütmesi (candidate execution) için is-memory-order-before, EventSet(execution) içindeki tüm Bellek olaylarının (Memory events) aşağıdaki koşulları karşılayan bir kesin toplam sıralamasıdır (strict total order):

Bir aday yürütme (candidate execution), eğer bir is-memory-order-before ilişkisini (Relation) kabul ediyorsa ardışık tutarlı atomiklere (sequentially consistent atomics) sahiptir.

29.7.5 Geçerli Yürütmeler (Valid Executions)

Bir execution aday yürütmesi (candidate execution), eğer aşağıdaki koşulların tümü doğruysa bir geçerli yürütmedir (valid execution) (veya kısaca bir yürütmedir (execution)).

Tüm programların en az bir geçerli yürütmesi vardır.

29.8 Yarışlar (Races)

Bir execution yürütmesi ile SharedDataBlockEventSet(execution) kümesinde yer alan eventA ve eventB olayları için, eğer aşağıdaki algoritma true döndürüyorsa eventA ve eventB bir yarış (race) içindedir.

  1. Eğer eventA ve eventB aynı Paylaşılan Veri Bloğu olayı (Shared Data Block event) değilse, o zaman

    1. Eğer execution içinde hem eventA happens-before eventB hem de eventB happens-before eventA olması durumu söz konusu değilse, o zaman

      1. Eğer eventA bir WriteSharedMemory veya ReadModifyWriteSharedMemory olayıysa, eventB bir WriteSharedMemory veya ReadModifyWriteSharedMemory olayıysa ve eventA ile eventB ayrık olmayan bellek aralıklarına (memory ranges) sahipse, o zaman

         1. `true` döndür.
      2. Eğer execution içinde eventA reads-from eventB ise veya eventB reads-from eventA ise, o zaman

         1. `true` döndür.
  2. false döndür.

29.9 Veri Yarışları (Data Races)

Bir execution yürütmesi ile SharedDataBlockEventSet(execution) kümesinde yer alan eventA ve eventB olayları için, eğer aşağıdaki algoritma true döndürüyorsa eventA ve eventB bir veri yarışı (data race) içindedir.

  1. Eğer execution içinde eventA ve eventB bir yarış (race) içindeyse, o zaman

    1. Eğer eventA.[[Order]] değeri seq-cst değilse veya eventB.[[Order]] değeri seq-cst değilse, o zaman

      1. true döndür.
    2. Eğer eventA ve eventB örtüşen bellek aralıklarına (memory ranges) sahipse, o zaman

      1. true döndür.
  2. false döndür.

29.10 Veri Yarışından Kaçınma (Data Race Freedom)

Bir execution yürütmesi, SharedDataBlockEventSet(execution) içinde bir veri yarışı (data race) içinde olan iki olay yoksa veri yarışından kaçınmıştır (data race free).

Bir program, tüm yürütmeleri veri yarışından kaçınmışsa veri yarışından kaçınmıştır (data race free).

Bellek modeli (memory model), veri yarışından kaçınmış programlar için tüm olayların ardışık tutarlılığını (sequential consistency) garanti eder.

29.11 Paylaşılan Bellek Kılavuzu (Shared Memory Guidelines)