UNIX, Linux ve Android

advertisement
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/
Download