NUMA

**NUMA**, **Düzensiz Bellek Erişimi** veya **Düzensiz Bellek Mimarisi** “**N**on-**U**niform **M**emory **A**ccess veya **N**on-**U**niform **M**emory **A**rchitecture” (NUMA) çok işlemcililerde bellek erişim zamanının belleğin işlemci üzerindeki yerine bağlı olduğu bir bilgisayar belleği tasarımıdır. NUMA altında bir işlemci kendi yerel belleğine yerel olmayan bellekten daha hızlı bir şekilde ulaşır, diğer bir ifadeyle, bir başka işlemcinin yerel belleğinden veya işlemciler arasında paylaşılan bellekten daha hızlı erişir.

NUMA mimarileri simetrik çoklu işleme (SMP) mimarilerinden başlayarak mantıksal bir ölçeklemeyi takip eder. Bu ürünlerin ticari gelişimi 1990'lı yıllarda Convex Computer (daha sonra HP oldu), SGI, Sequent ve Data General ile başladı. Bu şirketler tarafından geliştirilen teknikler çeşitli Unix benzeri işletim sisteminde olduğu gibi bir ölçüye kadar Windows NT ve Microsoft Windows’un ileri versiyonlarında görülmektedir.

## Temel kavramlar
Modern CPU’lar bağlı oldukları ana bellekten önemli ölçüde daha hızlı çalışırlar. Yüksek hızlı hesaplamalar ve süper bilgisayarların ilk zamanlarında CPU genellikle bellekten daha yavaş çalışırdı. Bu durum her ikisinin performans çizgilerinin kesiştiği 1970'li yıllara kadar böyle devam etti. O tarihlerden bu yana CPU’lar her geçen gün daha da artan bir şekilde veriye doymuyor, bellek erişiminin tamamlanması için beklemek zorunda kalıyorlar. 1980'lerin ve 1990'ların süper bilgisayar tasarımları daha hızlı işlemciler yerine yüksek hızlı bellek erişimi sağlamak ve bilgisayarları büyük veri kümeleri üzerinde diğer sistemlerin erişemeyeceği hızlarda çalıştırmaya odaklanmıştı.

Modern bir bilgisayardan yüksek performans çıkartmanın anahtarı bellek erişim sayısını sınırlamaktan geçmektedir. Ticari işlemciler söz konusu olduğunda bunun anlamı gittikçe artan miktarda yüksek hızlı önbellek belleği yerleştirmek ve “önbellek kayıplarını” önleyebilmek için gittikçe artan karmaşıklıkta sofistike algoritmalar kullanmaktır. Fakat işletim sistemlerinin boyutlarındaki dramatik artış ve üzerlerinde koşan uygulamalar önbellek işleme konusundaki bu gelişmeleri bir anlamda ikinci planda bırakmıştır. Çok işlemcili sistemler bu sorunu daha da beter hale getirmektedir. Bu yüzden artık bir sistemin birden fazla işlemcisi açlık çekmekte, çünkü her bir işlemci belleğe ayrı zamanlarda erişebilmektedir.

NUMA bu sorunu **her bir işlemciye ayrı bir bellek** atayarak çözmeye çalışmaktadır. Birden fazla işlemci aynı belleğe erişmeye çalıştığında oluşacak performans düşüşünden de kaçınılmasına çalışmaktadır. Yayılı veri ile ilgili sorunlar söz konusu olduğunda (sunucular ve benzeri uygulamalarda sık görülür), NUMA tek bir paylaşılan bellek üzerindeki performansı kabaca bir hesapla işlemci (veya ayrı bellek bankaları) sayısının bir faktörü kadar artırır.

Tabii ki bütün bunlar tek bir göreve indirgenerek sınırlandırılamaz, yani birden fazla işlemci aynı anda aynı verilere ihtiyaç duyuyor olabilir. NUMA sistemleri bu tür vakalarla başa çıkabilmek için verinin bankalar arasında hareketini sağlamak üzere ilave donanım ve yazılıma sahiptirler. Birden fazla işlemcinin aynı anda aynı belleğe erişmeye çalışması söz konusu bankalara bağlı işlemcilerin hızlarında düşüşlere neden olur. NUMA belirli herhangi bir zaman kesitinde sistemde koşan görevin tabiatına tam olarak uygun harekete yol açacağından sistemin tamamının hızında da bir artışa neden olacaktır.

## Önbellek uyumlu NUMA (ccNUMA)
Hemen hemen bütün CPU mimarileri bellek erişiminde referans lokallemesi kullanımı için önbellek adı verilen, paylaşılmayan ve çok hızlı bir bellek parçası kullanır. Önbellek eş evreliliği NUMA ile paylaşılan bellek üzerinde de devam ettirmeye çalışmak önemli ölçüde yük getirir.

Tasarlanması ve üretilmesi daha basit olmasına rağmen önbellek uyumlu olmayan NUMA sistemleri, standart **von Neuman mimarisi** programlama modeli içerisinde programlanamayacak kadar karmaşık bir hale geldiler. Bunun sonucu olarak piyasada satılmakta olan bütün NUMA'lı bilgisayarlar önbellek uyumunun sağlanabilmesi için özel amaçlı donanımlara sahiptir ve bu nedenle **“önbellek uyumlu NUMA” (cache-coherent NUMA)** veya ccNUMA diye sınıflandırılırlar.

Bu durum tipik olarak, birden fazla önbellek aynı bellek lokasyonunu depoladığında önbellek kontrol birimleri arasında tutarlı bir bellek görüntüsünün sağlanabilmesi amacıyla işlemciler arası iletişim gerçekleştiğinde meydana gelir. Bu nedenle, birden fazla işlemci süratli çalışma ortamında aynı bellek alanına erişmeye çalıştığında ccNUMA kötü bir performans gösterir. NUMA'ya İşletim sistemi desteği sağlanarak bellek ve işlemcilerin NUMA'ya uygun olacak bir biçimde dağıtılması ve bu şekilde NUMA'ya uygun olmayacak erişimlerin engellenmesi, kilitlenmesi veya erişimlerin buna göre planlanması sağlanabilir.

Günümüzde mevcut **ccNUMA** sistemi uygulamaları AMD Opteron işlemci tabanlı çok işlemcili sistemlerdir. Daha önceki ccNUMA yaklaşımları Digital Equipment Corporation (DEC) şirketinin Alfa İşlemcisi EV7 tabanı üzerine kurulmuştu.

## NUMA ile Grup hesaplamanın karşılaştırılması
NUMA çok sıkı çiftlenmiş bir çeşit grup hesaplama olarak görülebilir. NUMA donanımının mevcut olmadığı yerde bir grup mimarisine sanal bellek sayfalamanın ilavesi ile tamamen yazılım olarak NUMA yaratılması mümkündür. Buna rağmen yazılım tabanlı NUMA uygulamasında boğum noktaları arasındaki gecikme süresi muhtelif durumlarda donanım tabanlı NUMA uygulamalarından daha yüksektir.