Bölüm 12: Çok İşlemcili Sistemler

Bölüm 12: Çok İşlemcili Sistemler · Çalışma Soruları
Amdahl yasasıNUMAOmega ağıMESIYanlış paylaşımBilet kilidiÇete çizelgelemeHiperküpRPCSanallaştırmaDağıtık sistemler
Sercan KÜLCÜ

Çıktı Sorusu · Giriş

Soru 1: Çekirdek Eklemenin Sınırı

Bir programın çalışma süresinin %80’i paralelleştirilebiliyor, %20’si sıralı kalmak zorunda.

  1. 8 çekirdekte hızlanma nedir?
  2. Çekirdek sayısı sonsuza giderse hızlanma en fazla ne olur?
  3. 4 kat hızlanma için kaç çekirdek gerekir?
  4. Paralel kısım %90 olsaydı 32 çekirdekte hızlanma ne olurdu?
Cevabı göster

Amdahl: S(n) = 1 / ((1 − p) + p / n), p = 0,8.

(a) 1 / (0,2 + 0,1) = 3,33.

(b) p / n → 0: 1 / 0,2 = 5.

(c) 0,2 + 0,8 / n = 0,25 → 0,8 / n = 0,05 → n = 16: 8’den 16’ya çıkmak yalnızca 3,33 → 4 kazandırır.

(d) 1 / (0,1 + 0,9 / 32) = 1 / 0,128 ≈ 7,8 (tavan 10).

Sıralı kısım tavanı belirler; saat hızı yerine çekirdek sayısı artarken yazılımın paralel kısmını büyütmek bu yüzden önemlidir.

Çoktan Seçmeli · Çok İşlemcili Donanım

Soru 2: Bellek Erişimi Neden Değişir?

İki soketli bir sunucuda bir iş parçacığı kendi soketine bağlı bellekten 80 ns’de, diğer soketin belleğinden 140 ns’de okuyabiliyor; iki bellek de sıradan LOAD/STORE komutlarıyla erişilebilir. Bu mimari nasıl adlandırılır?

C: NUMA’da tüm CPU’lar tek adres alanını görür ve uzak belleğe de sıradan komutlarla erişir; yalnızca süre belleğin hangi düğümde olduğuna bağlıdır. Bu yüzden işletim sistemi süreci ve sayfalarını aynı düğümde tutmaya çalışır (ilk dokunma, otomatik NUMA dengeleme). Çoklu bilgisayarda bellek paylaşılmaz.

Çıktı Sorusu · Çok İşlemcili Donanım

Soru 3: NUMA’da Ortalama Gecikme

Bir NUMA sisteminde yerel bellek erişimi 80 ns, uzak bellek erişimi 200 ns.

  1. Bir iş parçacığının erişimlerinin %85’i yerelse ortalama erişim süresi nedir?
  2. Çizelgeleyici iş parçacığını başka bir düğüme taşıdığı için oran %40’a düşerse?
  3. İşletim sistemi bu kaybı önlemek için ne yapabilir?
Cevabı göster

Ortalama = y · tyerel + (1 − y) · tuzak.

(a) 0,85 × 80 + 0,15 × 200 = 68 + 30 = 98 ns.

(b) 0,40 × 80 + 0,60 × 200 = 32 + 120 = 152 ns: yaklaşık %55 yavaşlama.

(c) İş parçacığını verisinin bulunduğu düğümde tutmak (afinite, önce aynı düğüm içinde yük dengeleme) ya da sayfaları iş parçacığının yanına taşımak (Linux otomatik NUMA dengeleme); uygulama tarafında numactl ile bağlama.

Çıktı Sorusu · Çok İşlemcili Donanım

Soru 4: Çapraz Çubuk ve Omega Ağı

n CPU n bellek modülüne bağlanacak.

  1. n = 16 ve n = 128 için çapraz çubukta kaç kesişim noktası, omega ağında kaç 2 × 2 anahtar gerekir?
  2. 8 × 8 omega ağında CPU 101, bellek 010’a erişmek istiyor. Her aşamada anahtarın hangi çıkışı (üst/alt) kullanılır?
  3. Omega ağı bu tasarruf için ne öder?
Cevabı göster
nçapraz çubuk n²omega (n/2)·log₂n
162568 × 4 = 32
12816 38464 × 7 = 448

(b) Her aşama hedef adresin bir bitine bakar (soldan sağa): 0 → üst, 1 → alt. Hedef 010: 1. aşama üst, 2. aşama alt, 3. aşama üst. Kaynak adresi yönlendirmeye karışmaz; yanıt için anahtarlar kaynak bitlerini kaydeder.

(c) Omega engellemelidir: iki istek aynı anahtar çıkışını isterse biri bekler; ayrıca her istek log₂n aşamadan geçtiği için gecikme artar. Çapraz çubuk engellemesizdir ama maliyeti n² ile büyür.

Adım Adım Çalıştırma · Çok İşlemcili Donanım

Soru 5: MESI Durumlarını İzlemek

Üç çekirdekli bir sistemde aynı önbellek satırına (x) sırayla şu erişimler yapılıyor. Her adımdan sonra satır üç önbellekte hangi MESI durumundadır? Kaç geçersiz kılma gerekir?

Ç0 önbelleğiI—Ç1 önbelleğiI—Ç2 önbelleğiI—veri yolubellek: güncel

Başlangıçta x = 0 yalnızca bellekte; üç önbellekte de satır I (geçersiz).

Ç0 önbelleğiEx=0Ç1 önbelleğiI—Ç2 önbelleğiI—veri yolubellek: güncel

Ç0 okur: BusRd, başka kopya yok → bellekten alır, E (tek ve temiz).

Ç0 önbelleğiSx=0Ç1 önbelleğiSx=0Ç2 önbelleğiI—veri yolubellek: güncel

Ç1 okur: Ç0 isteği dinler, “bende var” der → ikisi de S. Bellek hâlâ güncel.

Ç0 önbelleğiI—Ç1 önbelleğiMx=1Ç2 önbelleğiI—veri yolubellek: eski

Ç1 yazar: S’deki satıra yazmak için geçersiz kılma yayınlanır → Ç0 I, Ç1 M; bellek artık eski. (Geçersiz kılma 1)

Ç0 önbelleğiSx=1Ç1 önbelleğiSx=1Ç2 önbelleğiI—veri yolubellek: güncel

Ç0 okur: ıska. Ç1 kirli satırı verir ve belleğe geri yazar → ikisi de S, bellek güncel.

Ç0 önbelleğiI—Ç1 önbelleğiI—Ç2 önbelleğiMx=2veri yolubellek: eski

Ç2 yazar: satır onda yok; okuyup özel almak için diğer kopyalar geçersiz kılınır → Ç0 ve Ç1 I, Ç2 M. (Geçersiz kılma 2)

Ç0 önbelleğiI—Ç1 önbelleğiI—Ç2 önbelleğiMx=2veri yolubellek: eski

Ç2 okur: kendi önbelleğinde M → isabet, veri yolu trafiği yok.

Ç0 önbelleğiMx=3Ç1 önbelleğiI—Ç2 önbelleğiI—veri yolubellek: eski

Ç0 yazar: Ç2’deki kirli kopya verilip geçersiz kılınır → Ç0 M, Ç2 I. Toplam 3 geçersiz kılma; bellek yine eski.

Ç0: oku(x);      // x = 0
Ç1: oku(x);
Ç1: x = 1;
Ç0: oku(x);
Ç2: x = 2;
Ç2: oku(x);
Ç0: x = 3;

Çoktan Seçmeli · Çok İşlemcili Donanım

Soru 6: Ayrı Sayaçlar, Yavaş Program

İki iş parçacığı birbirinden bağımsız iki sayacı (long sayac[2], art arda) milyonlarca kez artırıyor; ortak veri yok, kilit de yok. Program tek iş parçacıklı sürümden yavaş çalışıyor. En olası neden nedir?

B: Tutarlılık birimi değişken değil satırdır. Ç0 sayac[0]’ı artırınca satırı M alır ve Ç1’in kopyası geçersiz olur; Ç1 sayac[1]’i artırınca satır geri taşınır: “ping-pong”. Her sayacı ayrı satıra hizalamak (dolgu, Java’da @Contended) sorunu çözer. Ayrı değişkenlerde yarış durumu yoktur; art arda iki long da aynı sayfada, dolayısıyla aynı düğümdedir.

Çoktan Seçmeli · Çok İşlemcili İşletim Sistemleri

Soru 7: Usta-Köle Modelinin Sorunu

Bir çok işlemcili işletim sisteminde çekirdek yalnızca CPU 0’da çalışıyor; diğer CPU’lar kullanıcı süreçlerini yürütüyor ve her sistem çağrısını CPU 0’a iletiyor. Sistem çağrısı yoğun bir iş yükünde 16 CPU’ya çıkınca ne beklenir?

A: Usta-köle modelinde çekirdek verisine tek CPU dokunur: basittir, kilit gerekmez ve tek hazır listesi yükü kendiliğinden dengeler. Bedeli, ustanın kapasitesinin tüm sistemi sınırlamasıdır; usta çökerse sistem de durur. B ve D “her CPU’nun kendi işletim sistemi” modelinin, C ise SMP’nin sorunudur.

Çoktan Seçmeli · Senkronizasyon

Soru 8: Spinlock Veri Yolunu Boğuyor

Sekiz çekirdek aynı kilit değişkeni üzerinde sürekli TSL komutu çalıştırarak dönüyor ve sistemin geri kalanı yavaşlıyor. Hangi değişiklik bu trafiği en çok azaltır?

D: Her TSL bir yazmadır: satırı M’ye çekip diğer kopyaları geçersiz kılar, satır çekirdekler arasında sürekli taşınır. Test-and-test-and-set’te bekleyenler kendi önbelleklerindeki S kopyayı okuyarak döner ve veri yolunu kullanmaz; üstel geri çekilme çakışmayı daha da azaltır. Önbelleği kapatmak her okumayı belleğe gönderir ve trafiği artırır. Daha ölçeklenebilir çözümler bilet kilidi ve MCS’dir.

Adım Adım Çalıştırma · Senkronizasyon

Soru 9: Bilet Kilidi

Üç iş parçacığı bilet kilidini kullanıyor. next ve serving nasıl değişir, kritik bölgeye hangi sırayla girilir? Bekleyenler neden veri yolunu doldurmaz?

next0serving0kritik bölgede:kimsedönenler:—

İki sayaç: next bilet dağıtır, serving sırası gelen bileti gösterir. Kilit serbest. Sırayla T1, T0, T2 kilitle çağırıyor; sonra sahipler bırakıyor.

next1serving0kritik bölgede:T1 (0)dönenler:—

T1 kilitle: atomik artırma eski değeri (bilet 0) verir, next = 1. serving == 0 → döngüye girmeden kritik bölgeye geçer.

next2serving0kritik bölgede:T1 (0)dönenler:T0 (1)

T0 kilitle: bilet 1, next = 2. serving (0) ≠ 1 → kendi önbelleğindeki S kopyayı okuyarak döner; veri yolu meşgul edilmez.

next3serving0kritik bölgede:T1 (0)dönenler:T0 (1)T2 (2)

T2 kilitle: bilet 2, next = 3. serving (0) ≠ 2 → kendi önbelleğindeki S kopyayı okuyarak döner; veri yolu meşgul edilmez.

next3serving1kritik bölgede:T0 (1)dönenler:T2 (2)

T1 bırakır: serving = 1. Bu yazma dönenlerin kopyasını geçersiz kılar; yeni değeri okuyan T0 (bilet 1) girer, diğerleri dönmeyi sürdürür.

next3serving2kritik bölgede:T2 (2)dönenler:—

T0 bırakır: serving = 2. Bu yazma dönenlerin kopyasını geçersiz kılar; yeni değeri okuyan T2 (bilet 2) girer, diğerleri dönmeyi sürdürür.

next3serving3kritik bölgede:kimsedönenler:—

T2 bırakır: serving = 3 = next. Bekleyen yok, kilit serbest. Giriş sırası biletlerin sırasıdır: T1, T0, T2.

void kilitle(void) {
  int my = atomik_artir(&next); // eski değer
  while (serving != my)
    pause();           // yerelde dön
}
void birak(void) {
  serving++;
}

Çoktan Seçmeli · Senkronizasyon

Soru 10: Dönmek mi, Uyumak mı?

Bir çekirdekte bağlam değiştirmenin maliyeti C = 4 µs (uyuyup geri gelmek iki değiştirme ister). Hangi durumda kilidi dönerek beklemek daha akıllıcadır?

A: Kural: beklenen bekleme 2C’den (8 µs) kısaysa dön, değilse uyu. 1 µs’lik kritik bölgede dönmek bağlam değiştirmeden ucuzdur. Tek CPU’da dönmek anlamsızdır: sahip, dönen iş parçacığı CPU’yu bırakmadan ilerleyemez. Uyuyan sahip ise uzun süre dönecek demektir. Pratikte uyarlamalı kilitler önce kısa süre döner, sonra uyur.

Klasik Soru · Çizelgeleme

Soru 11: Çeteleri Dilimlere Yerleştirmek

6 CPU’lu bir sistemde beş paralel uygulama çete çizelgelemeyle çalışacak; iş parçacığı sayıları A: 4, B: 2, C: 3, D: 3, E: 5. Bir çetenin tüm iş parçacıkları aynı dilimde, farklı CPU’larda çalışmalıdır.

  1. Bir tur en az kaç dilim sürer? Bir yerleşim verin.
  2. CPU kullanımı yüzde kaçtır?
  3. Zaman paylaşımında A’nın iki iş parçacığı ileti alışverişi yaparken ne olurdu?
Cevabı göster
dilimCPU 0–5boş
0A A A A B B0
1C C C D D D0
2E E E E E —1

(a) Toplam 17 iş parçacığı, dilim başına 6 CPU → en az ⌈17 / 6⌉ = 3 dilim; yerleşim yukarıda. E (5) yalnızca 1 iş parçacıklık boşlukla birleşebilir; hiçbir çete 1 olmadığından o dilimde 1 CPU boş kalır.

(b) 17 / 18 ≈ %94.

(c) A0’ın gönderdiği iletiyi A1 ancak kendi dilimi gelince görür, yanıt da bir dilim bekler: her istek–yanıt dilim boyu gecikir. Çetede üyeler aynı anda koştuğu için iletiler hemen yanıtlanır.

Çıktı Sorusu · Çoklu Bilgisayarlar

Soru 12: Ara Bağlantıların Çapı

64 düğümlü bir çoklu bilgisayar için dört ara bağlantı düşünülüyor: çift yönlü halka, 8 × 8 ızgara, 8 × 8 simit (torus) ve 6 boyutlu hiperküp. Her birinin çapını (en uzak iki düğüm arası atlama sayısı) ve bağlantı sayısını bulun. Düğüm sayısı 128’e çıkınca hiperküpün çapı ne olur?

Cevabı göster
topolojiçapbağlantı
halka3264
8 × 8 ızgara14112
8 × 8 simit8128
6B hiperküp6192

Halka: 64 / 2 = 32. Izgara: (8 − 1) + (8 − 1) = 14, bağlantı 2 × 8 × 7. Simit: sarma bağlantılarıyla 4 + 4 = 8, bağlantı 2 × 64. Hiperküp: çap log₂64 = 6, bağlantı 64 × 6 / 2.

128 düğümde hiperküpün çapı yalnızca 7 olur (düğüm ikiye katlanınca çap 1 artar); halkada ise 64’e çıkar. Bedeli, düğüm başına bağlantı sayısının da artmasıdır.

Adım Adım Çalıştırma · Çoklu Bilgisayarlar

Soru 13: Hiperküpte Yönlendirme

4 boyutlu hiperküpte 0110 düğümünden 1001 düğümüne giden ileti, her adımda soldaki ilk farklı biti düzelterek ilerliyor. Hangi düğümlerden geçer, kaç atlama yapar?

0000000100110010010001010111011011001101111111101000100110111010

4B hiperküp 4 × 4 simit olarak çizildi (satır ve sütunlar Gray koduyla): komşular tek bitte farklıdır, kesikli çizgiler karşı kenara sarar. Kaynak 0110, hedef 1001.

0000000100110010010001010111011011001101111111101000100110111010

fark = 0110 ⊕ 1001 = 1111; soldan ilk farklı bit 1. bit → 1110. (Atlama 1)

0000000100110010010001010111011011001101111111101000100110111010

fark = 1110 ⊕ 1001 = 0111; soldan ilk farklı bit 2. bit → 1010. (Atlama 2)

0000000100110010010001010111011011001101111111101000100110111010

fark = 1010 ⊕ 1001 = 0011; soldan ilk farklı bit 3. bit → 1000. (Atlama 3)

0000000100110010010001010111011011001101111111101000100110111010

fark = 1000 ⊕ 1001 = 0001; soldan ilk farklı bit 4. bit → 1001. (Atlama 4) Hedefe varıldı: atlama sayısı = Hamming uzaklığı = 4, bu da 4B hiperküpün çapıdır. Kural yerel olduğundan yönlendirme tablosu gerekmez.

cur = kaynak;               // 0110
while (cur != hedef) {      // hedef 1001
  fark = cur ^ hedef;
  bit = en_soldaki_bir(fark);
  cur = cur ^ bit;          // komşuya ilet
}

Çıktı Sorusu · Çoklu Bilgisayarlar

Soru 14: Sakla ve İlet ya da Kesip Geç

8 KiB’lık bir paket kaynaktan hedefe 3 anahtar, yani 4 bağlantı üzerinden gidiyor. Her bağlantı 25 Gb/s; her anahtar başlığı 0,05 µs’de işliyor (kablo gecikmesini yok sayın).

  1. Paketin bir bağlantıdan geçme süresi nedir?
  2. Sakla ve ilet ile toplam gecikme nedir?
  3. Kesip geç ile toplam gecikme nedir?
  4. Atlama sayısı iki katına çıkarsa hangisi çok etkilenir?
Cevabı göster

(a) 8192 × 8 / 25 × 10⁹ s = 2,62 µs.

(b) Her anahtar paketin tamamını alıp sonra iletir: 4 × 2,62 + 3 × 0,05 = 10,64 µs.

(c) Başlık gelince yol kurulur, paket boru gibi akar: 2,62 + 3 × 0,05 = 2,77 µs.

(d) Sakla ve iletin gecikmesi atlama sayısıyla doğrusal büyür (8 bağlantıda yaklaşık 21 µs); kesip geçte yalnızca başlık işleme süreleri eklenir. HPC ağları ve veri merkezi anahtarları bu yüzden kesip geç ya da solucan deliği yöntemini kullanır.

Çoktan Seçmeli · Çoklu Bilgisayarlar

Soru 15: Uzak Prosedür Çağrısında Koçan

İstemci toplam = hesapla(dizi, n) çağrısını sıradan bir fonksiyon gibi yazıyor ama fonksiyon başka bir makinede çalışıyor. İstemci koçanının (stub) görevi nedir ve RPC’de hangi parametre türü sorun çıkarır?

B: Koçan yerel bir prosedür gibi çağrılır, parametreleri bir iletiye paketler (marshalling), çekirdek aracılığıyla sunucuya gönderir ve yanıtı açıp döndürür. İşaretçi başka bir adres alanında anlamsızdır: dizi değer olarak gönderilir, gerekirse geri kopyalanır (kopyala-geri yükle). Küresel değişkenler, kısmi hatalar ve bayt sırası da ayrıca ele alınmalıdır.

Çoktan Seçmeli · Sanallaştırma

Soru 16: Tip 1 ve Tip 2 Hipervizör

Bir öğrenci dizüstündeki Windows üzerinde VirtualBox ile Linux çalıştırıyor; bir veri merkezi ise sunucularını doğrudan donanım üzerinde çalışan ESXi ile bölüştürüyor. Bunlar sırasıyla hangi türdür?

C: Tip 1 hipervizör donanımı doğrudan yönetir ve misafir işletim sistemlerini çalıştırır (ESXi, Xen, Hyper-V; KVM Linux’u hipervizöre dönüştürür). Tip 2 sıradan bir uygulama gibi bir ana işletim sistemi üzerinde çalışır ve aygıt erişimini ona bırakır. Donanım desteği (VT-x) iki türde de kullanılabilir; tür, hipervizörün nerede çalıştığıyla belirlenir.

Çıktı Sorusu · Sanallaştırma

Soru 17: İki Boyutlu Sayfa Yürüyüşü

Misafir işletim sistemi 4 düzeyli sayfa tabloları kullanıyor; ana makine EPT için 5 düzeyli tablo kullanıyor. Misafirin bir sanal adresinde TLB ıskası oluyor ve hiçbir tablo girdisi önbellekte değil.

  1. EPT ile en kötü durumda kaç bellek erişimi gerekir (son veri erişimi hariç)?
  2. Hipervizör gölge sayfa tabloları kullansaydı aynı ıska kaç erişim isterdi?
  3. Gölge tablonun bedeli nerededir?
Cevabı göster

(a) Misafir tablosunun 4 düzeyinin her girdisi bir misafir fiziksel adresidir ve EPT’den (5 erişim) geçmelidir; ardından girdi okunur. Son misafir fiziksel adresi de çevrilmelidir: (4 + 1) × (5 + 1) − 1 = 29 erişim. (İki taraf da 4 düzeyli olsaydı 24.)

(b) Gölge tablo doğrudan misafir sanal → ana fiziksel eşlemesini tutar: 4 erişim, tek boyutlu yürüyüş.

(c) Misafirin tablolarını salt okunur yapmak gerekir; misafir her tablo değişikliğinde tuzağa düşer (VM çıkışı) ve hipervizör gölgeyi günceller. EPT bu çıkışları kaldırır, bedeli uzun ıska yürüyüşüdür; büyük sayfalar ve VM etiketli TLB bu yüzden önemlidir.

Çoktan Seçmeli · Sanallaştırma

Soru 18: Konteynerde uname -r

Linux 6.8 çekirdeğiyle çalışan bir sunucuda, Ubuntu 20.04 tabanlı bir Docker konteyneri ve Ubuntu 20.04 kurulu bir KVM sanal makinesi çalışıyor. İkisinde de uname -r komutu çalıştırılırsa hangisi doğrudur?

D: Konteynerler ana makinenin tek çekirdeğini paylaşır; yalnızca kullanıcı alanı (kütüphaneler, araçlar) Ubuntu 20.04’tür. Yalıtım ad alanları, cgroups ve seccomp ile sağlanır. Sanal makine ise kendi misafir çekirdeğini önyükler. Bu yüzden konteynerde farklı bir işletim sistemi (ör. Linux üstünde Windows çekirdeği) çalıştırılamaz.

Çoktan Seçmeli · Dağıtık Sistemler

Soru 19: Değişiklik Ne Zaman Görünür?

İstemci 1 bir dosyayı açıp sonuna “c” ekliyor ama henüz kapatmıyor; bu sırada istemci 2 dosyayı açıp okuyor. Dosya “ab” idi. Oturum semantiği kullanan bir sistemde (ör. AFS) istemci 2 ne görür?

C: Oturum semantiğinde değişiklikler dosya kapatılana kadar yalnızca onu yapan istemcide görünür; kapatıldıktan sonra açanlar yeni sürümü görür. A, tek makinedeki UNIX semantiğidir: her yazma hemen görünür ama dağıtık sistemde önbellekler yüzünden pahalıdır. Değişmez dosyalar ve işlemler diğer seçeneklerdir; hepsi tutarlılık ile performans arasında bir ödünleşimdir.

Son

Bölüm 12: Çok İşlemcili Sistemler: Çalışma Soruları
Konu anlatımı: Çok işlemcili sistemler sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.