Bu günlerde zamanımın çoğunu, sınıflarda öğrencilere Solaris'in iç yapısı, aygıt sürücülerini ve sistem çökmeleri anında çekirdek tarafından üretilen çıktıları (kernel crash dump) analiz ederek hata ayıklamayı öğretmek için harcıyorum. Sınıflarda ne zaman ki Solaris'e ne çeşit alt sistemlerin adapte edildiğini izah etsem, öğrenciler sıksık "Bu Linux'da nasıl çalışıyor ?" ya da "FreeBSD'de falan böyle çalışıyor, Solaris'te nasıl ?" şeklinde sorular yöneltiyorlar. Bu makale Solaris 10, Linux 2.6 ve FreeBSD 5.3 sistemlerinde çekirdeğin üç altyapısını ve nasıl uygulandıklarını sistemler arasında karşılaştırmalı olarak inceler.
İncelenen bu üç altyapı; çizelgeleme (scheduling), bellek yünetimi ve dosya sistemi mimarisidir. Bu üç altyapıyı seçtim çünkü bunlar bütün işletim sistemleri için ortaktır (sadece Unix ve Unix türevi olanlar için değil), ve bunlar işletim sistemlerinin en iyi anlaşılmış bileşenleri olma eğilimindedirler.
Bu makale bu altyapılardan hiç birinin derinlemesine detayını vermez. Bunun için kaynak kodlara, bazı web sitelerine ya da bu konuda kitaplara başvurabilirsiniz. İlgili kitaplar :
Eğer Linux, FreeBSD ve Solaris karşılaştırmaları için internette aramalar yapmışsanız bulduklarınızın çoğunun bu sistemlerin eski versiyonları (Solaris 2.5, Linux 2.2, vs. gibi eski sistemler bile) ile ilgili olduğunu görmüşsünüzdür. Çoğu faktör yeni versiyonlar için geçersizdir ve hatta bazılarının bahsedilen versiyon için bile geçersiz olduğu durumlar söz konudur. Tabii ki bunların çoğu incelenen İşletim Sistemleri üzerinde bazı değer yargıları oluştururlar, ve az miktarda olsa çekirdek karşılaştırması bilgisi sunarlar. Aşağıdaki siteler aşağı yukarı güncel sayılırlar :
Bu üç işletim sisteminin çok ilginç yönlerinden biri, aralarındaki bir miktar benzerliktir. Farklı isimlendirme kurallarını geçtiğiniz zaman, her işletim sisteminin farklı kavramları uygulama konusunda oldukça benzer yolları takip ettiklerini görürsünüz. Her işletim sistemi, trheard'ler için zaman paylaşımlı çizelgeleme (time-shared scheduling), uzun süre kullanılmamış sayfaları yer değiştirme algoritması olan sayfalı görüntü bellek yönetimi (demand paging) ve farklı dosya sistemi mimarilerinin kullanılabilmesine izin veren bir sanal dosya sistemi (virtual file system) katmanına destek verir. Bir işletim sisteminde ilk defa kullanılmış fikirler, çokca diğerlerinde de kullanılmıştır. Örneğin; Linux aynı zamanda Solaris'in tabaka bellek tahsis edicisi (slab memory allocator) ardındaki kavramları kullanır. FreeBSD kaynak kodlarında olan bir çok teirim aynı zamanda Solaris'te de bulunmaktadır. Sun'ın açık kaynak Solaris'e taşınması ile, diğer açık sistemlerle birlikte karşılıklı bir çok teknoloji kullanımlarının söz konusu olacağını düşünüyorum. Bu günlerde fxr.watson.org adresinde LXR projesi FreeBSD, Linux ve diğer Unix türevi işletim sistemleri üzerinde çapraz kaynak kod gösterimleri sunulmaktadır. OpenSolaris kaynak kodlarının bu siteye eklenmiş olmasını görmek güzel olurdu.
Solaris'te basit çizelgeleme birimi kthread_t
;
FreeBSD'de thread
ve
Linux'da task_struct
'dır.
Solaris her süreci bir proc_t
ile simgeleler, ve süreç içersindeki her thread bir kthread_t
'ye sahiptir. Linux, süreçleri
(ve thread'leri) task_struct
yapıları ile simgeleler. Linux'da bir tek-thread'li bir süreç bir adet task_struct
'a sahiptir. Solaris'te bir
tek-thread'li bir süreç bir adet proc_t
'ye,
bir tek kthread_t
ve bir
adet klwp_t
'ye sahiptir.
klwp_t, thread'lerin kullanıcı ve çekirdek modları arasında geçişleri sırasında
alanların ayrı kalmasını, korunmasını sağlar. FreeBSD'de bir tek-thread'li bir
süreç birer adet proc, thread, ksegrp
yapılarına
sahiptir. ksegrp
bir
Çekirdek Çizelgeleme varlık grubu(kernel scheduling entity group)'dur. Etkin
olarak bu üç işletim sistemi thread'leri çizelgeler, ki bir thread Solaris'te
bir kthread_t
, FreeBSD'de
bir thread
yapısı, Linux'da
ise bir task_struct
'tır.
Çizelgelemede kararlar öncelik'lere göre belirlenir. Linux ve FreeBSD'de düşük öncelik numarları, daha öncelikli olma anlamına gelir. Bu bir tersten bakıştır bir nevi, 0'a yaklaşan değerler yüksek öncelik sunarlar. Solaris'te ise yüksek değer, yüksek öncelik anlamına gelirler. Tablo 1'de bu üç sistemdeki öncelik değerleri görülmektedir.
Table 1. Solaris, Linux ve FreeBSD'de Çizelgeleme Öncelikleri |
|
||
|
|
||
Solaris |
|||
Öncelik |
Çizelgeleme Sınıfı |
|
|
0-59 |
Time Shared, Interactive, Fixed, Fair Share Scheduler |
|
|
60-99 |
System Class |
|
|
100-159 |
Real-Time (real-time sınıfı önceliği, sistem thread'lerinden yüksektir.) |
|
|
160-169 |
Low level Interrupts (Alçak düzeyli kesmeler) |
|
|
Linux |
Öncelik |
Çizelgeleme Sınıfı |
|
0-99 |
System Threads, Real time ( |
|
|
100-139 |
User priorities (Kullanıcı öncelikleri) ( |
|
|
FreeBSD |
Öncelik |
Çizelgeleme Sınıfı |
|
0-63 |
Interrupt (Kesme) |
|
|
64-127 |
Top-half Kernel (Üst Çekirdek; Çekirdeğin kesmeleri
işlediği parçası, yani iki parçadan biri. |
|
|
128-159 |
Real-time user (Gerçek-Zaman kullanıcısı) (sistem thread'leri daha yüksek önceliğe sahiptirler.) |
|
|
160-223 |
Time-share user (Zaman-Paylaşım Kullanıcısı) |
|
|
224-255 |
Idle user (Boş Kullanıcı) |
|
Bu üç işletim sistemi'de etkileşimli thread'leri/süreçleri tercih ederler. Etkileşimli thread'ler CPU kullanımı yüksek hesaplama ağırlıklı (compute-bound) thread'lere göre daha iyi önceliklerde çalışırlar, ancak daha kısa zaman dilimlerinde çalışma eğilimindedirler. Solaris, FreeBSD ve Linux her CPU için bir çalışma kuyruğu (runqueue) kullanır. FreeBSD ve Linux bir "aktif" bir de "süresi dolanlar" (active queue, expired queue) kuyruğu kullanır. Thread'ler aktif kuyruktaki önceliklere göre çizelgelenirler. Bir thread kendi zaman dilimini kullanıp bitirdiğinde aktif kuyruktan süresi dolanlar kuyruğuna taşınır (ve belki diğer bekleyenleri açlıktan öldürmemek için (starvation)). Aktif kuyruk tamamen boşaldığında, çekirdek aktif ve süresi dolanlar kuyruğunu takas eder. FreeBSD'de boş thread'ler için "boş duranlar" (iddle) isimli bir kuyruk daha vardır. Bu kuyruktaki thread'ler ancak diğer iki kuyruk tamamen boşaldığında çalışabilirler. Solaris her CPU için bir "sevketme kuyruğu" (dispatch queue) kullanır. Eğer bir thread kendi zaman diliminin tamamını kullanmış ise, çekirdek bu thread'e yeni bir öncelik değeri verir ve onu sevketme kuyruğuna geri gönderir. Bu üç sistemdeki çalışma kuyrukları, farklı öncelikler için ayrılmış, çalışabilir (runable) thread bağlı listelerine (linked list) sahiptirler. (FreeBSD dört öncelik için bir liste kullansada, Solaris ve Linux her öncelik için ayrılmış listeler kullanır.)
Linux ve FreeBSD bir thread'in öncelik değerine ulaşmak için o thread'in uyku süresi (sleep time) yerine çalışma süresini (run time) temel alan bir aritmetik hesaplama kullanır. Solaris ise sadece bir tablo araması yapar. Bu üç sistemnden hiç biri ekip çizelgelemesi (gang scheduling) kullanmaz. Bu üç sistem, n tane thread'i çizelgelemek yerine aslında sıradaki thread'in çalışmasını çizelgeler. Bu üç işletim sistemide ön bellek (caching) ve yük dengeleme (load balancing) mekanizmalarından yararlanır. FreeBSD'de, HT (Hyperthreaded) CPU'lar için thread'lerin aynı CPU düğümünde (node) kalmasına yardımcı olabilmesi için bir mekanizma bulunmaktadır (thread'lerin farkli CPU düğümleri üzerine düşme ihtimaline karşı). Solaris'te de benzer bir mekanizma vardır, fakat bu kullanıcı ve uygulamanın kontrolu altında olup hyprthread'lere bir kısıtlama getirmez (Solaris'te "processor sets" olarak, FreeBSD'de "processor groups" olarak isimlendirilirler).
Solaris ve diğer iki İşletim Sistem arasındaki en büyük farklardan biri
aynın anda birden çok Çizelgeleme Sınıfını (scheduling classes)
çalıştırabilmeyi desteklemesidir. Bu üç İşletim Sistemide Posix SCHED_FIFO
, SCHED_RR
ve SCHED_OTHER
(ya da SCHED_NORMAL
)'a destek vermektedir. SCHED_FIFO
and SCHED_RR
tipik olarak gerçek zamanlı
(realtime) thread'lere sebep olurlar. (Not: Solaris ve Linux, gerçek zamanlı
thread'ları destekleme konusunda çekirdek önceliğini (kernel preemption)
desteklemektedir.) Solaris'in bir "fixed priority" sınıfına, sistem
thread'leri için (page-out yapan thread'ler gibi) bir "system class"
isimli sınıfa, X sunucusu altında çalışan pencere ortamlarında çalışan thread'ler
için bir interaktif (interactive) sınıfa ve kaynak yönetimine destek olarak
Fair Share Çizelgeleyiciye desteği vardır. Sınıfların kullanımı ve her sınıfın
özellikleri hakkında bilgi için priocntl(1)'e bakın. Fair Share Çizelgeleyiciye
özel tanıtım için ise FSS(7)'ye bakın. FreeBSD'de çizelgeliyici derleme
aşamasında seçilir, Linux'da ise versiyon'a dayanmaktadır.
Sisteme yeni bir çizelgeleme sınıfı ekleme yeteneği biraz masraflıdır. Her hangi bir çizelgeleme kararı, çekirdeğin heryerinde çizelgeleme sınıfına özel kod içersinde bir dolaylı fonksiyon çağrısı (çalışacak thread'i seçecek gerçek eylem hariç) yapabilir. Örneğin, bir thread uyku moduna geçtiğinde, thread; ilgili sınıf içersinde uyuma modu işlemi için gerekli olan çizelgeleme-sınıfı-bağımlı kodu çağıracaktır. Linux ve FreeBSD'de, çizelgeleme kodu sadece ihtiyaç olunan eylemi gerçekleştirir. Herhangi bir dolaylı çağırma işlemine (indirect call) ihtiyaç yoktur. Solaris'te harici katmanlar çizelgeleme için biraz daha masraf anlamına gelmektedir (ancak bu daha fazla özellik anlamındadır).
Solaris'te her süreç, bölüm (segment) olarak isimlendirilen mantıksal kısım (section) bölmelerinden yapılmış bir adres alanı'na sahiptir. Bir süreç'in adres alanı bölümleri pmap(1) ile görüntülenebilir. Solaris, bellek yönetim kodu ve veri yapılarını platformdan bağımsız ve platform bağımlı alanlara böler. Bellek yönetiminin platform bağımlı parçaları HAT (hardware address translation layer) olarak isimlendirilen donanımsal adres dönüştürücü katmanı içersindedir. FreeBSD, bölgeler (regions) olarak adlandırılan mantıksal kısımlara bölünmüş süreç adres alanlarını, bir vmspace ile tanımlar. Donanım bağımlı parçalar "pmap" (physical map) modülü içersindedir ve "vmap" yordamları donanım bağımsız parçaları ve veri yapılarını işlerler. Linux süreç adres alanını "bellek sahası" (memory areas) olarak adlandırılan mantıksal kısımlara bölmek için bir bellek tanımlayıcısı kullanır, ki bunu süreç adres alanını tanımlamak için kullanmaktadır. Keza Linux'da süreç adres alanlarının incelenebilmesi için pmap komutuna sahiptir.
Linux makina bağımlı katmanları makinadan bağımsız katmanlardan yazılım içersinde çok daha yüksek bir seviyede böler. Solaris ve FreeBSD'de kodların çoğu makine bağımlılığının üstesinden gelmşitir, örneğin sayfa hata (page fault) işleme mekanizması makine-bağımsızdır. Linux'da, sayfa hataları işleme kodu, hata işleme kodunun, mekanizmasının başlarından (ilk satırlardan vs.) itiraberen oldukça fazla şekilde makina bağımlıdır. Sonuç olarak Linux, daha fazla sayfalama kodunu daha hızlı bir şekilde işeleyebilir, çünkü kod içerisnde daha az bir veri soyutlaması (tabakalaşması) söz konusudur. Ancak bunun bedeli, temel donanımda yada modelde bir değişiklik halinde, var olan kodda daha fazla değişikliktir. Solaris ve FreeBSD böyle değişiklikleri sırasıyla HAT ve pmap katmanlarına ayırır.
Bölümler, Bölge (regions) ve Bellek Sahası (memory areas) aşağıdakiler tarafından sınırlanmışlardır :
Mesela, bir programın text'i bir bölüm/bölge/bellek sahası içersindedir. Bu üç işletim sisteminde de adres alanlarını yönetme mekanizması çok benzerdir, ama veri yapılarının isimleri tamamen farklıdır. Yine Linux kodunun daha fazlası diğer iki İşletim Sisteminde olduğundan çok daha fazla makina bağımlıdır.
Bu üç işletim sistemide, sayfa çalma/değiştirme konusunda 'uzun süredir kullanılmamış olanı bulma' algoritmasının çeşitlerini kulanmakdadırlar. Üç sistemde de bir adet daemon süreç/thread sayfa değiştirme işlemini yapmaktadır. FreeBSD'de vm_pageout daemon'ı peryodik olarak uyanarak veya boş bellek miktarı azaldığı zaman bu işi yapar. Kullanılabilir bellek miktarı bazı eşik değerlerinin altına indiği zaman, vm_pageout bir yordam olan vm_pageout_scan'ı çalıştırır ki bellek taransın ve bazı sayfalar boşa çıkartılsın. vm_pageout_scan yordamı, sayfaları boşaltma işlemine başlamadan önce, içeriği değiştirilmiş sayfaları eşzamanlı olmayacak şekilde (asenkron) diske yazma ihtiyacı duyabilir. Bu daemon'lardan CPU sayısına bakılmaksızın sistemde bir adet bulundurulmaktadır. Solaris aynı zamanda bir pageout daemon'una sahiptir ki bu peryodik olarak, düşük boş bellek durumlarına karşı çalışır. Solaris'te page-out istekleri geldiğinde, daemon'ın CPU'ya ya da Disk'e aşırı yüklenmemesi için, sayfalama eşikleri sistem başlatıldığı zaman otomatik olarak hesaplanır. FreeBSD daemon'u sayfalama eşik değerlerini belirlerken genellikle sabit-kodlanmış, veya ayarlanabilir değerleri kullanır. Linux, aynı zamanda, çalışırken dinamik olarak ayarlanmış değerler ile çalışan bir LRU algoritması kullanır. Linux'da her CPU için bir tane olacak şekilde birden çok kswapd daemon'u bulunabilir. Bu üç sistemin tamamı bir global çalışma küme politikası (working set policy) kullanır (her süreç çalışma kümesine karşılık olarak).
FreeBSD yakın geçmişte kullanılmış olan sayfalardan tam anlamıyla haberdar olmak için çeşitli sayfa listeleri kullanır. Bunlar "aktif", "aktif olmayan", "önbelleğe alınmış" yada "boş" (active, inactive, cached, free) listeleridir. Sayfalar bu listeler arasında kullanımlarına göre yer değiştirilir. Sık sık erişilen sayfalar "aktif" isimli listede kalma eğiliminde olacaklardır. Kapanan bir sürecin veri sayfaları derhal boş alan listesine yerleştirilebilir. FreeBSD, eğer vm_page_scan yük durumuna ayak uyduramıyorsa tüm süreçleri takas alanına atabilir (mesela, sistemde bellek yetersiz durumda ise). Eğer bellek yetersizliği belli bir büyüklükte ise, vm_pageout_scan sistemde çalışan en büyük süreci sonlandıracaktır.
Linux aynı zamanda, bir LRU biçimli algoritmayı kolaylaştırmak için sayfaların farklı bağlı listelerini kullanır. Linux fiziksel belleği üç bölgeye (zone) ayırır, bir bölge DMA sayfaları için, ikinci bölge normal safyalar için, üçüncü de dinamik olarak tahsis edilmiş bellek için (Bazen birden fazla "üçlü bölge" olabilir). Bu bölgeler daha çok x86 mimarisi sınırlamalarının sebep olduğu bir uygulama (implementation) detayı olarak görünüyorlar. Sayfalar "sıcak", "soğuk" ve "boş" (hot, cold, free) listeler arasında yer değiştirir. Listeler arasında taşınma işlemi FreeBSD'deki mekanizmaya çok benzer. Sık sık erişilen sayfalar "sıcak" listesinde olacaktır. Boş sayfalarda "soğuk" ya da "boş" listesinde olacaktır.
Solaris, kendi LRU yer değiştirme algoritması çeşitlerinin bakımını sağlamak için bir adet boş listesi (free) bir adet hashed listesi ve bir adet vnode sayfa listesi kullanır. Solaris, vnode yada hash sayfa listesini (aşağı yukarı FreeBSD'deki aktif (active list), Linux'daki sıcak listesine (hot list) eşdeğer) taramak yerine, Solaris Internals yada başka bir yerde anlatıldığı gibi tüm sayfaları bir "two-handed clock" (iki elle kontrol edilen) algoritması kullanarak tarar. Bu iki el (hand) sabit iki noktada durur. Önden giden el, sayfaların referans bitini/bitlerini temizleyerek sayfaya eskimiş niteliği kazandırır. Önden giden el bir sayfaya eskimiş niteliği kazandırır, ardından arkadan gelen el bu sayfayı kontrol eder ve eğer herhangi bir süreç bu sayfayı kullanmamış ise sayfayı boşaltır (Eğer sayfa değiştirilmiş ise ilk eşzamanlı olmayan yazma işlemi ile sayfa diske yazılır).
Bu üç işletim sistemi'de sayfalama işlemleri sırasında "NUMA (Non-Uniform Memory Access) locality" yi hesaba katar. Yine bu üç sistemde, I/O tampon önbelleği (buffer cache) ve sanal bellek sayfa önbelleği (virtual memory page cache) bir sistem sayfa ara belleği (page cache) içersine birleştirilir. Sistem sayfa önbelleği, mmapp edilmiş dosyalarda ve uygulamaların text, data kısımlarında olduğu gibi dosyaların okuma yazma işlemleri için kullanılır.
Üç işletim sistemide uygulama programlarından, dosya sistemi uygulama detaylarını gizlemek için bir veri soyutlama katmanı kullanır. Üç işletim sisteminde, temelde olan dosya verisi uygulaması ve organizasyonuna bakmaksızın dosyalara erişmek için open, close, read, write, stat, vs. sistem çağrılarını kullanabilirsiniz. Solaris ve FreeBSD bu mekanizmayı VFS (Virtual File System) olarak isimlendirir ve temelde olan veri yapısıda vnode yada virtual node'dur. Solaris veya FreeBSD'de erişilmiş her dosya kendisine tahsis edilmiş bir vnode'a sahiptir. vnode genel dosya bilgisine ek olarak, dosya sistemine has bilgilere bağlanmış işaretçiler içerir. Linux keza benzer bir mekanizma kullanır, bu VFS (virtual file switch) olarak isimlendirilir. Linux'da dosya sisteminden bağımsız veri yapısı bir inode'dur. Bu yapı Solaris/FreeBSD üzerinde olan vnode'a benzer. (Not: Solaris ve FreeBSD'de bir inode yapısı vardır, fakat bu UFS dosya sistemleri için dosya sistemi bağımlı bir veridir.) Linux iki farklı veri yapısına sahiptir, biri dosya işlemleri için diğeri ise inode işlemleri içindir. Solaris ve FreeBSD bunları "vnode işlemleri" olarak birleştirir.
VFS sistem üzerinde bir çok dosya sistemi tipini kullanabilme olanağı sağlar. Bunun anlamı, bu işletim sistemlerinden birinin (Linux), diğer İşletim Sistemlerinin dosya sistemlerine erişememesi için hiç bir sebep yoktur. Tabii bu, ilgili dosya sistemi yordamları ve veri yapılarının VFS'e entegre edilmiş olmasını gerektirir. Üç işletim sistemide dosya sistemi yığınına izin veriri. Tablo 2'de her üç işletim sistmeminde kullanılabilen dosya sistemi tipleri listelenmiştir, ancak bütün dosya sistemi tipleri listede yoktur.
Tablo 2. Bir kısım Dosya Sistemi Tipleri |
||
Solaris |
ufs |
Varsayılan yerel dosya sistemi (BSD Fast Filesystem tabanlı) |
nfs |
Uzak dosyalar |
|
proc |
/proc dosyalar; |
|
namefs |
İsim dosya sistemi; door/strem'leri dosya gibi açmaya olanak veriri |
|
ctfs |
Servis Yönetim Sistem'i (Service Management Facility) ile birlikte kullanılan sözleşme dosya sistemi |
|
tmpfs |
Geçici oluşturulan dosyalar için anonim alanlar (bellek/swap alanı) kullanılır. |
|
swapfs |
Anonim alanların takibinin yapılabilmesi için (data, heap, stack, vs.) |
|
objfs |
Çekirdek modüllerinin takibinin yapılabilmesi için, |
|
devfs |
/devices dosyalarının takibinin yapılabilmesi
için; |
|
FreeBSD |
ufs |
Varsayılan yerel dosya sistemi (ufs2, BSD Fast Filesystem tabanlı) |
defvs |
/dev dosyalarının takibinin yapılabilmesi için |
|
ext2 |
Linux ext2 dosya sistemi (GNU tabanlı) |
|
nfs |
Uzak dosyalar |
|
ntfs |
Windows NT dosya sistemi |
|
smbfs |
Samba dosya sistemi |
|
portalfs |
Bir süreci bir dizin üzerine kurmak için (Mount) |
|
kernfs |
Dosyalar çeşitli sistem bilgileri tutarlar |
|
Linux |
ext3 |
Journaling özelliği olan Uzantı tabanlı (Extent-based) dosya sistemi, ext2 tabanlı |
ext2 |
Uzantı tabanlı (Extent-based) dosya sistemi |
|
afs |
Uzak dosya paylaşımları için AFS istemcisi desteği |
|
nfs |
Uzak dosyalar |
|
coda |
Diğer bir ağ tabanlı dosya sistemi |
|
procfs |
Süreçler, İşlemciler, bus'lar, platforma özel olanlar |
|
reiserfs |
Journaling özelliği olan dosya sistemi |
Solaris, FreeBSD ve Linux sistemlerinden her biri açık açık diğer iki sistemden faydalanmaktadır. Solaris'in açık kaynağa gidişi ile birlikte bunun daha hızlı bir biçimde devam edeceğini bekliyorum. Benim izlenimim şu ki, değişim en hızlı Linux'ta oluyor. Bunun yararları, yeni teknolojilerin sisteme hızlı bir şekilde dahil edilebilmesi. Malesef, bazen dökümantasyon (ve belki bazı sağlamlıklar(robustness)) geride kalır. Linux'da bir çok geliştirici vardır, ve bazen bu göz önüne çıkar. FreeBSD (BSD) bu üç sistem arasında ortalıkta en uzun süredir gürülen işletim sistemidir. Solaris'in temelleri BSD Unix ve AT&T Unix'ten alınan bazı özellikler üzerine bina edilmiştir. Solaris, veri soyutlama katmanlarını daha çok kullanır ve bundan dolayı genellikle ek özellikleri kolaylıkla destekleyebilir. Ancak çekirdekteki çoğu katmanlaşma dökümante edilmemiştir. Muhtemelen kaynak kodlara erişim bu durumu değiştirecektir.
Farklılıkları vurgulamak için küçük bir örnek, sayfa hata (page fault) işleme mekanizmasıdır. Solaris'te bir sayfa hatası oluştuğu zaman, kod bir platform bağımlı tuzak işleyici (trap handler) içersinde başlar, sonra genel bir as_fault() yordamı çağırır. Bu yordam hatanın oluştuğu bölümü (segment) belirler ve hatayı işlemek için bir "bölüm sürücüsü" (segment driver) çağırır. Bölüm sürücüsü dosya sistemi kodunu çağırır. Dosya sistemi koduda sayfayı getirmesi için aygıt sürücüsünü çağırır. page-in işlemi tamamlandığı zaman, bölüm sürücüsü sayfa tablosu girişlerini (ya da onlara eşit olanları) güncellemesi için HAT katmanını çağırırı. Linux'da sayfa hatası oluştuğunda, çekirdek hatayı işlemek için iligli kodu çağırır. Bir anda kendinizi platform bağımlı kod içersinde bulursunuz. Bunun anlamı Linux'da hata işleme kodu daha hızlı olabilir, fakat Linux kodu kolayca uzatılabilir yada taşınabilir olmayabilir.
Çekierdek anlaşılabilirliğini sağlayan ve hata ayıklamaya yarayan araçlar, sistem davranışlarını doğru anlayabilmek için çok önemlidirler. Evet kaynak kodları okuyabilirsiniz, ancak kodu eksik okuyabileceğinizi düşünüyorum. Kodun nasıl çalıştığına dair hipotezinizi test etmek için araçların var olaması çok önemli, değerli bir durumdur. Bu bakımdan, Solaris'i kmdb, mdb ve DTrace ile açık bir zafer kazanmış olarak görüyorum. Yıllardan beri Solaris için tersine mühendislik (reverse engineering) yapıyorum. Genellikle bir soruyu, kaynak kodları okumak yerine iligli araçları kullanarak daha hızlı cevaplayabiliyorum. Linux'da benzer miktarda seçimim yok. FreeBSD'de sistem çökmeleri anında çekirdek tarafından üretilen çıktıları (kernel crash dump) gdb ile inceleme imkanı var. gdb kod üzerinde kırılma nokaları, tek adım (breakpoints, single step) tanımlamaya, veri ve kodu incelemeye veya değiştirmeye olanak verir. Bunlar ilgili araçları indirip kurmanız şartıyla Linux'da da mümkündür.
Max Bruning halen Solaris İç yapısı (Solaris internals), aygıt sürücüleri, çekirdek hata çıktıları analizi ve hata ayıklama (uygulama programlarında olduğu gibi), ağ sistemleri iç yapıları (networking internals) ve uzmanlık alanına giren konularda eğitim ve destek vermektedir. Kendisi ile [email protected] e-posta adresi yada http://mbruning.blogspot.com/ web adresi yolu ile iletişime geçebilirsiniz.
Not : Orjinal makalede bazı bağlantılar (link) açılmadığı için yerlerine aynı içerikli başka bağlantılar kullanılmıştır.
Orjinal Makale :
http://www.opensolaris.org/os
Çeviren :
ATILIM BOY
http://www.enderunix.org/aboy
| http://www.trunix.org/aboy
aboy at enderunix dot org | aboy at trunix dot org