UNIX, Linux ve Android UNIX Tarihçesi • İlk olarak 1969’ da Bell Laboratuvarı araştırma ekibinden Ken Thompson ve Dennis Ritchie tarafından özellikle MULTICS gibi diğer işletim sistemlerinin özellikleri birleştirilerek geliştirilmiştir. • Üçüncü versiyonu, Bell Laboratuvarında UNIX’ I desteklemek için özel olarak geliştirilen C ile yazılmıştır. • Bell Lab ve AT&T UNIX geliştirme grupları dışındaki en itibarlı UNIX sürümleri Kaliforniya Üniversitesi Berkeley Kampüsü’nde (Berkeley Software Distributions - BSD) geliştirilmiştir. • Devletin kullanımı için standart bir UNIX geliştirme maksatlı DARPA fonlaması ile 4BSD UNIX meydana gelmiştir. BSD UNIX sürümlerinden en yaygın olanı 4.3BSD’ dir. UNIX Sürümleri UNIX’ in Başlangıçtaki Avantajları • Yüksek seviye bir dilde yazılması • Kaynak kodu biçiminde dağıtılması • Güçlü işletim sistemi temel bileşenlerini ucuz bir platform üzerinde sağlaması • Küçük boyutlu, modüler ve temiz bir tasarıma sahip olması UNIX Tasarım İlkeleri • Zaman paylaşımlı bir sistem olarak tasarlanmıştır. • Değiştirilebilen basit bir standart kullanıcı arayüzüne (kabuk) sahiptir. • Çok seviyeli ağaç yapılı dizinlerden oluşan dosya sistemi içerir. • Dosyalar çekirdek tarafından yapısız baytlar dizisi olarak desteklenmektedir. • Çoklu süreçleri destekler, bir süreç kolaylıkla başka süreçler oluşturabilir. • Sistemi etkileşimli hale getirmek ve program geliştirme için kolaylıklar sağlamak yüksek önceliklidir. Programcı Arayüzü • UNIX de pek çok sistem gibi çekirdek (kernel) ve sistem programları kısımlarından oluşmaktadır. • Çekirdek işletim sisteminin temel kodunu oluştururken sistem programları sistem çağrıları üzerinden çekirdekle muhatap olurlar. 4.4BSD Katman Yapısı Sistem Çağrıları • UNIX’ e programcı arayüzünü tanımlar. • Yaygın olarak kullanılabilen bir sistem programları kümesi kullanıcı arayüzünü tanımlar. • Programcı ve kullanıcı arayüzü çekirdeğin desteklemesi gereken içeriği tanımlar. • UNIX’ te sistem çağrıları kabaca üç kategoride yer alır. • Dosya manipülasyonu (Bazı sistem çağrıları aynı zamanda aygıt manipülasyonu sağlar) • Süreç denetimi • Bilgi manipülasyonu Dosya Manipülasyonu • Çekirdek dosyalar için bir yapı dayatmamaktadır. • Dosyalar ağaç yapılı dizinlerle düzenlenir. • Bir dosya, dosyaya giden dizin yapısı üzerinden yol adı belirtilerek tanımlanır. Mutlak yol adları dosya sisteminin kökünden başlar. Göreli yol adları o anki dizinden başlar. • Basit dosya işlemleri için create, open, read, write, close, unlink, trunc sistem çağrıları kullanılır. Tipik UNIX Dizin Yapısı UNIX Sinyalleri • Kesme sinyali olarak tanımlanan SIGINT, bir komut tamamlanmadan önce onu durdurmak için kullanılır. (Genelde Ctrl+C ile oluşturulur.) • İstisnai olaylar haricinde de sinyal kullanımı söz konusudur. • Ağ bağlantılarından gelen acil veriler iletilir. • İsteğe bağlı olarak alt süreçler başlatılır veya durdurulur. • SIGWINCH, bir sürecin görüntülendiği pencerenin boyutları değiştiği zaman süreci bilgilendiren bir sinyaldir. Süreç Denetimi • UNIX’in süreçleri denetleme mekanizması süreç yönetimi konusunda ele alınmıştır, ilgili slaytlara bakabilirsiniz. • Bütün kullanıcı süreçleri init isimli bir ana süreçten türemektedir. • init, getty adında bir süreç oluşturur. Bu çocuk süreç terminal satırı parametrelerini başlatır ve kullanıcının adını login’ e geçer. • login sürecin nümerik kullanıcı tanımlayıcısını kullanıcınınki olarak atar. • Kullanıcı komutları için alt süreçler oluşturan bir kabuk çalıştırır. • setuid biti sürecin etkili kullanıcı tanımlayıcısını dosyanın sahibinin kullanıcı kimliği olarak atar ve gerçek kullanıcı tanımlayıcısını olduğu gibi bırakır. • setuid şeması çeşitli süreçlerin sıradan kullanıcılar tarafından halen çalıştırılıyorken sıradan imtiyazlardan daha fazlasına sahip olmalarına izin verir. Süreç Denetim Çağrılarının Gösterimi Süreç Grupları • Ortak bir işi yapmak için işbirliği yapan alakalı süreçlerin kümesidir. • Herhangi bir anda bir terminali sadece bir süreç grubu G/Ç için kullanabilir. • Ön plandaki iş terminal üzerindeki kullanıcının ilgisindedir. • Arka plandaki işler, kullanıcı etkileşimi olmaksızın kendi işlevlerini yürüten işlerdir. • Terminale erişim süreç grup sinyalleri tarafından denetlenir. • Her iş annesinden bir denetleyici terminali kalıtımla alır. • Eğer denetleyici terminalin süreç grubu bir sürecin grubuyla eşleşiyorsa süreç ön plandadır. • SIGTTIN veya SIGTTOU G/Ç yapmaya kalkışan bir arka plan sürecini dondurur; eğer kullanıcı o süreci ön plana alırsa SIGCONT sürecin artık G/Ç yapabileceğini belirtir. • SIGSTOP ön plandaki bir süreci dondurur. Bilgi Manipülasyonu • settimer/gettimer sistem çağrıları ile bir aralık zamanlayıcısı ayarlanır/dönülür. • O anki zamanı dönme ve ayarlama çağrıları: gettimeofday/settimeofday • Süreçler getpid ile süreç tanımlayıcılarına, getgid ile grup tanımlayıcılarına, gethostname ile üzerinde çalıştıkları bilgisayarın adına erişebilirler. Kütüphane Rutinleri (Fonksiyon) • UNIX sistem çağrıları arayüzü geniş bir kütüphane rutinleri koleksiyonu tarafından desteklenmektedir. • Başlık (header) dosyaları sistem çağrılarında kullanılan karmaşık veri yapılarının tanımlarını sağlar. • Matematiksel fonksiyonlar, ağ erişimi, veri dönüşümü vb. işlevler için ek kütüphane desteği verilmektedir. Kullanıcı Arayüzü • Programcılar ve kullanıcılar genel olarak mevcut olan sistem programlarıyla muhatap olurlar, ihtiyaç duyulan sistem çağrıları programa gömülüdür ve kullanıcıya aşikar olmak zorunda değildir. • En yaygın sistem programları dosya veya klasör tabanlıdır. • Dizin: mkdir, rmdir, cd, pwd • Dosya: ls, cp, mv, rm • Diğer programlar editörler (örn. emacs, vi) yazı biçimleyiciler (örn. troff, TEX) ve diğer aktivitelere ilişkindir. Kabuk (Shell) ve Komutlar • Kabuk (Shell) programları çalıştıran kullanıcı sürecidir. (komut yorumlayıcı da denmektedir) • Çekirdeği sardığı/kuşattığı için kabuk denmektedir. • Kabuk başka bir komutu kabul etmek için hazır olduğunu belirtir ve kullanıcı tek bir satıra komutu yazar. • Tipik bir komut aslında çalıştırılabilir ikili bir nesne dosyasıdır. • Kabuk arama yolu (path) boyunca komut dosyasını bulmak için gezinir, bulunca yükler ve çalıştırır. • /bin ve /usr/bin dizinleri daima arama yolunda bulunmaktadır. • BSD UNIX için arama yolu genel olarak ./home/prof/avi/bin /usr/local/bin /usr/ucb/bin /usr/bin şeklindedir. • Kabuk komut çalışmasını bitirene kadar genelde kendi çalışmasını askıya alır. Standart G/Ç • Çoğu süreç başladıklarında üç dosya tanımlayıcının açılmasını umar. • standart girdi – program kullanıcının girdiğini okuyabilir • standart çıktı – program kullanıcının ekranına çıktıyı gönderebilir. • standart hata – hata çıktısı • Çoğu program standart girdi ve çıktı için (terminalden ziyade) bir dosyayı da kabul edebilir. • Yaygın kabuklar, bir sürecin standart G/Ç akımları için hangi dosyaların açık olduğunu değiştirmek için basit bir söz dizimine sahiptir ve buna G/Ç yönlendirmesi denir. Standart G/Ç Yönlendirmesi Komut Komutun Anlamı % ls > dosya_a ls komutunun çıktısını dosya_a’ ya yönelt % pr < dosya_a > dosya_b dosya_a’ dan girdi al ve dosya_b’ye çıktı ver % lpr < dosya_b dosya_b’ den girdi al % % make program > & errs Hem standart çıktıyı hem de standart hatayı bir dosyaya kaydet Boru Hatları, Filtreler ve Kabuk Betikleri (Scripts) • Bireysel komutlar | ile bütünleştirilerek önceki komutun çıktısının sonraki komuta girdi olarak geçilmesi sağlanır. % ls | pr | lpr • Standart girdisini standart çıktıya bazı işleme yürüterek geçen pr gibi bir komuta filtre denmektedir. • Farklı bir sentaks ve semantikle yeni bir kabuk yazmak kullanıcı görünümünü değiştirecek ancak çekirdek (kernel) veya programcı arayüzünü değiştirmeyecektir. • “X Window System” UNIX için yaygın olarak kabul edilmiş ikonik bir arayüzdür. Sistem Veri Parçası (Segment) • Çoğu iş kullanıcı modunda; sistem çağrıları sistem modunda yürütülür. • Bir sürecin sistem ve kullanıcı aşamaları asla aynı anda çalıştırılmaz. • Sistem modunda çalışan bir süreç için çekirdek yığıtı (kernel stack) kullanılır. • Çekirdek yığıtı ve kullanıcı yapısı birlikte bir süreç için sistem veri parçasını oluşturur. CPU Zamanlama • Her sürecin kendisiyle ilişkili bir zamanlama önceliği vardır, büyük sayılar düşük öncelik demektir. • CPU zamanlamadaki olumsuz geri besleme bir sürecin bütün CPU zamanını almasını güçleştirir. • Aç kalmayı önlemek için süreç yaşlandırma uygulanır. • Bir süreç CPU’ yu bırakmayı seçerse, bir olay üzerinde uykuya geçer. • Olay gerçekleştiğinde bunu bilen sistem süreci olaya ilişkin adresle wakeup() çağrısı yapar ve aynı adres üzerindeki uyku yapmış bütün süreçler çalıştırılmak üzere hazır kuyruğuna yerleştirilir. Bellek Yönetimi • Önceki bellek yönetim şemaları UNIX’ in geliştirildiği PDP makinelerinin göreli olarak küçük bellek kaynaklarıyla sınırlandırılmıştı. • 3BSD öncesi sistem süreçler arası bellek rekabetini yönetmek için takaslamayı kullanmaktaydı. Eğer çok fazla rekabet varsa süreçler yeterli bellek müsait olana kadar takaslanırdı. • Ana bellek ve takas uzayının her ikisinin tahsisi ilk uyan algoritmasıyla yapılır. • Paylaşılabilir yazı parçalarını takaslamaya gerek yoktur, hem takas trafiği hem de aynı yazı parçasını kullanan çoklu süreçler için gereken ana bellek miktarı azalır. • Zamanlayıcı süreç (veya takaslayıcı) çeşitli faktörlerle hangi süreçlerin takaslanacağına karar verir. Sayfalama • Berkeley UNIX sistemleri sayfalamayı öncelikli olarak bellek rekabet yönetimi için kullanır, takaslama ikinci plandadır. • Bir pagedaemon süreci çalışan süreçleri desteklemek için yeterince boş çerçeve tutarken değiştirilmiş bir ikinci şans sayfa değiştirme algoritması kullanır. • Eğer zamanlayıcı sayfalama sisteminin aşırı yüklü olduğuna karar verirse, yük azaltılana kadar süreçler bütün olarak takas edilecektir. Dosya Sistemi • UNIX dosya sistemi dosya ve dizinler kullanır. Dizinler özel bir tür dosyadır. • Dosya sistemin çoğu veri bloklarıyla kaplıdır. • 4.2BSD hiçbir dolaylı blok içermeyen dosyalar için boyutlanmış iki blok kullanır: • Sonuncu hariç bir dosyadaki bütün bloklar geniş blok boyutundadır. (8K gibi) • Son blok dosyayı doldurmak için uygun miktarda daha küçük bir parça boyutundadır. • Böylece 18000 bayt boyutundaki bir dosyanın iki 8K bloğu ve (tamamen doldurulmayan) bir 2K parçası olur. • Blok ve parça boyutları dosya sisteminin kullanım amacında göre dosya sistemi oluşturulması esnasında belirlenir: • Çok sayıda küçük dosyalar bekleniyorsa, parça boyutu küçük olmalıdır. • Büyük dosyaların (film gibi) tekrarlı transferleri söz konusuysa temel blok boyutu geniş olmalıdır. • En fazla blok/parça oranı 8 : 1’ dir; en küçük blok boyutu 4K’ dır. (tipik olarak 4096 : 512 ve 8192 : 1024 kullanılır) i-düğümler • Bir dosya disk üzerinde o dosya hakkında bilgi barındıran bir kayıt olan i-düğüm ile gösterilir. • i-düğüm dosyanın veri içeriğini içeren disk bloklarına 15 gösterge de içerir. • İlk 12’ si doğrudan blokları, sonraki 3’ü dolaylı blokları gösterir. • Tek dolaylı blok, veri içeren blok adresleri içeren bir indeks bloğudur. • Çift dolaylı blok işaretçisi, veri bloklarını gösteren işaretçi içeren blok adreslerini içeren bloğun adresidir. • Üçlü dolaylı blok işaretçisine ihtiyaç yoktur, 232 bayt kadarlık dosyalar sadece çift dolaylı blokları kullanacaktır. Dizinler • i-düğüm tipi alanı düz dosyalar ve dizinleri birbirinden ayırır. • Dizin girdileri değişken boyuttadır, her girdi önce girdinin boyutunu ardından dosya adı ve I-düğüm numarasını içerir. • Bir kullanıcı bir dosyayı yol adı ile belirtirken, dosya sistemi I-düğüm kullanır. • Çekirdek verilen kullanıcı yol adını bir i-düğüme eşlemelidir. • Dizinler bu eşleme için kullanılır. • Önce başlangıç dizini belirlenir: • Eğer ilk karakter “/” ise, başlama dizini kök dizindir. • Diğer herhangi bir ilk karakter için başlama dizini o an bulunulan dizindir. • Arama süreci yol adının sonuna gelinceye ve istenen i-düğüm dönülünceye kadar devam eder. • Bir i-düğüm bulunduğunda bir dosya yapısı , i-düğümü gösterecek şekilde tahsis edilir. • 4.3BSD dosya sistemi başarımını yakın zamandaki dizin/i-düğüm dönüşümlerini tutan bir dizin isim ön belleği ekleyerek arttırmıştır. Dosya Sistemi Denetim Blokları Disk Yapıları • Kullanıcının gördüğü bir dosya sistemi aslında her biri farklı aygıtlarda olan çok sayıda fiziksel dosya sisteminden oluşabilmektedir. • Bir fiziksel aygıtı çok sayıda dosya sistemine bölmenin çeşitli faydaları vardır: • • • • Farklı dosya sistemleri farklı kullanımları destekleyebilir. Güvenilirlik arttırılır. Dosya-sistem parametrelerini çeşitlendirerek verimlilik arttırılabilir. Bir programın geniş bir dosya için kullanılabilir bütün alanı kullanmasının önüne geçilir. • Yedekleme sürücülerinde aramayı ve yedeklerden geri yüklemeyi hızlandırır. • Kök dosya sistemi daima bir sürücü üzerinde kullanılabilir. • Diğer dosya sistemleri takılabilir (mount). Kök dosya sisteminin dizin hiyerarşisine entegre edilebilir. Dosya Sistemini Fiziksel Aygıtlara Eşleme İmplementasyonlar • Dosya sistemine kullanıcı arayüzü basit ve iyi tanımlıdır, dosya sisteminin implementasyonunun kullanıcıda önemli bir etki bırakmadan değiştirilebilmesine imkan verir. • Sürüm 7 için, i-düğüm sayıları çift katına çıkarılmış, maksimum dosya ve dosya sistemi boyutu arttırılmış ve serbest liste işleme ile süperblok bilgisi detayları değiştirilmiştir. • 4.0BSD’ de, dosya sisteminde kullanılan toplam blok sayısı 512 bayttan 1024’ e yükseltilmiştir. • 4.2BSD Berkeley Hızlı Dosya Sistemi’ ni getirmiştir. Bu sistemde hız artışı ve şu yeni özellikler sağlanmaktaydı: • Yeni dizin sistem çağrıları • truncate çağrıları • “Hızlı Dosya Sistemi” çoğu UNIX implementasyonunda bulunmaktadır. Düzen ve Tahsis Politikası • Çekirdek bir dosyayı tanımlamak için bir <mantıksal aygıt numarası, idüğüm numarası> ikilisi kullanır. • Mantıksal aygıt numarası dahil olan dosya sistemini tanımlar. • Dosya sistemindeki i-düğümler seri halinde numaralandırılır. • 4.3BSD ile bir dosyadaki blokların yerelleştirilmesini sağlayan silindir grubu kullanılmaya başlanmıştır. • Her silindir grubu bir veya daha fazla ardışık disk silindirini işgal eder, böylece silindir grubu içi disk erişimi en az sayıda disk kafası hareketine ihtiyaç duyar. • Her silindir grubunun bir süper bloğu, bir silindir bloğu, bir i-düğüm dizisi ve bazı veri blokları vardır. 4.3BSD Silindir Grubu Veri blokları Süperblok Silindir blokları i-düğümler Veri blokları G/Ç Sistemi • G/Ç sistemi G/Ç aygıtlarının tuhaflıklarını çekirdeğin ana kısmından gizler. • Tampon önbellekleme sistemi, genel aygıt sürücüsü kodu ve özel donanım aygıtları için sürücülerden oluşur. • Sadece aygıt sürücüsü belirli bir aygıtın tuhaflıklarını bilir. 4.3 BSD Çekirdek G/Ç Yapısı Blok Tampon Önbelleği • Her biri aygıt üzerindeki bir aygıt ve blok numarasının yanısıra fiziksel belleğin bir parçasını gösterebilen tampon başlıklarından oluştur. • O anda kullanılmayan blokların tampon başlıkları çok sayıda bağlı listelerde tutulur: • Yakın zamanda kullanılan tamponlar LRU listesinde • Yakın zamanda kullanılmamış veya geçerli bir içeriği olmayan tamponlar AGE listesinde • Herhangi bir fiziksel bellekle bağı olmayan BOŞ tamponlar • Bir aygıttan bir blok istendiğinde önbelleğe bakılır. Bulunursa kullanılır ve herhangi bir G/Ç transferi gerekmez. Bulunamazsa tampon AGE listesinden, eğer liste boşsa LRU listesinden seçilir. • Tampon önbelleği boyutu sistem performansını etkiler, yeterince genişse tamponu tutturma oranı yükselir ve G/Ç transferine daha az ihtiyaç duyulur. • Bir disk dosyasına yazılan veriler önbellekte tamponlanır ve disk sürücüsü çıktı kuyruğunu disk adresine göre sıralar. • Bu işlemler disk sürücüsünün disk kafası aramalarını en aza indirmeyi ve disk dönmesi için optimize edilmiş anlarda veri yazılmasını sağlar. Ham Aygıt Arayüzleri • Neredeyse bütün blok aygıtlarının bir karakter arayüzü veya ham aygıt arayüzü vardır. Blok arayüzünden farklı olarak blok tampon önbelleğini pas geçer. • Her disk sürücüsü bekleyen transferler kuyruğunu barındırır. • Kuyruktaki her kayıt şunları belirtir: • • • • Okuma mı yazma mı olduğunu Transfer için bir ana bellek adresini Transfer için bir aygıt adresini Transfer boyutunu • Bilgiyi bir blok tamponundan bu kuyruk için ne gerektiğine eşlemek kolaydır. C-Listeleri • Terminal sürücüleri bağlı listelerdeki küçük karakter blokları tutmayı içeren bir karakter tamponlama sistemi kullanır. • Bir terminale yapılan write sistem çağrısı aygıt için karakterleri bir listede kuyruğa alır. İlk transfer başlatılır ve kesmeler karakterlerin kuyruktan çıkarılmasına ve sonraki transferlere neden olur. • Girdi de benzer şekilde kesme güdümlüdür. • Aygıt sürücüsünün standart kuyruğu pas geçip karakterleri doğrudan ham kuyruktan dönebilmesine ham mod denir. (her tuş basışına tepki vermesi gereken editör ve diğer programlarca kullanılır) Süreçler Arası İletişim • UNIX’ in karakteristik mekanizması borudur. İki süreç arasında tek yönlü güvenilir bir bayt akımına imkan verir. • 4.3BSD’ de borular soket mekanizmasının özel bir durumu olarak gerçekleştirilir. • Soket mekanizması alakasız süreçler tarafından kullanılabilir. Linux Tarihçesi • Linux, UNIX standartlarına dayanan çağdaş ve bedava/özgür bir işletim sistemidir. • İlk olarak 1991’ de tarafından küçük ama bir çekirdek olarak geliştirilmiştir. Ana tasarım amacı UNIX uyumluluğudur ve kaynak kodu açık olarak yayınlanmaktadır. • Geliştirilme tarihçesi bütün dünya genelinden kullanıcıların neredeyse tamamı Internet üzerinden olan katkılarıyla şekillenmiştir. • Yaygın PC donanımı üzerinde verimli ve güvenilir bir şekilde çalışmak için tasarlanmışsa da çok çeşitli platformlarda da çalışabilmektedir. (Raspberry Pi, Xbox vd.) • Linux işletim sisteminin çekirdeği (kernel) tamamen orijinaldir ama mevcut bedava/özgür UNIX yazılımlarını çalıştırabilmektedir. Bu yönüyle kapalı kod içermeksizin tamamen UNIX uyumlu bir işletim sistemidir • Linux sistemi, çekirdek, uygulamalar ve yönetim araçları içeren çok sayıda Linux dağıtımına sahiptir. Linux Çekirdeği • Sürüm 0.01 (Mayıs 1991) ağ içermemekteydi, sadece bir 80386 uyumlu Intel işlemcilere sahip PC donanımında çalışabiliyordu, çok kısıtlı aygıt/sürücü desteğine sahipti ve sadece Minix dosya sistemini desteklemekteydi. • Linux 1.0 (Mart 1994) şu yeni özellikleri içermekteydi: • • • • • • UNIX’in standart TCP/IP ağ protokolleri için destek Ağ programlama için BSD-uyumlu soket arayüzü Ethernet üzerinden IP çalıştırma için aygıt-sürücü desteği Genişletilmiş dosya sistemi Yüksek başarımlı disk erişimi için çeşitli SCSI denetleyici desteği İlave donanım desteği • Sürüm 1.2 (Mart 1995) sadece PC’ de çalışan son Linux çekirdeğiydi. • Tek sürüm numaralı çekirdekler geliştirme çekirdekleri, çift numaralılar üretim çekirdekleridir. Linux 2.0 • Ocak 1996’ da yayınlanan 2.0 ile iki ana yetenek eklenmiştir: • Tamamen doğal 64 bit Alpha portu da içeren çoklu mimari desteği • Çok işlemcili mimariler için destek • Ayrıca: • Bellek yönetim kodu ve TCP/IP başarımı iyileştirilmiştir. • Yüklenebilen modüller ve isteğe bağlı modüllerin otomatik yüklenmesi arasındaki bağımlılıkları işlemek için dahili çekirdek iplikleri desteği • Standartlaştırılmış konfigurasyon arayüzü • Motorola 68000-serisi işlemciler, Sun Sparc sistemleri, PC ve PowerMac sistemlerinde kullanılabilmektedir. • 2.4 ve 2.6 SMP desteğini arttırmış ve günlüğe kaydedici dosya sistemini, öncelik kullanan (preemptive) çekirdek, 64 bit bellek desteği eklemiştir. • 2011’ de Linux’ un 20. yıldönümünde 3.0 yayınlanmıştır. Sanallaştırma desteği ve bellek yönetimi geliştirilmiştir. Yeni bir sayfaya yazma becerisi ve “Tamamen Adil Zamanlayıcı” eklenmiştir. Linux Sistemi • Linux Berkeley’in BSD işletim sisteminin, MIT’ in X Pencere Sistemi’nin (X Window System) ve Özgür Yazılım Vakfı’ nın GNU projesinin parçaları olarak geliştirilmiş pek çok aracı kullanmaktadır. • Ana sistem kütüphaneleri GNU projesi tarafından başlatılmış, geliştirmeler Linux topluluğu/camiası tarafından sağlanmıştır. • Linux ağ yönetim araçları 4.3BSD kodundan türetilmiştir; buna karşılık olarak Free BSD gibi yakın zamandaki BSD türevleri de Linux’ tan kod almışlardır. • Linux sistemi, Internet üzerinden katkıda bulunan başıboş bir geliştiriciler ağı tarafından yönetilmektedir. Az sayıdaki kamuya açık ftp siteleri de de-fakto standart veri depoları (repository) olarak davranmaktadır. • Linux camiası tarafından yönetilen Dosya Sistemi Hiyerarşisi Standartı dökumanı çeşitli sistem bileşenleri arasında uyumluluğu sağlamak için kullanılmaktadır. • Bu dökuman bir standart Linux dosya sisteminin genel halini belirtir. Konfigürasyon dosyalarının, kütüphanelerin, sistem ikili dosyalarının ve çalışma zamanı veri dosyalarının hangi dizin adları altında bulundurulacağını belirler. Linux Dağıtımları • Temel Linux sistemini, sistem kurulumu ve yönetimi araçlarını ve yaygın UNIX araçlarının kuruluma hazır paketlerini içeren ön derlemeli paket kümeleridir. • İlk dağıtımlar bu paketleri yalnızca bütün dosyaları uygun yerlere açan (unpack) bir vasıta sağlayarak yönetirken, çağdaş dağıtımlar gelişmiş paket yönetimi kullanmaktadır. • SLS ve Slackware ilk dağıtımlardan olup, Red Hat ve Debian ticari ve ticari olmayan kaynaklarca takdir gören dağıtımlardır. Günümüzde Canonical (Ubuntu ve türevleri) ve SuSE dağıtımları önemli bir düzeye ulaşmıştır. • Türk kökenli dağıtımlar olarak Gelecek Linux ve (bir dönem TÜBİTAK tarafından desteklenen) Pardus yayınlanmış, ancak her iki dağıtım da beklenen başarıyı yakalayamamıştır. • RPM paket dosyası biçimi, çeşitli Linux dağıtımları arasında uyumluluğa imkan vermektedir. Linux Lisanslama • Linux çekirdeği şartları Özgür Yazılım Vakfı tarafından belirlenen GNU Genel Kamu Lisansı (General Public License – GPL) ile dağıtılmaktadır. Bütün haklardan feragat etmeyi gerektirebildiği için kamu malı lisanslama tercih edilmemiştir. • Zira Berkeley Yazılım Dağıtımı lisansı ile dağıtılan pek çok yazılım bu yüzden suiistimal edilerek ticarileştirilmeye zemin olmuştu. • Linux kullanan veya kendi Linux türevini oluşturan her hangi bir kişi/kuruluş, türetilen ürünü kapalı hale getiremez; GPL ile yayınlanan yazılımlar sadece çalıştırılabilir dosya olarak dağıtılamaz. • Dağıtımlar parayla satılabilir ancak kaynak kodu da üründe dahil olmalıdır. Tasarım İlkeleri • Linux UNIX uyumlu araçlar içeren çok kullanıcılı, çok görevli bir sistemdir. • Dosya sistemi geleneksel UNIX semantiğine bağlıdır ve standart UNIX ağ modelini tamamen implement etmektedir. • Ana tasarım hedefleri hız, verim ve standartlaştırmadır. • Linux alakalı POSIX dökümanlarıyla uyumlu olarak tasarlanmıştır; en az iki Linux dağıtımı resmi POSIX sertifikasyonunu elde edebilmiştir. • Pthreads ve bir POSIX gerçek zamanlı süreç denetimi alt kümesini destekler. • Linux programlama arayüzü BSD davranışından ziyade SVR4 UNIX semantiğine bağlıdır. Bir Linux Sisteminin Bileşenleri Sistem yönetim programları Kullanıcı süreçleri Kullanıcı hizmet programları Sistem paylaşımlı kütüphaneleri Linux çekirdeği Yüklenebilir çekirdek modülleri Derleyiciler (C, Perl vd.) Bir Linux Sisteminin Bileşenleri • Çoğu UNIX implementasyonu gibi, Linux da çekirdek ve diğer bütün bileşenler arasındaki en önemli ayırım olarak üç ana kod gövdesinden oluşur. • Çekirdek işletim sisteminin önemli soyutlamalarını yönetmekten sorumludur. • Çekirdek kodu, bilgisayarın bütün fiziksel kaynaklarına tam erişimle çekirdek modunda çalışır. • Bütün çekirdek kodu ve veri yapıları aynı tek adres uzayında tutulmaktadır. • Sistem kütüphaneleri; üzerinden uygulamaların çekirdekle iletişime geçtiği ve çekirdek kodunun bütün imtiyazlarına ihtiyaç duymayan çoğu işletim sistemi işlevselliğini gerçekleştiren bir standart fonksiyon kümesi tanımlamaktadır. • Sistem araçları bireysel özelleşmiş yönetim görevlerini yürütür. • Kullanıcı modu programlar (örn. “bourne-again” kabuğu (bash) gibi çok sayıda kabuk) zengin ve çeşitlidir. Çekirdek Modülleri • Çekirdek kodunun çekirdeğin geri kalanından bağımsız olarak derlenebildiği, yüklenebildiği ve kaldırıldığı (unload) bölümleridir. • Tipik olarak bir çekirdek modülü bir aygıt sürücüsü, bir dosya sistemi veya ağ protokolünü implement edebilir. • Modül arayüzü üçüncü partilerin (kişi, uygulama vb.) GPL ile dağıtılamayacak aygıt sürücülerini veya dosya sistemlerini kendi şartları altında yazabilmeleri ve dağıtabilmelerine müsaade eder. • Çekirdek modülleri bir Linux sisteminin ilave herhangi bir yerleşik aygıt sürücüsü içermeden standart, minimal bir çekirdekle kurulabilmesine imkan tanır. • Linux modül desteğinin dört bileşeni vardır: • • • • Modül yönetim sistemi Modül yükleyici ve kaldırıcı Sürücü kayıt sistemi Çakışma çözme mekanizması Modül Yönetimi • Modüllerin belleğe yüklenmesini ve çekirdeğin geri kalanıyla konuşmasına izin vermeyi destekler. • Modül yükleme iki ayrı bölüme ayrılır: • Çekirdek belleğindeki modül kodunun bölümlerini yönetmek • Modüllerin referans vermesine izin veren sembolleri işlemek (handling) • Modül isteyici yüklenmesi istenen ama bellekle o anda bulunmayan modülleri yönetir; aynı zamanda çekirdeği dinamik olarak yüklenen modülün hala kullanımda olup olmadığını görmek ve aktif olarak ihtiyaç duyulmadığı zaman modülü kaldırmak üzere düzenli olarak sorgular. Aygıt Kaydı • Yeni bir sürücü kullanılabilir olduğunda modüllerin çekirdeğin geri kalanına bunu söylemesini sağlar. • Çekirdek bütün bilinen sürücülerin dinamik tablolarını yönetir ve sürücülerin herhangi bir anda bu tablolara eklenmesini veya tablolardan çıkarılmasını sağlayan bir rutin kümesi sağlar. • Kayıt tabloları şu nesneleri içerir: • • • • Aygıt sürücüleri Dosya sistemleri Ağ protokolleri İkili (binary) biçim Çakışma Çözme • Farklı aygıt sürücülerinin donanım kaynaklarını kendilerine ayırmalarını ve kaynağın başka bir sürücü tarafından kazara kullanımının önüne geçmeye olanak tanıyan bir mekanizmadır. • Çakışma çözme modülü şunları amaçlar: • Modüllerin donanım kaynaklarına erişim üzerinde fikir ayrılığına düşmelerini önlemek • Otosondajların (autoprobe) mevcut aygıt sürücülerine karışmasını önlemek • Aynı donanıma erişmeye çalışan çok sayıda sürücünün çakışmalarını çözmek: 1. Çekirdek tahsis edilen donanım kaynaklarının bir listesini yönetir. 2. Sürücü önce çekirdek veritabanıyla kaynak ayırır. 3. Eğer kaynak müsait değilse rezervasyon isteği reddedilir. Süreç Yönetimi • UNIX süreç yönetimi süreçlerin oluşturulması ve yeni bir programın çalıştırılmasını iki ayrı işlemle ayırır. • fork() sistem çağrısı yeni bir süreç oluşturur. • exec() çağrısından sonra yeni bir program çalıştırılır. • UNIX altında; bir süreç, işletim sisteminin tek bir programın bir kez çalıştırılmasının içeriğini takip ederken yönetmesi gereken bütün bilgiyi kapsar. • Linux altında sürecin özellikleri; sürecin kimliği, ortamı ve içeriği olmak üzere üç gruba ayrılır. Süreç Kimliği • Süreç ID (PID) – Bir süreç için özgün bir tanımlayıcıdır. Bir uygulamanın sinyalleme, değiştirme veya bir başka süreci beklemesi için bir sistem çağrısı yaptığı zaman süreçleri belirlemede kullanılır. • Kimlik Bilgileri (Credentials) - Her süreç, sürecin sistem kaynakları ve dosyalara erişim haklarını belirleyen ilişkili bir kullanıcı kimliği ve bir veya daha fazla grup kimliğine sahip olmalıdır. • Kişilik (Personality) - Geleneksel olarak UNIX sistemlerinde bulunmaz. Linux’ da her sürecin çeşitli sistem çağrılarının semantiğini hafifçe değiştirebileceği ilgili kişilik tanımlayıcısı vardır. • Öncelikli olarak öykünme (emulation) kütüphaneleri tarafından sistem çağrılarının çeşitli özel UNIX “çeşnileriyle” uyumlu olmasını istemek için kullanılır. • İsim Uzayı (Namespace) – Dosya sistemi hiyerarşisinin özel görünümüdür. • Çoğu süreç ortak isim uzayını paylaşır ve paylaşımlı bir dosya sistemi hiyerarşisi üzerinde çalışır. • Fakat her biri kendi kök dizini ve takılı (mounted) dosya sistemi kümesiyle özgün dosya sistemi hiyerarşisine sahip olabilir. Süreç Ortamı • Sürecin ortamı annesinden kalıtımla alınır ve sonu ”null” ile biten iki vektörden oluşur: • Argüman vektörü çalışan programı çağırmak için kullanılan komut satırı argümanlarını listeler, teamül olarak programın adıyla başlar. • Ortam vektörü isimli ortam değişkenlerinin rastgele yazılı değerlerle ilişkilendiren bir “İSİM=DEĞER” ikilisi listesidir. • Süreçler arasında ortam değişkenlerini geçmek ve değişkenleri bir sürecin çocukları üzerinden kalıtımla almak, kullanıcı modu sistem yazılımının bileşenlerine bilgi geçmenin esnek yollarıdır. • Ortam değişkeni mekanizması sistem için bir bütün olarak ayarlanmış olmaktan ziyade süreç tabanlı ayarlanabilen bir işletim sistemi özelleştirmesi sağlar. Süreç İçeriği • Çalışan bir programın her hangi bir andaki durumudur. • Zamanlayıcı içeriği süreçi içeriğinin en önemli kısmıdır, zamanlayıcının süreci askıya alması ve yeniden başlatması için ihtiyaç duyduğu bilgidir. • Çekirdek, o anda her süreç tarafından tüketilen kaynakların ve sürecin o ana kadarki yaşama zamanı boyunca tükettiği toplam kaynakların muhasebe bilgisini yönetir. • Dosya tablosu çekirdek dosya yapılarını gösteren bir işaretçiler dizisidir. • G/Ç sistem çağrıları yaparken, süreçler dosyalara bu tablodaki indeksleriyle (dosya tanımlayıcı) atıfta bulunur. • Dosya tablosu mevcut açık dosyaları listelerken, yeni dosyalar açma istekleri dosya sistemi içeriğini ilgilendirir. • Yeni dosya aramalarında kullanılacak o anki kök ve öntanımlı dizinler buraya kaydedilir. • Sinyal işleyici tablosu belirli sinyaller vardığında sürecin adres uzayında çağrılacak rutini tanımlar. • Bir sürecin sanal bellek içeriği onun özel adres uzayındaki bütün içeriği açıklar. Süreçler ve İplikler • Linux süreçler ve iplikler için aynı dahili gösterimi kullanır. Bir iplik annesiyle aynı uzayı paylaşan yeni bir süreç gibidir. • Linux her ikisine de görevler demektedir. • clone() sistem çağrısıyla yeni bir iplik oluşturulduğunda ancak bir ayrım yapılır. • fork() tamamen yeni görev içeriğiyle yeni bir görev oluşturur. • clone() kendi kimliğiyle yeni bir görev oluşturur ama annesinin veri yapılarını paylaşmasına izin verilir. • clone() kullanmak bir uygulamaya iki iplik arasında tam olarak ne paylaşıldığı üzerinde “ince taneli” denetim verir. Bayrak Anlamı CLONE_FS Dosya sistemi bilgisi paylaşılır. CLONE_VM Aynı bellek uzayı paylaşılır. CLONE_SIGHAND Sinyal işleyiciler paylaşılır. CLONE_FILES Açık dosyaların kümesi paylaşılır. Zamanlama • Linux’ da zamanlama çeşitli çekirdek görevlerinin çalışmasını da içerir. • Çekirdek görevlerinin çalışması, çalışan bir süreç tarafından istenen görevler ve bir aygıt sürücüsü adına dahili olarak çalışan görevlerin ikisini de kapsar. • 2.5 sürümünde, O(1) olarak bilinen öncelik kullanan (preemptive), öncelik tabanlı yeni bir zamanlama algoritması kullanılmıştır. • Gerçek zamanlı aralık • “İyi değer” (nice value) kullanır • Etkileşimli performansta sıkıntılar yaşanmaktaydı • 2.6 ile “Tamamen Adil Zamanlayıcı” (Completely Fair Scheduler – CFS) getirilmiştir. Tamamen Adil Zamanlayıcı (CFS) • Geleneksel zaman dilimi fikrini ortadan kaldırır. Bunun yerine bütün görevlere işlemcinin zamanından kısımlar tahsis edilir. • CFS bir sürecin ne kadar çalışması gerektiğini bir toplam görevler miktarı fonksiyonu olarak hesaplar. • N çalışabilir görev, her biri işlemci zamanının 1/N’ sini alır demektir. • Ardından her göreve “iyi değeriyle” ağırlık verir. Küçük “iyi değer” yüksek ağırlık (ihtimal) anlamına gelir. • Daha sonra her görev görevin ağırlığının bütün çalışabilen görevlerin ağırlığına bölümüyle zaman orantılı olarak çalışır. • Ayarlanabilir değişken hedef gecikmesi, içerisinde her görevin en az bir kere çalışması gereken arzulanan aralıktır. • Eşit ağırlıklı ve 10 ms hedef gecikmeli 2 çalışabilir görevli basit bir durumu ele alalım. Her biri 5 ms boyunca çalışacaktır. Eğer 10 çalışabilir görev olsaydı, her biri 1 ms çalışacaktı. Minimum taneciklilik (granularity) her çalışmanın makul bir miktarda zamanda olmasını sağlar. (aslında adalet fikrini ihlal etmektedir.) Çekirdek Senkronizasyonu Tek İşlemci Çok İşlemci Çekirdek öncelik kullanımını kapat Dönen kilidi elde et Çekirdek öncelik kullanımını aç Dönen kilidi serbest bırak • Bir çekirdek modunda çalıştırma isteği iki yolla olabilir: • Çalışan bir program bir işletim sistemi hizmetini ya açıkça bir sistem çağrısı üzerinden ya da örtülü olarak (örn. bir sayfa hatası oluştuğunda) isteyebilir. • Bir aygıt sürücüsü CPU’ nın o kesmenin çekirdek tanımlı işleyicisini çalıştırmaya başlatmasına neden olan bir donanım kesmesi iletebilir. • Çekirdek senkronizasyonu, çekirdeğin kritik bölümlerinin bir başka kritik bölge tarafından kesilmeden çalışmasına izin veren bir çerçeve yapıya ihtiyaç duyar. • Linux kritik bölgeleri korumak için iki teknik kullanır: 1. Normal çekirdek kodu preempt edilemez (sürüm 2.6’ ya kadar) 2. Çekirdek, bir kritik bölge esnasında kesmeleri kapatmak için işlemcinin kesme denetim donanımını kullanarak paylaşımlı veri yapılarının koşut zamanlı erişim riski olmadan ilerlemesini garantiler. Bu teknik kesme servis rutinleri içinde oluşan kritik bölgelere uygulanır. • Dönen kilitler, semaforlar ve her ikisinin okuyucu-yazıcı sürümlerini sağlar. Tek veya çok işlemcide davranışlar değişmektedir. Çekirdek Senkronizasyonu • Performans cezalarından kaçınmak için Linux’ un çekirdeği, bütün kritik bölge süresince kesmeleri kapatmadan uzun kritik bölgelerin çalışmasına izin veren bir senkronizasyon mimarisi kullanır. • Kesme servis rutinleri üst yarı ve alt yarı olarak ikiye ayrılır. • Üst yarı normal bir kesme servis rutinidir ve özyinelemeli kesmeler kapalı bir şekilde çalışır. • Alt yarı, alt yarıdakilerin hiçbir zaman kendilerini kesmemesini sağlayan minyatür bir zamanlayıcı tarafından bütün kesmeler açık bir şekilde çalışır. • Bu mimari; normal ve ön planda çekirdek kodu çalıştırırken seçilen alt yarıları devre dışı bırakan bir mekanizmayla tamamlanır. Kesme Koruma Seviyeleri • Her seviye daha yüksek seviyede çalışan kod tarafından kesilebilir ama aynı veya daha altı seviyede çalışan kod tarafından asla kesilmeyecektir. • Kullanıcı süreçleri zaman paylaşımlı zamanlama kesmesi oluştuğunda daima öncelik kullanılarak askıya alınabilir. (preempt) Kesme işleyicilerin üst yarısı Yukarı yönde öncelik artar Kesme işleyicilerin alt yarısı Çekirdek sistem, servis rutinleri (preempt edilebilir) Kullanıcı modu programları (preempt edilebilir) Simetrik Çoklu İşleme (SMP) • Linux 2.0 SMP donanımını destekleyen ilk Linux çekirdeğiydi. Ayrı süreçler veya iplikler ayrı işlemciler üzerinde paralel olarak çalışabilmektedir. • Sürüm 2.2’ ye kadar, çekirdeğin preempt edilemeyen senkronizasyon ihtiyaçlarını muhafaza etmek için SMP, tek bir çekirdek dönen kilidi üzerinden bir anda sadece bir çekirdeğin çekirdek modu kodunu çalıştırabildiği bir kısıtlama dayatmıştır. • Sonraki sürümlerde her biri dönen kilidi çekirdek veri yapılarının küçük bir alt kümesini koruyan çoklu kilitlere ayırarak daha fazla ölçeklenebilirlik gerçekleştirilmiştir. • Sürüm 3.0 daha ”ince taneli” kilitleme, süreç yakınlığı (affinity) ve yük dengeleme getirmektedir. Bellek Yönetimi • Linux’un fiziksel bellek yönetim sistemi sayfaları, sayfa gruplarını ve küçük bellek bloklarını tahsis etme ve serbest bırakmayla uğraşır. • Sanal bellek, çalışan süreçlerin adres uzayına eşlenen belleği işlemek için ek mekanizmaları vardır. • Donanım karakteristiğine bağlı olarak belleği dört farklı bölgeye ayırır. • Mimariye özeldir mesela x86 üzerinde aşağıdaki yapıyı kullanır. Fiziksel Belleğin Yönetimi • Sayfa ayırıcı (allocator) bütün fiziksel sayfaları tahsis eder ve serbest bırakır; isteğe bağlı olarak fiziksel bitişik sayfaların aralıklarını tahsis edebilir. • Ayırıcı kullanılabilir fiziksel sayfaların kaydını tutmak için bir kanka-yığın algoritması kullanır. • Her ayrılabilir bellek alanı komşu bir partnerle eşlenir. • İki tahsis edilmiş partner alanın ikisi birden serbest kalınca ikisi daha büyük bir alana birleştirilir. • Eğer ufak bir bellek isteği mevcut ufak bir serbest bölge ile karşılanamıyorsa, isteği karşılamak için daha geniş bir serbest bölge iki partnere bölünür. • Linux çekirdeğindeki bellek tahsisleri ya statik olarak (sürücüler sistem açılışında belleğin bitişik bir bölgesini ayırır) veya dinamik olarak (sayfa ayırıcı üzerinden) olur. • Çekirdek belleği için levha ayırıcı da kullanılır. • Sayfa önbelleği ve sanal bellek sistemi de fiziksel belleği yönetir. • Sayfa önbelleği dosyalar için çekirdeğin ana önbelleğidir ve blok aygıtlarına G/Ç için ana mekanizmadır. • Sayfa önbelleği yerel ve ağ dosya G/Ç için bütün dosya içeriği sayfalarını kaydeder. Linux’ taki Levha Ayırıcı Sanal Bellek • Her sürece görünen adres uzayını barındırır. İsteğe bağlı olarak sanal bellek sayfaları oluşturur ve isteğe bağlı olarak bu sayfaların diske yüklenmesi/diskten alınması işlerini yönetir. • Sanal bellek yöneticisi bir sürecin adres uzayının iki ayrı görünümünü barındırır: • Adres uzayının genel yapısını ilgilendiren talimatları açıklayan bir mantıksal görünüm • Adres uzayı her biri bitişik, adres uzayının sayfa hizalı alt kümesini temsil eden çakışmayan bir bölgeler kümesinden oluşur. • Süreç için donanım sayfa tablolarında kayıtlı olan her adres uzayının fiziksel görünümü Sanal Bellek • Sanal bellek bölgeleri iki şekilde sınıflandırılır: • Bir bölge için sayfaların nereden geldiğini açıklayan yardımcı bellek (backing store); bölgeler genellikle bir dosya tarafından desteklenir veya hiçbir şey desteklemez. • Bölgenin yazmalara tepkisi (sayfa paylaşımı veya yazarken kopyala) • Çekirdek bir süreç exec() ile yeni bir program çalıştırdığında ve fork() ile yeni bir süreç oluşturulduğunda yeni bir adres uzayı oluşturur. • Yeni bir program çalıştırıldığında sürece yeni ve tamamen boş bir sanal adres uzayı verilir. Program yükleyici fonksiyonlar adres uzayını sanal bellek bölgeleriyle doldurur. • fork() ile yeni bir süreç oluşturma tamamen mevcut sürecin sanal adres uzayının bir kopyasını oluşturur. Detaylarına bellek yönetimi konusundaki yazarken kopyala kısmında değinilmişti. Takaslama ve Sayfalama • Sanal bellek sayfalama sistemi bellek başka bir şey için gerektiğinde fiziksel bellekten diske bellek sayfalarını taşır. • Sayfalama sistemi iki bölüme ayrılır: • Çıkan sayfa politikası algoritması hangi sayfaların ne zaman diske yazılacağını belirler. • Sayfalama mekanizması transferi ve ihtiyaç duyuldukçe sayfayı fiziksel belleğe sayfalamayı bizzat yürütür. • Takas aygıtı veya normal dosyalara sayfayı taşıyabilir. • Fiziksel bellekte tutulan takas uzayında kullanılan blokları takip için bit haritası kullanılır. • Ayırıcı bitişik çalışmaları yazmayı denemek için sonraki uyan algoritmasını kullanır. Çekirdek Sanal Belleği • Linux çekirdeği kendi dahili kullanımı için her sürecin sanal adres uzayının sabit, mimari bağımlı bir bölgesini ayırır. • Bu çekirdek sanal belleği alanı iki bölgeden oluşur: • Sistemdeki her müsait fiziksel sayfayı gösteren sayfa tablosu referansları içeren statik bir alan, bu sayede çekirdek kodu çalıştırıldığında fiziksel adresten sanala basit bir çeviri yapılabilmektedir. • Ayrılan bölgenin hatırlatıcısının özel bir amacı yoktur, bunun sayfa tablosu girdileri herhangi bir başka bellek alanını işaret edecek şekilde değiştirilebilir. Kullanıcı Programlarını Yükleme ve Çalıştırma • Linux programları yüklemek için bir fonksiyon tablosu barındırır; exec() yapıldığında her fonksiyona verilen dosyayı yüklemeyi deneme fırsatı verir. • Çok sayıda yükleyici fonksiyonların kaydı, Linux’ a hem ELF hem de a.out ikili biçimlerini destekleme imkanı verir. • Başlangıçta ikili dosya sayfaları sanal belleğe eşlenir. Yalnızca programın sayfa erişim denemeleriyle sayfa hatasıyla sonuçlanacak sayfalar belleğe yüklenir. • Bir ELF biçimindeki ikili dosya, bir başlık (header) ve takip eden çok sayıda sayfa hizalı bölümlerden oluşur. • ELF yükleyici başlığı okuyarak ve dosyanın bölümlerini sanal belleğin ayrı bölgelerine eşleyerek çalışır. ELF Programları İçin Bellek Düzeni Statik ve Dinamik Bağlama • Gerekli kütüphane fonksiyonları programın çalıştırılabilir ikili dosyasına doğrudan gömülen bir program kütüphanelerine statik olarak bağlıdır. • Statik bağlamanın ana dezavantajı oluşturulan her programın tamamen aynı ortak sistem kütüphanesi fonksiyonlarının kopyalarını içermek zorunda olmasıdır. • Dinamik bağlama disk alanı ve fiziksel bellek kullanımı açısından daha verimlidir, çünkü sistem kütüphanelerini belleğe sadece bir kez yükler. • Linux kullanıcı modunda dinamik bağlamayı özel bağlayıcı kütüphane üzerinden gerçekleştirir. • Her dinamik bağlı program süreç başlayınca çağrılan küçük statik bağlı fonksiyonlar içerir. • Bağlantı kütüphanesini belleğe eşler. • Bağlantı kütüphanesi süreç tarafından ihtiyaç duyulan dinamik kütüphaneleri, değişken ve fonksiyon isimlerini belirler. • Paylaşımlı kütüphaneler konumdan bağımsız kod olarak derlenir, böylece herhangi bir yere yüklenebilirler. Dosya Sistemleri • Linux’un dosya sistemi kullanıcıya UNIX semantiğine uyan hiyerarşik bir dizin ağacı olarak görünür. • İçeride ise, çekirdek implementasyon detaylarını gizler ve çok sayıda dosya sistemini sanal dosya sistemi (VFS) adındaki bir soyutlama katmanı üzerinden yönetir. • Linux VFS nesne tabanlı ilkeler etrafında tasarlanmıştır ve dört bileşenden oluşur: • Bir dosya nesnesinin nasıl görüneceğini tanımlayan tanımlar kümesi • i-düğüm nesne yapısı bireysel bir dosyayı temsil eder. • Dosya nesnesi açık bir dosyayı temsil eder. • Süperblok nesnesi bütün bir dosya sistemini temsil eder. • d-girdi nesnesi bireysel bir dizin girdisini temsil eder. • Ayrıca nesneler üzerine bir işlemler kümesiyle bu nesneleri değiştiren bir yazılım katmanı da kullanılır. • Örneğin dosya nesne işlemleri (/usr/include/linux/fs.h içindeki struct file_operations’ da tanımlı) • • • • int open(. . .) — Bir dosya açar ssize t read(. . .) — Bir dosyadan okur ssize t write(. . .) — Bir dosyaya yazar int mmap(. . .) — Bir dosyayı belleğe eşler Linux ext3 Dosya Sistemi • Pek çok Linux dağıtımı tarafından hala kullanılmaktadır. • Belirli bir dosyaya ait veri bloklarını bulmak için BSD Hızlı Dosya Sistemine (Fast File System --FFS) benzer bir mekanizma kullanmaktadır. • extfs, ext2 dosya sistemlerinin yerini almıştır • ext4 ile uzantılar gibi çeşitli özellikler eklenmiştir ve daha geniş disk alanı yönetimine imkan vermektedir. • ext2fs ve FFS arasındaki ana farklar disk tahsis politikalarıyla alakalıdır. • FFS’ de, disk 8 KB bloklarla dosyalara tahsis edilir. Küçük dosyaları kaydetmek için bloklar 1 KB’ lık parçalara veya bir dosya sonunda kısmen doldurulmuş bloklara bölünür. • ext3 parçalar kullanmaz, tahsisi daha küçük birimlerde yapar. ext3 üzerindeki ön tanımlı blok boyutu; 1, 2, 4 ve 8 KB bloklar için destekle birlikte dosya sisteminin toplam boyutunun bir fonksiyonu olarak çeşitlenmektedir. • Ext3 disk üzerinde bir dosyanın mantıksal komşu bloklarını fiziksel olarak komşu blokların üzerine yerleştirilmek için tasarlanan küme tahsisi politikaları kullanır, bu sayede bir blok grubu üzerine tek bir işlemle çok sayıda disk bloğu için bir G/Ç isteğini gönderebilir. • Bir blok grubu içerisindeki serbest blokların bir bit haritasını barındırır, bir anda en az 8 blok tahsis etmek için serbest bayt arar. Ext2 Dosya Sistemi Blok Tahsis Politikası Günlüğe Kaydetme (Journaling) • ext3 ile geliştirilmiştir. Dosya sistemi güncellemeleri önce bir log dosyasına işlemler (transaction) biçiminde yazılır. • Log dosyasına bir kez girerse kaydedilmiş varsayılır. • Zamanla değişiklikleri yapmak için log dosyası işlemleri dosya sistemi üzerinde yürütülür. • Sistem çöktüğünde bazı işlemler günlükte bulunsa da dosya sistemine yerleştirilmemiş olabilir. Sistem tekrar faaliyete geçtiğinde tamamlanmalıdır. • Bir çökme sonrasında başka tutarlılık kontrolüne gerek yoktur. (eski yöntemlerden çok hızlıdır) • Rastgele G/Ç işlerini seri G/Ç işlerine dönüştürerek hard disklere yazma performansını arttırır. Linux Proc Dosya Sistemi • Verileri kaydetmez, onun yerine içeriklerini kullanıcının dosya G/Ç istekleine göre isteğe bağlı berimler. • proc mutlaka dosya içerikleriyle birlikte bir dizin yapısı gerçekleştirmelidir; ardından her dizin ve içerdiği dosyalar için özgün ve kalıcı bir i-düğüm numarası tanımlamalıdır. • Bir kullanıcı bir dosyanın i-düğümünden okumayı denerken veya dizin idüğümüne bakarken hangi işleme ihtiyaç duyulduğunu belirlemek için bu idüğüm numarasını kullanır. • Veriler bu dosyaların birinden okunduğunda proc uygun bilgileri toplar, yazı biçiminde şekillendirir ve talep eden sürecin okuma tamponuna yerleştirir. Girdi ve Çıktı • Linux aygıt tabanlı dosya sistemi iki önbellek üzerinden disk alanına erişir: • Veriler sanal bellek sistemiyle birleşmiş sayfa önbelleğinde önbelleklenir. • Metaveriler fiziksel disk bloğu tarafından indekslenen ayrı bir önbellek olan tampon önbelleğinde önbelleklenir. • Linux bütün aygıtları üç sınıfa ayırır: • Blok aygıtları tamamen bağımsız, sabit boyutlu veri bloklarına rastgele erişime izin verir. • Karakter aygıtları diğer çoğu aygıtı kapsar, düzenli dosyaların işlevselliğini desteklemek zorunda değildir. • Ağ aygıtları çekirdeğin ağ sistemi üzerinden arayüzlenirler. Blok Aygıtları • Bir sistem içindeki bütün disk aygıtlarına ana arayüzü sağlar. • Blok tampon önbelleği iki ana amaca hizmet eder. • Aktif G/Ç için bir tampon havuzu gibi davranır • Tamamlanmış G/Ç için bir ön bellek olarak hizmet eder. • İstek yöneticisi tampon içeriklerini bir blok aygıt sürücüsüne yazma/sürücüsünden okumayı yönetir. • Çekirdek 2.6 ile “Tamamen Adil Kuyruklama” (Completely Fair Queueing – CFQ) getirilmiştir. • • • • Şu anda da kullanılan zamanlayıcıdır. Asansör algoritmalarından temelde ayrışmaktadır. Ön tanımlı olarak her bir süreç için bir tane olmak üzere liste kümelerini barındırır. Bütün süreçlerden gelen yerine getirilmemiş bütün G/Ç arasında çevrimsel sırayla C-SCAN algoritmasını kullanır. • Her süreçten dört blok bir anda çalıştırılır. Aygıt – Sürücü Blok Yapısı Karakter Aygıtları • Sabit veri bloklarına rastgele erişim vermeyen bir aygıt sürücüsüdür. • Bir karakter aygıtı sürücüsü, sürücünün çeşitli dosya G/Ç işlemlerini gerçekleştiren bir fonksiyon kümesini kayıt ettirmelidir. • Çekirdek bir karakter aygıtına bir dosya okuma veya yazma isteğine ilişkin neredeyse hiçbir ön işleme yapmaz, sadece isteği aygıta iletir. • Bu kuralın genel bir istisnası; çekirdeğin standart bir arayüz yönetmesi için oluşturulan, terminal aygıtlarını gerçekleştiren karakter aygıt sürücülerinin özel bir alt kümesidir. • Çizgi düzeni (Line discipline) terminal aygıtından gelen bilgi için bir yorumlayıcıdır. • En yaygın çizgi düzeni tty düzenidir. tty terminalin veri akışını standart girdiye ve kullanıcının çalışan süreçlerinin çıktı akımlarına yapışıtırır. Bu sayede süreçler kullanıcı terminail ile doğrudan iletişime geçebilirler. • Çok sayıda süreç aynı anda çalışabilir, süreçler kullanıcı tarafından askıya alındıkça veya uyandırıldıkça terminale bağlanan süreçlerden gelen girdi ve çıktıları terminale ekleme ve çıkarmadan tty sorumludur. • Geliştirilmiş diğer çizgi düzenlerinin kullanıcı süreçlerine G/Ç ile alakaları yoktur. (örn. PPP ve SLIP ağ protokolleri) Süreçler Arası İletişim • UNIX gibi, Linux da süreçleri sinyallerle bilgilendirir. • Sinyaller sınırlı bir sayıdadır ve bilgi taşıyamazlar. Bir süreç ancak sinyalin oluştuğunu bilebilir. • Linux çekirdeği çekirdek modunda çalışan süreçlerle iletişim için sinyaller kullanmaz, onun yerine çekirdek içi iletişim zamanlayıcı durumları ve wait_queue yapılarıyla gerçekleştirilir. • “System V UNIX” semaforlarını da kullanır. • Süreçler bir sinyal veya semafor için bekleyebilir. • Semaforlar daha iyi ölçeklenir. • Çoklu semaforlar üzerindeki işlemler atomik olabilir. Süreçler Arasında Veri Geçme • Boru mekanizması bir çocuk sürecin annesiyle bir iletişim kanalına sahip olmasına müsaade eder. Borunun bir ucundan yazılan veri diğer uçtan okunabilir. • Paylaşımlı bellek de iletişim için çok hızlı bir yöntemdir. • Senkronizasyonu sağlamak için paylaşımlı bellek bir başka süreçler arası iletişim mekanizmasıyla birlikte kullanılmalıdır. Ağ Yapısı • Ağ iletişimi Linux işlevselliği açısından can alıcı bir noktadır. • UNIX’ ten UNIX’ e iletişim için standart Internet protokollerini destekler. • UNIX dışı işletim sistemlerine özgü protokolleri de gerçekleştirir. Özellikle PC ağlarında kullanılan Appletalk ve IPX gibi • Dahili olarak, networking in the Linux çekirdeğindeki ağ iletişimi üç yazılım katmanı ile gerçekleşir: • Soket arayüzü • Protokol sürücüleri • Ağ aygıt sürücüleri • Linux ağ iletişimi sistemindeki en önemli protokol kümesi Internet protokol takımıdır. • Ağ üzerindeki herhangi bir yerde farklı sunucular arasındaki dolaştırmayı (routing) gerçekleştirir • UDP, TCP ve ICMP protokolleri dolaştırma protokolünün üzerine inşa edilir. • Paketler ayrıca ateş duvarı kurallar zinciri tabanlı filtreleme için ateş duvarı yönetimine iletilirler. Güvenlik • Linux’ da takılabilir doğrulama modülleri sistemi bulunmaktadır. (pluggable authentication modules-PAM) • PAM; kullanıcıları doğrulaması gereken herhangi bir sistem bileşeni tarafından kullanılabilecek paylaşımlı bir kütüphaneye dayanmaktadır. • Linux da dahil olmak üzere UNIX sistemlerinde erişim denetimi özgün nümerik tanımlayıcı kullanımı üzerinden yürütülmektedir. (uid ve gid) • Erişim denetimi nesnelere hangi erişim modlarının (okuma, yazma, çalıştrma) sahip, grup veya genel erişimle hangi süreçlere verileceğini belirleyen bir koruma maskesi atanarak yapılır. • Linux, UNIX’ in setuid mekanizmasını iki yolla güçlendirmektedir. • POSIX’ in bir sürecin tekrar tekrar kendi kullanıcı kimliğini bırakıp yeniden elde etmesine izin veren kaydedilmiş kullanıcı kimliği (user-id) mekanizmasını gerçekleştirir. • Etkili kulanıcı kimliğinin haklarının bir alt kümesini veren (grant) bir süreç karakteristiği de eklenmiştir. • Linux bir istemciye başka ayrıcalıklar vermeden tek bir dosya veya bazı sunucu süreçlerine seçici erişim izni veren bir başka mekanizma sağlamaktadır. Android • Linux çekirdeği tabanlıdır, çok az sayıda yenilik içermektedir. • Açık kaynaklı bir platformdur, çok çeşitli cihazlar için özelleştirilebilir. • Telefon, tablet, TV vd. tüketici ürünlerinin yanı sıra grafiksel kullanıcı arayüzü (GUI) gerektiren VOIP telefonlar, akıllı saatler, otomobil içi mini bilgisayarlar, medikal cihazlar vb. sistemlerde gömülü işletim sistemi olarak kullanılmaktadır. • İşletim sisteminin büyük bir kısmı Java ile yazılmıştır. Çekirdek ve çok sayıda düşük seviye kütüphaneler C ve C++ ile yazılmıştır. • Uygulama için API desteği Java üzerinden verilmektedir. Android ve Google • Açık kaynak kodlu ve kapalı kaynak uygulamaları birleştirmektedir. • Android Açık Kaynak Projesi (AOSP) ile herkes açık kaynak kısmına erişebilir, değişiklikler yapabilir. • Uyumluluk Tanımı Dökümanı (CDD) ile Android sistemlerin üçüncü parti uygulamalarla uyumluluk için nasıl davranması gerektiği açıklanmaktadır. • Google Android’ i çok çeşitli kapalı kaynak kodlu bulut hizmetlerini (Gmail, takvim, buluttan cihaza mesajlaşma) destekleyecek şekilde geliştirmiştir. • Google Play Android uygulamaları için Google’ ın açtığı çevrimiçi mağazadır. • Google Play; uyumluluk için Android içeren cihazların UDD uyumlu olması ve bir uygulamanın ihtiyaç duyduğu bütün cihaz özelliklerini bilmesi (bu sayede bir uygulama eksik özellikli bir cihazda çalışmayacaktır) mekanizmalarını kullanır. Android Tarihçesi • Android Inc. 2004’ de bir girişim olarak Android projesini başlamıştır. • Google bu girişimi 2005’ te satın alarak şu anki Android platformunun neredeyse bütün geliştirilme aşamalarını bizzat yönetmiştir. • İlk tasarımlarda sistemin dayandığı platformun çok azı geliştiricilere açıktı. Platform genelde bütün sistemi ve uygulamaları sunucu bilgisayar üzerindeki tek bir süreçmiş gibi çalıştıran «simülatör» bir sürecin içinde çalışıyordu. • Eski geliştirme sürümünün Application.onTerminate() metodu gibi bir takım kalıntıları hala Android SDK içinde mevcuttur. Android 1.0 • Eylül 2008’ de T-Mobile G1 cihazında çalışacak şekilde yayınlanmıştır. Tam bir Android cihaz sistem imajı ve temel uygulamalar ve geliştirme ortamı çalıştıran bir donanım cihaz emülatöründen oluşmaktaydı. Daha Sonraki Geliştirme • Orijinal CDD sadece T-Mobile G1 gibi cihazlara uyumluluk veriyordu. Sonraki yıllarda uyumlu cihaz sayısı aşırı miktarda arttı. • 2009 boyunca Android 1.5 – 2.0 arası sürümlerde fiziksel klavye ihtiyacını kaldıran ekran klavyesi, çok daha kapsamlı ekran (QWGA’ dan WVGA’ ya kadar) desteği, cihazların hangi donanım özelliklerini desteklediklerini rapor etmeleri ve uygulamaların hangi uygulama özelliklerine ihtiyaç duyduklarını belirtmeleri için «sistem özellik» birimi eklenmiştir. Google Play son bahsedilen mekanizmayı uygulama uyumluluğunu belirlemek için kullanmaktadır. • 2011 boyunca Android 3.0 – 4.0 arası sürümlerde 10 inç ve daha geniş tabletler için platform desteği getirilmiştir. Temel platform artık desteklenen bütün cihazların ekran boyutlarını desteklemektedir. (QVGA’ dan 10 inç ve üstü tabletlere kadar) • Bütün bunlara ek olarak zamanla Google TV, oyun cihazları, dizüstü bilgisayarlar, fotoğraf makineleri, giyilebilir cihazlar vb. olmak üzere derin bir donanım çeşitliliği desteği eklenmiştir ve hala eklenmektedir. Tasarım Hedefleri • Mobil cihazlar için bütünüyle açık kaynaklı bir platform sağlamak. Android’ in açık kaynak kısmı tam bir ürün olarak pazarlanabilecek çeşitli uygulamalar içeren bir aşağıdan yukarıya işletim sistemi yığıtıdır. • Sağlam ve stabil bir API ile kapalı kaynak üçüncü parti uygulamalara güçlü destek sağlama. Android bunun için çeşitli teknik çözümler kullanmaktadır. • Google’ ınkiler dahil olmak üzere bütün üçüncü parti uygulamaların rekabet edebilmeleri için mümkün olduğunca nötr bir yapı oluşturmak • Kullanıcıların üçüncü parti uygulamalara derin bir güven duymalarını zorunlu kılmayacak bir güvenli modeli sağlamak. Kullanıcıların daha az güvene ihtiyaç duyması, deneyecekleri uygulamalar açısından daha fazla özgürlük sağlayacaktır. Tasarım Hedefleri • Çoğu uygulamada az vakit harcamak şeklinde tipi bir mobil kullanıcı etkileşimi desteği. Genel olarak bir Android uygulamasının çalıştırılmaya başlanmasından 200 ms sonra tam etkileşimli kullanıcı arayüzü görüntülenmesi amaçlanmaktadır. • Uygulama süreçlerini yöneterek kullanıcıların uygulama deneyimlerini basit hale getirmek. Mobil sistemlerde takas alanı genelde kullanılmadığından, bellek yönetimi için sistemin süreç yönetiminde daha proaktif bir tutum sergilemesi gerekir. • Uygulamaların zengin ve güvenli yollarla birlikte çalışmaları ve katkı yapabilmelerini teşvik etmek. Mobil uygulamalar daha ufak ve belirli ihtiyaçlara yönelik kullanımlar için tasarlandığından işletim sistemi daha büyük bir bütün oluşturmaları için çok sayıda mobil uygulamanın katkıda bulunabileceği yeni hizmet türleri sağlamalıdır. • Tamamen genel amaçlı işletim sistemi oluşturmak. Android’ in tasarımı en az geleneksel bir işletim sistemi gibi yetenekli olmaya yetecek kadar zengin olmalıdır. Android Mimarisi • Standart Linux çekirdeğinin üzerine kurulmuştur. • Kullanıcı uzayında geleneksel Linux dağıtımlarından oldukça farklı yollarla çoğu Linux özelliğini kullanmaktadır. • Android’ in init sürecinin başlattığı daemonlar yüksek seviyeli kullanıcı hizmetlerindense dosya sistemi ve donanım erişimi gibi daha düşük seviye detaylara yoğunlaşır. • zygote daha yüksek seviyeli Java dili süreçlerinin köküdür. • Android aygıtında kabuk erişimi için konsol kullanılmadığından init bir kabuğu geleneksel yolla çalıştırmaz. adbd daemon süreci uzak bağlantıları dinler ve istediklerinde kabuk süreçlerini onlar için oluşturur. • zygote sürecinin başlattığı ilk süreç bütün temel işletim sistemi hizmetlerini içeren system_server sürecidir. Diğer süreçler zygote tarafından oluşturulur. • Uygulamalar işletim sistemiyle Android çerçeve yapı (framework) olarak belirtilen kütüphanelere sistem çağrıları üzerinden etkileşime geçer. Android Süreç Hiyerarşisi Uygulama süreçleri Sistem süreçleri Daemonlar Linux Uzantıları • Mobil cihazlarda ekran kapatılması cihazı uykuya alıyor gibi görünse de gerçekte uyku istenmeyen bir durumdur. Cihazın ekranı kapansa da telefon çağrısı alma, mesajlar, bildirimler vb. bir sürü arka plan işinin yürütülmesi gerekir. • CPU’ nun uyuması boşta bekleme durumunda tutarak engellenebilir ancak gerçek uykuya nazaran daha fazla enerji tüketecektir. • Uyandırma Kilitleri: Askıya alma engelleyici olarak da bilinen sistemin nasıl uykuya geçeceğini yöneten mekanizmadır. Sistemin ekranı kapama gibi harici bir kullanıcı hareketine bağlı olmaksızın derin uykuya geçmesine izin verir. Cihaz çalışıyorken uykuya geçmeden alıkoymak için bir şeylerin uyandırma kilidini tutması gerekir. • Ekran açık olduğunda sistem daima bir uyandırma kilidini tutar. Ekran kapandığında sistemin kendisi genellikle bir uyandırma kilidi tutmaz, başkaları kilit tuttuğu müddetçe uyumayacaktır. Eğer hiçbir kilit tutulmuyorsa sistem uykuya geçer ve ancak bir donanım kesmesiyle uyandırılabilir. Linux Uzantıları • Yetersiz Bellek Yok Edici: Belleğin aşırı düşük olduğu anlarda bellek kazanmaya çalışan mekanizmadır. • Çağdaş işletim sistemlerinde yetersiz bellek durumu sayfalama ve takas sayesinde çok karşılaşılan bir durum değildir. Linux’ da son çare olarak kullanılırken, Android bellek yönetimi için kritik öneme sahiptir. • Cihazda kullanılabilir bellek azaldıkça oom_adj parametresi süreçler en yüksek olanından başlayarak sırayla öldürülerek bellek kazanılır. Dalvik • Android üzerindeki Java dili ortamını yürütür. Java kullanan her bileşeni çalışıtırır. • Uygulamalar Java ile yazıldıktan sonra bayt kodlar Dalvik bayt koduna (bytecode) dönüştürülür. • Her uygulama kendi Linux sürecini kendi Dalvik ortamında çalıştırır. İzolasyon bu şekilde sağlanır. • Java ortamını başlatmak 200 ms’ den çok daha fazla zaman alacağı için zygote «daemonu» Dalvik süreçlerinin arka planda oluşturulmasından sorumludur. • zygote çeşitli Dalvik süreçleri tarafından kullanılabilecek ortak bellek sayfalarını paylaştırarak bellek optimizasyonu da sağlar. «Binder» Mekanizması • Android sistemlerde kritik önemi olan süreçler arası iletişim için zengin bir birimdir. • Binder mimarisi Linux’ a kabiliyet bazlı güvenlik modeli getirmektedir. Her Binder nesnesi bir kabiliyettir. Başka bir sürece bir nesne göndermek o kabiliyeti o sürece vermektir. • Alıcı süreç nesnenin sağladığı ne özellik varsa kullanabilir. • Bir süreç başka bir sürece bir nesne gönderebilir, ardından herhangi bir süreçten nesne alabilir ve alınan nesnenin gönderdiğiyle tamamen aynı olup olmadığını belirleyebilir. «Binder» Mimarisi «Binder» Çekirdek Modülü • Kendi süreçler arası iletişim mekanizmasını kullanan bir modüldür. • Uzaktan yordam çağrılarıyla mesaj tabanlı bir iletişim sağlar. • Bu mesajlara «transaction» da denmektedir ve daha üst seviyede süreçler arası bir fonksiyon çağrısı olarak da görülebilir. • Kullanıcı uzayının çekirdeğe gönderdiği her «transaction» noksansız bir faaliyettir, iletilen bütün veri kadar faaliyetin hedefini ve gönderenin kimliğini tanımlar. • Çekirdek o «transaction» muhatabı uygun süreci belirler ve süreçteki bekleyen bir ipliğe iletir. Android Uygulamaları • Aslında bir zip arşivi olan .apk uzantılı dosyalardır. Bu dosyanın önemli bileşenleri: • Uygulamanın ne olduğunu, ne yaptığını ve nasıl çalıştırılması gerektiğini tarif eden bir «manifest» • Uygulamanın ihtiyaç duyduğu kaynaklar • Java kodunun kendisi (doğal kütüphane veya Dalvik baytkodu olabilir) • Yazarı güvenli bir şekilde tanımlayan imza bilgisi • Uygulamaların diğer programlar gibi tek giriş noktası olmayıp, manifest içerisindeki <application> etiketinde belirtilen farklı giriş noktaları olabilir. Bu sayede uygulamalar farklı temel davranış türlerine göre başlayabilirler. • Paket yöneticisi, uygulama paketlerinin yüklenmesi, kaldırılması ve haklarında bilgi edinilmesinden sorumludur. • Aktivite yöneticisi aktivite dışındaki diğer davranış türlerinin de çalışması ve uygun davranış sergilemesinden sorumludur. Aktiviteler • Bir uygulamanın kullanıcı arayüzünü üzerinden kullanıcıyla doğrudan etkileşime geçen kısmıdır. • İlk aktiviteye ana aktivite (MainActivity) denir. • ActivityRecord ile uygulamanın o anda hangi aktiviteyi çalıştırdığının bilgisi süreçte yer alır. Böylece sürecin durumu değişince en son çalıştırılan aktiviteye geri dönülebilir. • Aktivite ön planda değilken sistem aktivitenin durumuna ilişkin küçük miktardaki bilgiyi system_server sürecine kaydeder. Hizmetler • Müstakil uzun zaman boyunca çalışan arka plan işi olabilir. Arkadan müzik çalması, aktif bir ağ bağlantısının korunması, kullanıcı başka bir iş yapıyorken verilerin indirilmesi/karşıya yüklenmesi vb. örnekler verilebilir. • Uygulama ile zengin etkileşime geçmek için sistem veya diğer uygulamalar için bir bağlantı noktası olarak da çalışabilir. Bu şekilde uygulamalar diğer uygulamalar için görüntü veya ses işleme, yazıyı konuşmaya çevirme vb. işler için güvenli API sağlayabilir. Alıcılar • Genelde arkaplanda ve normal kullanıcı etkileşimi dışında oluşan (genelde harici) olayların alıcı tarafıdır. • Kavramsal olarak bir uygulamanın ilginç bir şey (olayı almak için uygulamanın çalışıyor olması gerekmeyen) olduğunda bir geri dönmeyi açık olarak kayıt etmesiyle (callback) aynıdır. • Sadece tek atışlık işlemler olarak çalışırlar. Bir olay olduğunda sistem onunla ilgilenen herhangi bir alıcıyı bulur, olayı ona iletir ve olay tüketildiğinde işleri biter. • Herhangi bir alıcı kaydı yapısı yoktur, çünkü bir alıcı bir yayın boyunca geçici olan bir varlıktır. Bir alıcı bileşene her yeni bir yayın yapıldığında alıcı sınıfının yeni bir nesnesi oluşturulur. İçerik Sağlayıcılar • Uygulamaların kendi aralarında veri değiş tokuşu için kullandıkları ana mekanizmadır. • E-posta uygulamasında, içerik sağlayıcı uygulama yetkilisinin com.example.email.provider.email olduğunu belirtir. Böylece bu içerik sağlayıcı üzerinde çalışan URI’ lar content://com.example.email.provider.email/ ile başlamaktadır. O URI’ nın son eki içerisinde hangi verilere erişildiğini belirlemek için sağlayıcının kendisi tarafından yorumlanır. • Yine aynı örnekte content://com.example.email.provider.email/messages bütün eposta mesajlarını listeleme anlamına gelmekte ve content://com.example.email.provider.email/messages/1 1 anahtar numaralı bir mesaja erişim sağlamaktadır. • Uygulamalar bir içerik sağlayıcıyla etkileşime geçmek için daima ContentResolver adındaki bir sistem API kullanırlar. En fazla kullanılan ContentResolver metodlarından biri sonuçları Cursor şeklinde döndüren veritabanı sorgusudur. • Mesela bütün kullanılabilir e-postaların özetini elde etmek için query("content://com.example.email.provider.email/messages") kullanılabilir. Niyetler (Intents) • Android’ in aktiviteleri, alıcıları ve hizmetleri keşfetme ve tanımlamada kullandığı mekanizmadır. Bazı yönleriyle Linux kabuğunun arama yoluna benzer. • Harici niyetler tek bir özel uygulama bileşenini doğrudan tanımlarlar. • Dahili niyetler istenen bileşenin kendisini değil de karakteristiğini tanımlarlar. Dahili bir niyetle eşleşen bileşeni bulma sürecine niyet çözülmesi (intent resolution) denir. Güvenlik • Kullanıcı kimlikleri (UID) güvenlikte kullanılan önemli bir bileşendir. • Android sistemin alt seviye kısımları için standart sayıda UID tanımlar; çoğu uygulamalara dinamik olarak bir UID, ‘‘uygulama UID’ leri’’ arasından ilk açılışta veya kurulum anında atanır. • Bir uygulamaya ilk olarak UID atandığında onun için kendi UID’ si tarafından dosyaları sahiplenilen yeni bir kayıt dizini oluşturulur. Uygulama özel dosyalarına sıkıntısız erişebilir, ancak başkalarının dosyalarına erişemez, başkaları da onun dosyalarına erişemez. • Bu da uygulamalar arası veri aktaran içerik sağlayıcıları oldukça önemli kılar. • UID 1000 ile çalışan sistemin kendisi bile uygulamaların dosyalarına dokunamaz. Bu yüzden «installd» daemonu vardır. Bu daemon özel ayrıcalıklarla diğer uygulamalar için dosya ve dizin oluşturabilir, bunlara erişebilir. • installd’ nin paket yöneticisine sağladığı uygulamaların ihtiyaca bağlı olarak veri dizinlerini oluşturup yönetmesi için verdiği çok kısıtlı bir API vardır. Süreçleri Başlatmak • Aktivite yöneticisi yeni süreçler başlatmak için mutlaka zygote ile iletişim kurmalıdır. • Aktivite yöneticisi ilk çalıştığında zygote ile özel atanmış bir soket oluşturur, bir süreci başlatmak istediğinde bunun üzerinden bir komut gönderir. • Komut ilk olarak oluşturulacak kum havuzunu (sandbox) tanımlar, kum havuzundan kastedilen çalışması gereken yeni sürecin kullanıcı kimliği ve diğer güvenlik kısıtlamalarıdır. • zygote bu nedenle kök olarak çalışmalıdır, süreç oluşturduğunda çalışacağı kullanıcı kimliği için uygun kurulumu yapar. Son olarak kök ayrıcalıklarını düşürerek sürecin kullanıcı kimliğine arzulanan kimliği atar. Süreç Başlatma Adımlarının Gösterimi Sürecin Hayat Döngüsü • Aktivite yöneticisi süreçlere ne zaman ihtiyaç duyulmayacağını belirlemekten sorumludur. Bütün aktivitelerin, alıcıların, hizmetlerin ve bir süreçte çalışan içerik sağlayıcıların takibini yapar, bundan yola çıkarak bir sürecin ne kadar önemli olup olmadığını belirleyebilir. • Uygulama geliştiricileri farklı uygulama bileşenlerinin sürecin ömrünü nasıl etkilediklerini anlamaları çok önemlidir. Eğer dikkat edilmezse sistem süreci önemli bir iş yapıyorken öldürmesi söz konusu olabilir. • Android’ de uygulama süreçleri asla temiz bir şekilde çıkış yapmaz. Sistem gereksiz süreçleri ortada bırakır, çekirdeğin ihtiyaç duyulduğunda onları kaldırmalarına bel bağlar. • Önbellekli süreçler çoğu şekilde Android’ in eksikliği olan takas alanının yerini alır. Eğer bellek ihtiyacı olursa önbellekli süreçler aktif bellekten atılabilir. Eğer bir uygulama sonradan çalıştırılmak istenirse dönülmesi gereken herhangi bir önceki durumdan devam ederek yeni bir süreç oluşturulabilir. • Sahne gerisinde işletim sistemi ön plandaki işlerin çalışmaya devam etmesi ve önbelleklenen işlerin muhafaza edilmesi için ihtiyaç duydukça süreçleri başlatır, öldürür ve yeniden başlatır. Süreç Bağımlılıkları • Süreçler arası bağımlılık hem içerik sağlayıcılar (sağlayıcıya basit erişim üzerinden) hem de hizmetlerle (bir hizmete bağlayarak) olabilir. • Her iki durumda da işletim sistemi bu bağımlılıkları takip etmeli ve süreçleri uygun şekilde yönetmelidir. • Bağımlılıklar; süreçlerin ne zaman oluşturulacağını ve sürecin hangi oom_adj önemlilik değerine sahip olacağını etkiler. Bir sürecin önemi ona bağımlı olan en önemli sürecin önemindedir. • Her sürecin nihai önemini hesaplamak için sistem bu süreçler arasında bir bağımlılık çizgesi oluşturmalı ve yönetmelidir. • Bir süreç için bağımlılık çizgesi boyunca ilerlemek onun bütün içerik sağlayıcıları, hizmetleri ve onların kullanan süreçleri üzerinde ilerlemeyi içerir. Daha Fazlası İçin • Android işletim sistemi hakkında çok daha fazla konu Google Android dökümantasyonunda güncel haliyle açıklanmaktadır. • https://developer.android.com/guide/