Mach: UNIX Geliştirme İçin Yeni Bir Çekirdek Temeli

Çevirmenin notu — Bu yazı, Mike Accetta, Robert Baron, William Bolosky, David Golub, Richard Rashid, Avadis Tevanian ve Michael Young tarafından yazılan "Mach: A New Kernel Foundation for UNIX Development" (Carnegie Mellon University, Nisan 1986; USENIX Summer Conference bildirileri içinde yayımlanmıştır) adlı makalenin Türkçe çevirisidir. Teknik terimlerin İngilizce orijinalleri parantez içinde korunmuştur.

Yazarlar: Mike Accetta, Robert Baron, William Bolosky, David Golub, Richard Rashid, Avadis Tevanian, Michael Young Kurum: Department of Computer Science, Carnegie Mellon University — Pittsburgh, PA 15213


Özet

Mach, Carnegie Mellon University'de geliştirilmekte olan çok işlemcili bir işletim sistemi çekirdeği ve ortamıdır. Tek işlemcili ve çok işlemcili sistemlerden oluşan ağları kapsayan UNIX geliştirmeleri için yeni bir temel sağlar. Bu makale Mach'i ve tasarımına yol açan motivasyonları açıklamakta; uygulamasının bazı ayrıntılarını ve mevcut durumunu da ele almaktadır.

Berkeley'in mevcut UNIX 4.3BSD sürümüyle ikili uyumluluğa ek olarak Mach, 4.3'te bulunmayan bir dizi yeni olanak sunar:

  • Hem sıkı bağlanmış (tightly-coupled) hem de gevşek bağlanmış (loosely-coupled) genel amaçlı çok işlemciler için destek
  • Süreç soyutlamasının görevler (tasks) ve iş parçacıkları (threads) olarak ayrılması ve bir görev içinde birden fazla iş parçacığının eşzamanlı yürütülebilmesi

Ek olanaklar şunları içerir:

  • Çok işlemcili (multiprocessor) destek
  • Yeni bir sanal bellek tasarımı:
    • Büyük ve seyrek sanal adres alanları
    • Yazma sırasında kopyalama (copy-on-write) sanal kopyalama işlemleri
    • Görevler arasında copy-on-write ve okuma‑yazma bellek paylaşımı
    • Bellek eşlemeli (memory-mapped) dosyalar
    • Kullanıcı tarafından sağlanan arka depolama nesneleri ve pager'lar
  • Yetenek tabanlı süreçler arası iletişim (capability-based IPC):
    • Yetenek korumasını koruyarak ağ sınırları boyunca şeffaf biçimde genişletilebilme
    • Sanal bellek sistemiyle bütünleşik çalışma; copy-on-write teknikleri sayesinde bir adres alanının boyutuna kadar büyük veri aktarabilme
  • Özerk sistemler arasında şeffaf uzak dosya erişimi
  • C, Pascal ve Common Lisp ile yazılmış görevler arasında uzak yordam çağrısı (RPC) tarzı arayüzler için dil desteği
  • adb benzeri yerleşik bir çekirdek hata ayıklayıcısı dahil olmak üzere çeşitli sistem destek olanakları

Temel Mach soyutlamaları yalnızca normal UNIX olanaklarının uzantıları olarak değil; UNIX olanaklarının üzerine kurulabileceği ve yeni mimariler için UNIX benzeri sistemlerin gelecekteki gelişiminin sürdürülebileceği yeni bir temel olarak tasarlanmıştır. Mach'in hedeflediği hesaplama ortamı geniş bir sistem sınıfını kapsar: büyük genel amaçlı çok işlemciler, daha küçük çok işlemcili ağlar ve bireysel iş istasyonları.

Nisan 1986 itibarıyla, iş parçacıkları hariç tüm Mach olanakları çalışır durumdadır ve CMU'daki bireyler ile araştırma projeleri tarafından hem tek işlemcili hem de çok işlemcili sistemlerde üretim kullanımındadır.


1. Giriş

UNIX, geliştirilmesinin erken dönemlerinde, nesnelerin dosya tanımlayıcıları olarak temsil edildiği ve bu nesneler üzerinde küçük bir temel işlem kümesi (read, write, seek) bulunduğu fikrini destekliyordu [9]. Program bileşimi aracı olarak kullanılan pipe'lar sayesinde UNIX, basit uygulama ve çeşitli problemlere genişletilebilirlik avantajları sunuyordu.

Değişen ihtiyaçların ve teknolojinin etkisi altında UNIX, nesneleri ve kaynakları yönetmek için çok sayıda farklı mekanizma sağlayacak şekilde değiştirilmiştir. Pipe'lara ek olarak UNIX sürümleri artık System V streams, 4.2 BSD sockets, pty'ler, çeşitli semaphore biçimleri, paylaşımlı bellek ve özel dosyalar ile aygıtlar üzerinde çok sayıda ioctl işlemi gibi olanakları desteklemektedir. Sonuç olarak birçok ek sistem çağrısı ortaya çıkmış; tek bir UNIX sistemi içinde ve UNIX makinelerinden oluşan bir ağda farklı kaynaklara erişim daha az tutarlı hâle gelmiştir.

Dağıtık ortamların ve çok işlemcili mimarilerin karmaşıklığı arttıkça, sistem olanaklarına tutarlı arayüzler sağlayan özgün UNIX modeline geri dönmek giderek daha önemli hâle gelmektedir. Ayrıca, geçmişte yalnızca işletim sistemi çekirdeğine kod eklenerek UNIX'e tamamen entegre edilebilen hizmetlerin artık kullanıcı durumundaki süreçler tarafından sağlanabilmesi için temel sistemin şeffaf biçimde genişletilebilmesi yönünde açık bir ihtiyaç vardır.

Mach, genişletilebilirlik konusunda özünde nesne yönelimli bir yaklaşım benimser. Daha karmaşık hizmetlerin ve kaynakların nesnelere referanslar olarak temsil edilmesine olanak tanıyan küçük bir ilkel işlev kümesi sağlar. Bu sayede nesneler, programlama ayrıntılarından bağımsız olarak ağ içinde (ister bir çok işlemci içinde, ister bir iş istasyonunda) keyfi biçimde konumlandırılabilir.

Mach çekirdeğinin soyutlamaları, fiilen, eksiksiz sistem ortamlarının kurulabileceği bir temel sağlar. Bu temel işlevlerin çekirdekte sağlanması sayesinde, tüm kaynaklara tutarlı bir arayüz sunulurken farklı makine sınıflarında çeşitli sistem yapılandırmalarını çalıştırmak mümkün olur. Belirli bir makinede çalışan gerçek sistem, çekirdeğinden ziyade sunucularının bir işlevidir.


2. Mach Soyutlamaları

Mach çekirdeği dört temel soyutlamayı destekler:

  1. Task (Görev) — İş parçacıklarının çalışabileceği bir yürütme ortamı; kaynak tahsisinin temel birimidir. Bir görev; sayfalı bir sanal adres alanını ve işlemciler, port yetenekleri ve sanal bellek gibi sistem kaynaklarına korumalı erişimi içerir. UNIX'teki süreç kavramı, Mach'te tek kontrol iş parçacığına sahip bir görev olarak temsil edilir.

  2. Thread (İş Parçacığı) — CPU kullanımının temel birimidir. Kabaca, bir görev içinde çalışan bağımsız bir program sayacına eşdeğerdir. Bir görev içindeki tüm iş parçacıkları görev kaynaklarının tamamına ortak erişime sahiptir.

  3. Port — Çekirdek tarafından korunan ve mantıksal olarak mesajlar için bir kuyruk olan bir iletişim kanalıdır. Portlar Mach tasarımının referans nesneleridir; nesne yönelimli bir sistemde nesne referanslarının kullanılmasına benzer şekilde kullanılırlar. Send ve Receive, portlar üzerindeki temel ilkel işlemlerdir.

  4. Message (Mesaj) — İş parçacıkları arasındaki iletişimde kullanılan türlendirilmiş veri nesneleri koleksiyonudur. Mesajlar herhangi bir boyutta olabilir ve portlar için işaretçiler ile türlendirilmiş yetenekler içerebilir.

Mesajlar dışındaki nesneler üzerindeki işlemler, onları temsil eden portlara mesaj gönderilerek gerçekleştirilir. Örneğin bir görev veya iş parçacığı oluşturma işlemi, yeni nesneyi temsil eden ve onu yönetmek için kullanılabilen porta erişim haklarını döndürür. Bu durumda Mach çekirdeği, görev ve iş parçacığı nesnelerini uygulayan bir sunucu gibi davranır: görev ve iş parçacığı portlarına gelen mesajları alır ve uygun nesne üzerinde istenen işlemi gerçekleştirir.

Bu yaklaşım, bir iş parçacığının başka bir iş parçacığını askıya almasını mümkün kılar; talepte bulunan iş parçacığı ağdaki başka bir düğümde olsa bile hedef iş parçacığının portuna bir askıya alma mesajı gönderilebilir.

Mach'in tasarımı, CMU'nun önceki Accent [8] ağ işletim sistemi deneyimlerinden büyük ölçüde yararlanır ve o sistemin olanaklarını çok işlemcili alana genişletir:

  • İletişim için kullanılan temel port mekanizması, kaynaklara nesne tarzı erişim ve yetenek tabanlı koruma ile birlikte ağ şeffaflığı sağlar.
  • Tüm sistem soyutlamaları hem çok işlemcilere hem de tek/çok işlemcili düğümlerden oluşan ağlara genişletilebilir.
  • Paylaşımlı belleğe sahip görevler ve iş parçacıkları biçiminde paralellik desteği, çok çeşitli sıkı ve gevşek bağlanmış çok işlemci sistemlerini mümkün kılar.
  • Sanal belleğe erişim basittir, mesaj iletimi ile bütünleşiktir; tahsis ve sanal kopyalama işlemleri üzerinde keyfi kısıtlamalar getirmez; hem copy-on-write hem de okuma‑yazma paylaşımına olanak tanır.

Mach soyutlamaları yalnızca basitlikleri için değil, performans nedenleriyle de seçilmiştir. Accent üzerinde yapılan bir performans değerlendirme çalışması, sanal bellek yönetimi ile süreçler arası iletişimin bütünleştirilmesinden elde edilen önemli kazanımları göstermiştir. Benzer sanal bellek ve IPC ilkellerini kullanan Accent, eşdeğer donanım üzerinde UNIX sistemleriyle karşılaştırılabilir performans elde edebilmiştir [3].


3. Tasks ve Threads

Bir süredir UNIX süreç soyutlamasının modern uygulamaların ihtiyaçlarını karşılamak için yetersiz olduğu açıktır. UNIX sürecinin tanımı işletim sistemi açısından yüksek ek yük doğurur. Her istemci için fork işlemiyle bir sunucu oluşturan tipik sunucu uygulamaları, gerekenden çok daha fazla sistem kaynağı kullanma eğilimindedir — süreç yuvaları, dosya tanımlayıcı yuvaları ve sayfa tabloları dahil.

Bu sorunun üstesinden gelmek için birçok uygulama programcısı, tek bir süreç içinde birden fazla bağlamı yönetmek amacıyla coroutine paketlerinden yararlanır.

Genel amaçlı paylaşımlı bellekli çok işlemcilerin ortaya çıkmasıyla sorun daha da büyür: tek bir paralel uygulamayı uygulamak için çok sayıda sürece ihtiyaç duyulur. N işlemcili bir makinede bir uygulamanın tüm işlemcileri kullanabilmesi için en az N sürece ihtiyacı olacaktır. Çekirdek bu coroutine'ler hakkında bilgi sahibi olmadığından ve onları zamanlayamadığından, coroutine paketi burada işe yaramaz.

Mach bu sorunu süreç soyutlamasını iki ortogonal soyutlamaya bölerek ele alır: task ve thread.

  • Bir task, sistem kaynaklarının bir koleksiyonudur — bir sanal adres alanı ve bir port hakları kümesi içerir.
  • Bir thread, hesaplamanın temel birimidir — bir görev içinde yürütme durumunun tanımıdır.

Bir task genellikle yüksek ek yüke sahip bir nesnedir (bir süreç gibi); buna karşılık bir thread nispeten düşük ek yüke sahiptir.

Süreç soyutlamasıyla ilgili sorunları aşmak için Mach, tek bir task içinde birden fazla thread'in var olmasına izin verir. Sıkı bağlanmış paylaşımlı bellekli çok işlemcilerde birden fazla thread paralel olarak çalışabilir. Böylece bir uygulama, çekirdek açısından yalnızca mütevazı bir ek yükle mevcut tüm paralelliği kullanabilir.

Task ve thread üzerindeki işlemler, ilgili task veya thread'i temsil eden porta mesaj gönderilerek çağrılır. Thread'ler oluşturulabilir (belirli bir task içinde), yok edilebilir, askıya alınabilir ve yeniden başlatılabilir. Askıya alma ve yeniden başlatma işlemleri bir task'a uygulandığında, o task içindeki tüm thread'leri etkiler. Task'lar da oluşturulabilir (fiilen fork edilerek) ve yok edilebilir.

Task'lar, task oluşturma işlemleri aracılığıyla ağaç yapısında birbirleriyle ilişkilendirilir. Sanal bellek bölgeleri, gelecekteki çocuk task'lar için kalıtım özellikleri olarak shared, copy-on-write veya none şeklinde işaretlenebilir. Standart bir UNIX fork işlemi, tek bir thread'e sahip bir task'ın tek kontrol iş parçacığına sahip bir çocuk task oluşturması ve tüm belleğin copy-on-write olarak paylaşılması biçiminde gerçekleşir.

Mach'te uygulama paralelliği üç farklı yoldan biriyle elde edilebilir:

  1. Paylaşımlı bir adres alanında çalışan çok sayıda kontrol iş parçacığına sahip tek bir task oluşturarak — iletişim ve eşzamanlama için paylaşımlı bellek kullanılır.
  2. Task oluşturma yoluyla ilişkili birçok task oluşturarak ve sınırlı bellek bölgelerini paylaşarak.
  3. Mesajlar aracılığıyla iletişim kuran birçok task oluşturarak.

Bu seçenekler Mach'in hedeflediği farklı çok işlemci mimarilerini yansıtır:

  • Tekdüze erişimli paylaşımlı bellekli çok işlemciler — VAX 11/784, VAX 8300, Encore MultiMax
  • Farklı erişim özelliklerine sahip paylaşımlı bellekli makineler — BBN Butterfly, IBM RP3
  • Gevşek bağlanmış bilgisayar ağları

Mach'in task, thread ve port soyutlamaları; paylaşımlı belleğe, bir veya daha fazla işlemciye ve harici iletişim portlarına sahip düğümlerden oluşan birçok çok işlemcinin fiziksel gerçekleştirilmesine karşılık gelir.


4. Sanal Bellek Yönetimi

Mach sanal bellek tasarımı task'ların şunları yapmasına olanak tanır:

  • Sanal bellek bölgeleri tahsis etmek
  • Sanal bellek bölgelerinin tahsisini kaldırmak
  • Sanal bellek bölgeleri üzerindeki korumaları ayarlamak
  • Sanal bellek bölgelerinin kalıtım özelliklerini belirlemek

Task'lar arasında hem copy-on-write hem de okuma/yazma biçiminde bellek paylaşımına olanak tanır. Copy-on-write sanal bellek çoğu zaman fork işlemlerinin veya büyük mesaj aktarımlarının sonucudur. Paylaşımlı bellek, kalıtım mekanizması aracılığıyla kontrollü bir biçimde oluşturulur. Pagein ve pageout gibi sanal bellekle ilişkili işlevler çekirdek dışındaki task'lar tarafından gerçekleştirilebilir. Mach, bu işlemler için hangi bölgelerin belirtilebileceği konusunda kısıtlamalar getirmez; tek koşul bu bölgelerin sistem sayfa sınırlarına hizalanmış olmasıdır (sayfa boyutunun tanımı sistemin önyükleme zamanında belirlenen bir parametresidir).

Mach'in UNIX fork işlemini nasıl uyguladığı, sanal bellek işlemlerine iyi bir örnektir. Bir fork çağrıldığında, eski (ebeveyn) adres haritasının kalıtım değerlerine dayanarak yeni bir (çocuk) adres haritası oluşturulur. Kalıtım değerleri:

  • shared — sayfalar hem ebeveyn hem çocuk tarafından okuma/yazma erişimiyle paylaşılır.
  • copy — sayfalar çocuk haritada kopyalanmış kabul edilir; verimlilik için genellikle copy-on-write teknikleri kullanılır.
  • none — sayfa çocuğa hiç aktarılmaz; çocuğun karşılık gelen adresi tahsis edilmemiş bırakılır.

Varsayılan olarak yeni tahsis edilen bellek copy-on-write olarak devralınır.

Kalıtımda olduğu gibi koruma da sayfa bazında belirtilebilir. Her sayfa grubu için iki koruma değeri vardır:

  • Mevcut koruma (current) — gerçek donanım izinlerini denetler.
  • Maksimum koruma (maximum) — mevcut korumanın alabileceği en yüksek değeri belirtir.

Maksimum koruma asla yükseltilemez; yalnızca düşürülebilir. Maksimum koruma mevcut korumadan daha düşük bir seviyeye indirildiğinde mevcut koruma da bu seviyeye düşürülür. Her iki koruma da okuma, yazma ve çalıştırma izinlerinin birleşiminden oluşur. Bu izinlerin uygulanması donanım desteğine bağlıdır (örneğin birçok makine açık çalıştırma iznine izin vermez; ancak izin verenlerde bu doğru şekilde uygulanır).

Örnek

Adres alanı boş olan bir task'a aşağıdaki işlemlerin uygulandığını varsayalım:

İşlem Argümanlar Yorum
allocate 0 – 0x100000 0'dan 1 megabayta kadar tahsis et
protect 0 – 0x10000, read/cur 0–64K aralığını yalnızca okunur yap
inherit 0x8000 – 0x20000, share fork sırasında 32K–128K aralığını paylaşımlı yap

Ortaya çıkan adres haritası bir megabaytlık bir adres alanı olacaktır; ilk 64K yalnızca okunur olacak ve 32K–128K aralığı fork ile oluşturulan çocuklar tarafından paylaşılacaktır.

Mach sanal belleğinin önemli bir özelliği, sayfa hatalarını ve sayfa dışına yazma veri isteklerini çekirdek dışında işleyebilme yeteneğidir. Sanal bellek oluşturulduğunda, sayfalama isteklerini işlemek için özel sayfalama görevleri belirtilebilir. Örneğin, bellek eşlemeli bir dosya uygulamak için sanal bellek; sayfalayıcısı dosya sistemi olacak şekilde oluşturulur. Bir sayfa hatası meydana geldiğinde, çekirdek bu hatayı dosya sisteminden veri talebine dönüştürür.

Mach, çekirdek içinde bazı temel sayfalama hizmetleri sağlar. Sayfalayıcısı olmayan bellek otomatik olarak sıfırlarla doldurulur ve sayfa dışına yazma işlemi varsayılan bir sayfalayıcıya yapılır. Mevcut varsayılan sayfalayıcı normal dosya sistemlerini kullanır ve ayrı sayfalama bölümlerine olan gereksinimi ortadan kaldırır.

4.1 Sanal Bellek Gerçekleştirmesi

Donanım mühendisleri tarafından geliştirilen geniş sanal bellek yönetimi çeşitliliği göz önüne alındığında, Mach gerçekleştirmesinde makineye bağımlı ve makineden bağımsız veri yapıları ile algoritmaları ayırmak önemliydi. Buna ek olarak, görevler arasındaki olası paylaşım ilişkilerinin karmaşıklığı, fiziksel kaynakları yöneten çekirdek veri yapıları ile arka depolama nesnelerini yöneten veri yapıları arasında açık bir ayrımı zorunlu kılmıştır.

Sanal bellek gerçekleştirmesinde kullanılan temel veri yapıları şunlardır:

  • Adres Haritaları (Address Maps) — Her biri bir sanal bellek bölgesinin özelliklerini tanımlayan harita girişlerinden oluşan çift bağlı listeler. Her görev ile ilişkili tek bir adres haritası vardır.

  • Paylaşım Haritaları (Sharing Maps) — Görevler arasında paylaşılan bellek bölgelerini tanımlayan özel adres haritaları. Bir paylaşım haritası, adres haritalarından dolaylı bir katman sağlayarak paylaşılan belleği etkileyen işlemlerin geri bağlantılara gerek kalmadan tüm haritaları etkilemesine olanak tanır.

  • VM Nesneleri (VM Objects) — Arka depolama birimleri. Bir VM nesnesi, bellekte bulunan sayfaları ve bellekte bulunmayan sayfaların nerede bulunacağını belirtir. Shadow nesneleri, copy-on-write hatasından sonra kopyalanmış sayfaları tutmak için kullanılır.

  • Sayfa Yapıları (Page Structures) — Sistemdeki fiziksel sayfaların mevcut özelliklerini belirtir (hangi nesneye eşlendiği, aktif/geri kazanılabilir/boş gibi).

Sanal bellek gerçekleştirmesi makineden bağımsız ve makineye bağımlı bölümler arasında ayrılmıştır. Makineden bağımsız bölüm sanal bellekle ilgili tüm bilgilere tam sahiptir. Öte yandan makineye bağımlı bölüm, basit bir sayfa doğrulama / geçersiz kılma / koruma arayüzüne sahiptir ve diğer veri yapıları hakkında dışsal bilgi taşımaz.

Bu ayrımın bir avantajı, gerçekleştirmedeki farklı bölümler için "sayfa boyutu"nun aynı olmak zorunda olmamasıdır. Örneğin, VAX üzerinde makineye bağımlı sayfa boyutu 512 bayttır; makineden bağımsız sayfa boyutu ise açılışta belirlenen ve makineye bağımlı boyutun iki kuvveti olan bir değişkendir. Arka depolama sayfa boyutu, arka depolama nesnesine bağlı olarak değişebilir.

Makineye bağımlı bir gerçekleştirmede kullanılan gerçek veri yapıları hedef makineye bağlıdır. Örneğin, VAX gerçekleştirmesi VAX sayfa tablolarını korurken, RT/PC gerçekleştirmesi Inverted Page Table (Tersine Çevrilmiş Sayfa Tablosu) tutar. Makineden bağımsız bölüm tüm veri yapılarını yönettiğinden, makineye bağımlı bir gerçekleştirme eşlemelerini çöp toplama yöntemiyle temizleyebilir. Daha sonra eşlemelere yeniden ihtiyaç duyulduğunda makineden bağımsız bölüm, makineye bağımlı bölümden bu sayfaları tekrar eşlemesini ister.

Görevlerin normal talep üzerine sayfalama işlemlerine ek olarak, Mach gerçekleştirmesi çekirdeğin bazı bölümlerinin de sayfalanmasına izin verir. Özellikle, mevcut gerçekleştirmede adres haritası girişleri sayfalanabilir durumdadır.


5. Süreçler Arası İletişim

4.3BSD'de süreçler arası iletişim çeşitli mekanizmalar aracılığıyla gerçekleşebilir: pipes, pty'ler, signals ve sockets. Ağ iletişimi için birincil mekanizma olan Internet domain sockets, konumdan bağımsızlık ve koruma olmadan küresel makineye özgü adlar (IP tabanlı) kullanma dezavantajına sahiptir. Veriler çekirdek tarafından yorumlanmadan bayt akışları olarak iletilir.

Mach süreçler arası iletişim sistemi ise port'lar ve mesajlar açısından tanımlanmıştır ve konumdan bağımsızlık, güvenlik ve veri türü etiketleme sağlar.

Port, Mach tarafından sağlanan temel aktarım soyutlamasıdır. Bir port, görevler tarafından mesajların yerleştirilebildiği ve çıkarılabildiği korumalı bir çekirdek nesnesidir. Mantıksal olarak bir port; görevler tarafından gönderilen mesajlardan oluşan sonlu uzunlukta bir kuyruktur. Portların herhangi sayıda göndericisi olabilir ancak yalnızca bir alıcısı olabilir. Bir porta erişim, port yeteneği (gönderme veya alma için) içeren bir mesaj alınarak elde edilir.

Portlar; görevler tarafından hizmetleri veya veri yapılarını temsil etmek için kullanılır. Örneğin, MicroVAX II üzerinde Mach altında çalışan bir pencere yöneticisi olan Flamingo, bitmap ekran üzerindeki bir pencereyi temsil etmek için bir port kullanır. Bir pencere üzerindeki işlemler, istemci görevin o pencereyi temsil eden porta bir mesaj göndermesiyle talep edilir. Pencere yöneticisi görevi daha sonra bu mesajı alır ve isteği işler.

Bu şekilde kullanılan portlar, nesne yönelimli bir sistemdeki nesnelere yönelik yetenekler olarak düşünülebilir. Bir mesaj gönderme eylemi (ve belki bir yanıt alma), Hydra veya StarOS gibi yetenek tabanlı bir sistemde alanlar arası bir prosedür çağrısına karşılık gelir.

Bir mesaj, sabit uzunluklu bir başlık ve değişken boyutlu türlendirilmiş veri nesneleri koleksiyonundan oluşur. Mesajlar hem port yeteneklerini hem de gömülü işaretçileri içerebilir; ancak her ikisinin de doğru şekilde türlendirilmiş olması gerekir. Tek bir mesaj, bir görevin tüm adres alanına kadar veri aktarabilir.

Mesajlar eşzamanlı veya eşzamansız olarak gönderilip alınabilir. Sinyaller, normal UNIX tarzı bir sürecin kontrol akışı dışında gelen mesajları işlemek için kullanılabilir. Bir görev, eşzamansız olayları işlemek için ayrı iş parçacıkları oluşturabilir veya atayabilir.

Tipik bir mesaj etkileşimi

Bir A görevi, P2 portuna bir mesaj gönderir. A görevinin P2 için gönderme hakları ve P1 portu için alma hakları vardır. Daha sonra P2 portu için alma haklarına sahip olan B görevi bu mesajı alır; mesaj aynı zamanda P1 portuna gönderme haklarını da içerebilir (yanıt mesajını A görevine geri göndermek için). B görevi daha sonra isteğe bağlı olarak P1'e bir mesaj göndererek yanıt verir.

Eğer P2 portu dolu olsaydı, A görevinin mesaj göndermeye çalışırken birkaç seçeneği olurdu:

  • Port artık dolu olmayana kadar askıya alınmak.
  • Mesaj gönderme işleminin port-dolu hata kodu ile geri dönmesi.
  • Çekirdeğin mesajı P2'ye gelecekte iletilmek üzere kabul etmesi; ancak çekirdek A'ya mesajın gönderildiğini bildirene kadar bu görevin P2'ye başka mesaj gönderememesi koşuluyla.

Büyük mesajlar ve copy-on-write

Bir A görevinin çok büyük bir mesajı (örneğin 24 megabayt) P1 portuna göndermesini düşünelim. Mesaj P1'e gönderildiği anda, A'nın adres alanında mesajı içeren bölüm copy-on-write olarak işaretlenir. Yazma için başvurulan herhangi bir sayfa kopyalanır ve kopya A'nın sanal bellek tablosuna yerleştirilir. Copy-on-write verisi, B görevi mesajı alana kadar geçici bir çekirdek adres haritasında tutulur.

Bu noktada veri geçici adres haritasından çıkarılır. Çekirdek, yeni alınan mesaj verisinin B'nin adres alanında nereye yerleştirileceğini belirler; böylece bellek eşleme ek yükünü en aza indirebilir. A veya B tarafından bu copy-on-write verisinin herhangi bir sayfasını değiştirme girişimi, o sayfanın bir kopyasının oluşturulmasına ve ilgili görevin adres alanına yerleştirilmesine neden olur.

Matchmaker

Süreçler arası arayüzler — Mach çekirdeği ile olan arayüz dahil — Matchmaker adlı bir arayüz tanımlama dili kullanılarak tanımlanır. Matchmaker, bu arayüz tanımlarını C, Common Lisp ve CMU'nun bir Pascal çeşidi dahil olmak üzere çeşitli programlama dilleri için uzak prosedür çağrısı (RPC) iskelet kodlarına derler. Bu iskelet kodları temel aktarım mekanizması olarak Mach mesaj sistemini kullanır.

Matchmaker arayüzleri çalışma zamanında tür denetimi yapabilir ve farklı mimari türlere sahip makineler arasında ağ iletişimi sunucularının veri türü dönüşümü ve veri yeniden hizalama işlemlerini gerçekleştirmesi için mesajlarda yeterli bilgi sağlar.


6. Ağ İletişimi ve Güvenlik

Mach çekirdeği tek başına bir ağ üzerinden süreçler arası iletişimi desteklemek için herhangi bir mekanizma sağlamaz. Ancak Mach IPC tanımı, iletişimin ağ sunucuları (network servers) adı verilen kullanıcı düzeyi görevleri tarafından şeffaf biçimde genişletilmesine izin verir. Bir ağ sunucusu, uzak düğümlerdeki görevler için yerel bir temsilci gibi davranır. Uzak alıcılara sahip portlar için tasarlanmış mesajlar aslında yerel ağ sunucusuna gönderilir.

Bir görev başka bir düğümdeki hedef porta mesaj gönderdiğinde, mesajın iletilmesi gönderici için şeffaftır. Gönderici, nihai hedef portun kendi düğümünde mi yoksa uzak bir düğümde mi bulunduğunu doğrudan belirleyemez. Mach port yeteneklerinin sağladığı güvenlik güvenceleri, ağ sunucuları tarafından şifreleme kullanılarak ağ ortamına da genişletilebilir.

Ağ sunucuları birlikte network ports soyutlamasını gerçekleştirir. Bir network port, birden fazla düğümdeki görevlerin erişim haklarına sahip olduğu bir portun ağ üzerindeki temsilidir. Her network port, kendi network port tanımlayıcısı ile bilinir. Bir ağ sunucusu, kendi düğümündeki görevlerin erişebildiği network portlar ile bunlara karşılık gelen yerel portlar arasında bir eşleme tutar.

Çalışma sırasında, bir ağ sunucusu uzak bir hedef porta mesaj göndermeye çalışan bir görevden mesaj aldığında, yerel hedef portu bir hedef network port tanımlayıcısına eşler. Ardından bu tanımlayıcıdan hedef düğümün adresini türetir ve mesajı ağ üzerinden bu düğüme gönderir. Hedef ağ sunucusu mesajı aldığında, network port tanımlayıcısını yerel bir hedef porta eşler ve mesajı nihai hedefine iletir.

Network portlara yönelik gönderme ve sahiplik hakları da aynı şekilde ele alınır; ancak bir network port için gönderme hakları birçok ağ sunucusu tarafından tutulabilir. Mesajlar türlendirilmiş veri nesnelerinin koleksiyonlarıdır ve herhangi bir mesaj port erişim hakları içerebilir. Ağ sunucuları, bu tür erişim haklarının iletimini tanımak ve uygun işlemi gerçekleştirmek için ağ üzerinden gönderilen veya alınan mesajlardaki veri türü etiketlerini incelemek zorundadır.

Günümüzde Mach'in ağ sunucuları üç farklı makine mimarisi için veri türü dönüşümü ve yeniden hizalama işlemlerini gerçekleştirir: DEC VAX, IBM RT/PC ve PERQ Systems PERQ.


7. Sistem Destek Olanakları

4.3 tarafından sağlanan temel sistem destek olanaklarına ek olarak, Mach bir çekirdek hata ayıklayıcısı ve şeffaf bir uzak dosya sistemi sağlar.

7.1 Çekirdek Hata Ayıklayıcısı

Çekirdek hata ayıklama her zaman zahmetli bir çalışma olmuştur. UNIX sistemleri geleneksel olarak çekirdek hata ayıklama için herhangi bir destek sunmaz; bu nedenle çekirdek geliştiricileri "printf ile hata ayıklama" veya benzeri geçici yöntemlere başvurmak zorunda kalır.

Mach çekirdeği, adb tabanlı yerleşik bir çekirdek hata ayıklayıcısına (kdb) sahiptir. Tüm adb komutları uygulanmıştır; buna kesme noktaları, tek komut adımı, yığın izleme ve sembol tablosu çevirisi desteği dahildir.

Hata ayıklamayı kolaylaştırmak ve çekirdeğin performansını incelemek amacıyla Mach hata ayıklayıcısı, adb'de bulunmayan bazı işlevleri de destekler:

  • Geliştirilmiş yığın izleri — yığın izleri her yığın çerçevesi için yerel değişkenlerin ve yazmaçların değerlerini içerebilir.
  • Çağrı/dönüş izleme desteği — tek adım ilerleme, bir sonraki çağrı veya dönüş komutuna kadar müdahale olmadan devam edebilir.
  • Komut sayımı — kod bölgeleri arasında yürütülen komutların sayısı sayılabilir.

Sistemin gerçekleştirilmesi sırasında bu özellikler hem hata ayıklamada hem de performans ayarlamalarında son derece değerli olmuştur.

7.2 Şeffaf Uzak Dosya Sistemi

Mach'te bulunan uzak dosya sistemi ilk olarak 1982 yılında CMU'nun yerel olarak sürdürülen 4.1 UNIX sürümünün bir parçası olarak mevcuttu. O dönemde bir dosya sisteminden beklenen işlevlerin yalnızca küçük bir bölümünü destekliyordu: herkese açık dosyaları okuyup yazabiliyordu. Yıllar içinde uzak dosya sistemi işlevsellik açısından sürekli genişlemiştir. Günümüzde uzak geçerli dizinler ve uzak dosyaların yürütülmesi gibi tüm UNIX işlevleri desteklenmektedir.

Uzak dosya sistemi kullanıcı için tamamen şeffaftır. Kullanıcılar, uzak dosya sistemi bağlantısına etkili biçimde giriş yaparak uzak dosya sistemi üzerindeki tüm normal ayrıcalıklarını elde edebilir ya da giriş yapmamayı seçerek yalnızca "anonim" erişim elde edebilir.

Çekirdekteki küçük bir kanca kümesi, uzak dosya işlemlerini şeffaf biçimde uzak sunuculara yönlendirir. Uzak istekleri kabul etmek isteyen her makine, kullanıcı kipinde çalışan bir sunucu süreci yürütür. Çekirdek; okuma, yazma, açma ve kapatma gibi işlemlere karşılık gelen istekleri gönderir. İstemci uygun işlemi gerçekleştirir ve bir yanıt kodu ve/veya veri ile geri döner.

Veri önbelleğe alınmaz; tek istisna şudur: dosyaların uzaktan yürütülmesi durumunda dosyanın tamamının önbelleğe alınmış bir kopyası yerel diskteki bir inode içine okunur. Bu dosyanın sonraki çalıştırmalarında çekirdek uzak dosyada değişiklik olup olmadığını kontrol eder; eğer değişiklik yapılmamışsa yerel olarak önbelleğe alınmış kopya yürütülür.

Uzak dosya sistemlerine bağlantılar özel bir dosya türü kullanılarak oluşturulur. Diğer uzak dosya sistemlerinde bu amaçla bağlama noktaları (mount points) kullanılmış olsa da [1, 2], bağlama noktalarının sayısına getirilen kısıtlamanın bu seçeneği uygun olmayan bir çözüm haline getirdiği düşünülmüştür. Özel bağlantılar kullanmak, bir makinenin tüm olası uzak dosya sistemlerini bağlama gereksinimi olmadan ve bağlama tablosunun dolması korkusu olmadan keyfi sayıda başka makineye bağlanmasına olanak tanır.


8. Gerçekleştirme: UNIX İçin Yeni Bir Temel

Mach çekirdeği şu anda UNIX 4.3BSD çekirdeğinin temel sistem arayüzü işlevlerinin çoğunun yerini almıştır: trap işleme, zamanlama, çok işlemcili eşzamanlama, sanal bellek yönetimi ve süreçler arası iletişim. 4.3BSD işlevleri, Mach çekirdeği tarafından zamanlanan ve onunla iletişim kuyruklarını paylaşan çekirdek durumlu iş parçacıkları tarafından sağlanır.

Son birkaç yılda Berkeley UNIX çekirdeğinin boyutundaki olağanüstü büyüme, UNIX işlevselliğinin sürekli genişlemesinin, UNIX'i araştırma ve geliştirme için çekici kılan basitlik ve değiştirilebilirlik avantajlarını zayıflatma riski taşıdığını açıkça göstermiştir.

Çekirdek durumundan Mach dışı UNIX işlevselliğini kaldırmak ve bu hizmetleri kullanıcı-durumu görevleri aracılığıyla sağlamak için çalışmalar sürmektedir. Bu çabanın amacı, UNIX'i çok daha az karmaşık ve çok daha kolay değiştirilebilir bir temel işletim sistemine dönüştürerek **"çekirdekleştirmek"**tir. Böyle bir sistem, hem yeni tek/çok işlemcili mimarilere hem de geniş bir ağ ortamının gereksinimlerine daha iyi uyarlanmış olacaktır. Bu dönüşümün başarısı büyük ölçüde, temel Mach soyutlamalarının bellek nesnesi yönetimi ve süreçler arası iletişim gibi çekirdek olanaklarının şeffaf biçimde genişletilmesine izin vermesine bağlı olacaktır.

Mach hâlâ geliştirme aşamasındadır ve diğer sistemlerle kapsamlı performans karşılaştırmaları henüz yapılmamıştır. Sistem henüz ayarlanmamış olsa da mevcut performansın 4.3BSD ile aynı düzeyde olduğu görülmektedir. Sanal bellek performansına ilişkin erken ve basit ölçümler umut vericidir: MicroVAX II üzerinde yeni ayrılmış belleğe erişmenin maliyeti 1024 bayt veri başına 0.7 milisaniyeden daha azdır (4.3BSD için yaklaşık 1.2 milisaniye ile karşılaştırıldığında). UNIX'te genellikle pahalı olan işlemler — örneğin fork — yeni sanal bellek desteğiyle belirgin biçimde daha hızlıdır. Mach şu anda CMU araştırmacıları tarafından Agora adlı çok işlemcili bir konuşma tanıma sistemi ve paralel üretim sistemleri geliştirmeye yönelik bir proje dâhil olmak üzere çeşitli projelerde aktif olarak kullanılmaktadır.


9. Mevcut Durum: Mach-1

Şekil 6: UNIX işlevselliğinin kullanıcı-durumu görevlerinde bulunduğu Mach mimarisi. Nisan 1986 itibarıyla "UNIX uyumluluğu" olarak etiketlenen kutu hâlâ çekirdek durumunda çalışmakta ve Mach çekirdek katmanı ile paylaşılan bir iletişim kuyruğu aracılığıyla haberleşmektedir.

Mach-1 Çekirdek Katmanı

  • Sanal bellek yönetimi
  • Süreçler arası iletişim
  • Düşük seviyeli aygıt sürücüleri
  • Çok işlemcili zamanlama
  • UNIX tuzaklarının yeniden yönlendirilmesi

Kullanıcı-durumu görevleri (UNIX uyumluluğu)

  • UNIX dosya sistemi
  • UNIX süreç yönetimi
  • vb.

Mach Ağı

  • Güvenli ağ IPC
  • Dağıtık dosya sistemi
  • Kimlik doğrulama
  • Yetkilendirme
  • Ağ kaynak yönetimi
  • Ağ sayfalama

Nisan 1986 itibarıyla Mach, çoğu VAX mimarisi makinede çalışmaktadır: VAX 11/750, 11/780, 11/785, 8600, MicroVAX I ve MicroVAX II. Buna ek olarak Mach; 8 MB paylaşımlı belleğe sahip dört işlemcili (11/780 veya 11/785) VAX 11/784 üzerinde ve IBM RT/PC üzerinde çalışmaktadır. Aynı ikili çekirdek görüntüsü tüm VAX tek/çok işlemcili sistemlerde çalışır. Aynı çekirdek kaynak kodu hem VAX hem de RT/PC sistemleri için kullanılmaktadır. Tek işlemcili SUN 3, çok işlemcili Encore MultiMax ve VAX 8300 için uyarlama çalışmaları başlamıştır. Mach iş parçacığı mekanizmasının uygulanmasının 1986 yazına kadar tamamlanması beklenmektedir.


Notlar

  1. Mach, bildiğimiz kadarıyla AT&T Bell Laboratories'in ticari markası değildir.
  2. UNIX, AT&T Bell Laboratories'in ticari markasıdır.
  3. Bu araştırma Defense Advanced Research Projects Agency (DOD), ARPA Order No. 4864 tarafından desteklenmiş ve Space and Naval Warfare Systems Command tarafından N00039-85-C-1034 sözleşmesi kapsamında izlenmiştir.

Kaynaklar

[1] D. R. Brownbridge, L. F. Marshall ve B. Randell. Newcastle bağlantısı ya da dünyanın UNIX sistemleri birleşin! Software — Practice and Experience, 20, 1982.

[2] M. Satyanarayanan ve diğerleri. ITC dağıtık dosya sistemi: İlkeler ve tasarım. Sayfa 35–50. ACM, Aralık 1985.

[3] R. Fitzgerald ve R. F. Rashid. Accent içinde sanal bellek yönetimi ile süreçler arası iletişimin bütünleştirilmesi. ACM Transactions on Computer Systems, 4(2), Mayıs 1986.

[4] A. K. Jones. Nesne modeli: Sistemleri yapılandırmak için kavramsal bir araç. Operating Systems: An Advanced Course, sayfa 7–16, 1978.

[5] A. K. Jones, R. J. Cahnsler, I. E. Durham, K. Schwans ve S. Vegdahl. StarOS: Görev güçlerini desteklemek için çok işlemcili bir işletim sistemi. Sayfa 117–129. ACM, Aralık 1979.

[6] M. B. Jones, R. F. Rashid ve M. Thompson. Matchmaker: Süreçler arası bir belirtim dili. ACM, Ocak 1985.

[7] W. Joy. 4.2BSD Sistem Kılavuzu. Teknik rapor, Computer Systems Research Group, Computer Science Division, University of California, Berkeley, Temmuz 1983.

[8] R. F. Rashid ve G. Robertson. Accent: İletişim odaklı bir ağ işletim sistemi çekirdeği. Sayfa 64–75. ACM, Aralık 1981.

[9] D. M. Ritchie ve K. Thompson. UNIX zaman paylaşımlı sistem. Communications of the ACM, 17(7):365–375, Temmuz 1974.

[10] R. Sansom, D. Julin ve R. Rashid. Yetenek tabanlı bir sistemin ağ ortamına genişletilmesi. Teknik rapor, Department of Computer Science, Carnegie-Mellon University, Nisan 1986.

[11] E. T. Smith ve D. B. Anderson. Flamingo: Kullanıcı arayüzü yönetimi için nesne yönelimli soyutlamalar. Sayfa 72–78, Ocak 1986.

[12] W. A. Wulf, R. Levin ve S. P. Harbison. Hydra/C.mmp: Deneysel Bir Bilgisayar Sistemi. McGraw-Hill, 1981.