Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 10 - İşletim Sistemleri



Merhaba arkadaşlar bölüm sonu canavarına geldik. 3. sınıf 2. dönemi cehenneme çeviren bu ders okulun belki de en zor dersidir, bir sürü projesi bulunur ve bu projelerden alınan notlar 100, 30 ve 0'a fikslenmiştir. 

Bu ders mühendisi yazılımcıdan ayıran başlıca derstir diyebiliriz. 

CS 342 - Operating Systems

Üçüncü yazıda "Abstraction" yani "Soyutlama"dan bahsetmiştik. Soyutlama ile beraber bilgisayarın içi hakkında önemli derecede bilgi sahibi olup işe yaramayan kısımları ise kara kutu olarak düşünüp sadece işlevini bilip geçiyorduk. 

Aynı şekilde işletim sistemleri de bilgisayardaki düşük seviye yazılımları kullanıcıdan hatta programcıdan soyutlamaya yarıyor. Diyelim bir oyun yazacağız. Oyunu açınca bilgisayarın RAM'inde oyun için yer açılır, oyunun dosyaları harddiskten RAM'e aktarılır, bilgisayar ekranında yeni bir pencere açılıp oyunun ana menüsü buraya yüklenir, oyun kapanınca da oyunun bilgileri RAM'den silinir. Sizce bunları yazılımcılar tek tek yazıyor mudur? Hayır. Bu ve bu tip düşük seviye işleri işletim sistemi kendi yapar, sizden de bunu saklar. Yazılımcı tutup da bilgisayarın tüm RAM'ini kendi oyunuyla dolduramaz yani. Bir açık bulup bunu yaparsa ona HEÇKIR denir. Tabii bu windows için geçerli. Windows işletim sisteminin kodunu görüp değiştirmenize izin vermez. O yüzden bu dersin projelerini Linux isimli (daha doğrusu tabanlı) açık kaynak kodlu işletim sisteminde yaparsınız. İyi heçkırlıklar.


Bilgisayarda soyutlama katmanları bunun gibi bir şeydir. Hardware dediğimiz klavye mouse ekran bilmemneye erişimi olan "Device drivers" (laptopa format attığınızda cd'sini bulup kurduğunuz şey) ve saz arkadaşları bizden "Kernel" denilen "OS layer" yani "OS katmanı" ile soyutlanmıştır. Bu derste de bu OS katmanını programlarız.

OS nasıl çalışır?

Bilgisayar açıldığında RAM tamamen boştur, harddiskin ilk birkaç segmesindeki program çalışır, buna "bootloader" denir, bu bootloader işletim sisteminin bir bölümünü RAM'e yükler ve işi ona devreder. 

Yani bilgisayar açılınca bootloader'daki değişmez kod çalışır, o da artık harddiskte hangi işletim sisteminin kodu varsa alır onu yükler. Sonra işletim sisteminin kodu çalışır print("Selam ben linux") ekranaHoşgeldinizYazısıBastır(); gibi.

Sonra işletim sistemi bilgisayarın devamlı çalışmasına yarayan kodları yükleyip çalıştırmaya başlar. Bir yandan bu kodlar çalışır, bir yandan siz çalışırsınız. Nasıl oluyor bu?

Arka planda tek bir programın / görevin çalışmadığını zaten biliyorsunuz, bilmiyorduysanız ctrl + alt + delete 'e basıp kendiniz görebilirsiniz. Dördüncü yazıda gördünüz ki bir CPU aynı anda sadece bir programı okuyup işlem yapabilir. Peki nasıl oluyor da aynı anda bu kadar program çalışabiliyor arkada?

Öncelikle günümüzde artık bilgisayar birkaç çekirdekli. Dört çekirdekli bilgisayar demek tek CPU'da / işlemcide program çalıştırabilecek dört tane birim var demek. Dördüncü yazıda gördüğünüz o FETCH DECODE bilmemne aynı anda dört yerde oluyor yani. Böylece dört program gerçekten aynı anda çalışabiliyor.

Fakat bu bir sürü programın aynı anda çalışması için yeterli değil. Bir sürü programı aynı anda çalıştırmak için işletim sistemi context switch denilen içerik değiştirme metodunu kullanıyor. Yani bir programı durduruyor, başkasını çalıştırmaya başlıyor, bunu yaparken de CPU'nun FETCH edeceği kod değişmiş oluyor. 

Şimdi atıyorum elimizde şu programlar var:

Windows 10 
Microsoft Word (bunun yerine ben Kingsoft WPS kullanıyorum öneririm)
Dropbox / Google Drive / Herhangi bir bulut programı
Google Chrome
Antivirus

Önce google chrome kısayoluna basıyorsunuz biraz internette takılacaksınız, kısayola bastığınız anda context switching oluyor ve antivirusünüzün kodu çalışmaya başlıyor, if (thisIsNotVirus()) { boşver(); } şeklinde tıkladığınız şeyin virüs olup olmadığını kontrol eden bir kod çalışıyor. Eğer virüs falan yoksa antivirüs CPU'yu geri salıyor başkası ne yaparsa yapsın diye. Bu arada Dropbox bir tur da bana ver deyip araya giriyor ve kendi if(yeniDosyaYüklüMü()) kodunu çalıştırıyor, yüklenmemişse CPU'yu geri salıyor. Chrome yeni pencere açıyor. Bir internet sitesine giriyorsunuz. İnternet sitesi siteden yanıt beklerken Windows 10 araya giriyor ve pis işlerle uğraşıyor. Ardından canınız sıkıldı diyelim Microsoft Word'e tıklıyorsunuz. Windows 10 "Aha bu bir şeylere bastı" diyerek tüm diğer işleri durdurup en hızlı bir biçimde Microsoft Word'u açmaya çalışıyor ki kullanıcı "Bilgisayarım hızlı" izlenimine kapılsın. Word'de bir şeyler yazmaya başlıyorsunuz, yazdıkça windows 10 durup her şeyi bırakıp ekrana harfleri basıyor. Sonra kaydediyorsunuz. Fakat hafıza yavaş çalışan bir şey, dördüncü yazıda anlatmıştım. Siz kaydolmasını beklerken (gerçi fazla beklemiyorsunuz da) windows 10, dropbox, antivirus hepsi bir olup "Hafızadan cevap gelene kadar ben işlerimi yapayım" diyor ve sıra sıra bir sürü işlem yapıyorlar. Context switching mantığı bu.

Bilgisayarınız donduğunda ve yavaşladığında muhtemelen bilgisayarınızda CPU'nuzun halledemeyeceği ve RAM'inizin hafızada tutamayacağı kadar işlem açıktır ve işletim sisteminiz telaşla bunları bitirmeye uğraşmaktadır o sırada sizin işlemlerinize düşük öncelik verir, siz de bilgisayarım bozuldu sanırsınız.

*

Buraya kadar anlattığım kısımda programlar hep "benim işim uzayacak sen geç istersen" mantığıyla çalıştı. Ya peki Eminönü'ndeki baklava izdihamında olduğu gibi programlar en önden hiç ayrılmazlarsa? Ya siz bilgisayarın başında sürekli bir şeylere basıp bilgisayarı trollerseniz ve bilgisayar kendi işlerini yapamazsa?

Bunun için scheduling isimli işlemci zamanlama metotları geliştirilmiş. Bilgisayar bazen en acil işi, bazen en epeydir yapılmayan ve hakkı yenen işi, bazen birbirine bağlı işleri, bazen ise rastgele herhangi bir işi işlemciye alır (eskisini ise geçici olarak durdurur) ve onu çalıştırmaya başlar. Scheduling'in çeşitli teknikleri var ama fazlasını anlatmayacağım, merak edenler okusun.

*

Yukarıda birbirine bağlı işlerden bahsettim (çıtlattım). Bazı programlar aynı dosyaları okuyup yazar, dolayısıyla bunların zamanlaması sıkıntılıdır. Örneğin A programı ve B programı var, bunların ikisi aynı dosyaya yazı yazıyor. İkisi aynı anda aynı dosyaya yazı yazamıyor, birinin yazarken öbürünün oturması gerek. Bilgisayarın zamanlama kuralı şu: A programı HAZIR olduğu anda araya girip çalışmaya başlasın yani A'nın önceliği maksimum.

Bu durumda ne oluyor? B programı dosyaya yazarken A programı hazır oluyor ve devreye giriyor. A programı bakıyor dosya yazmaya müsait mi, "Haa B yazıyormuş." diyor. Fakat o an A programı hala hazır olduğundan ve kural "A programı hazırsa çalışsın" olduğundan A bir daha bakıyor dosya müsait mi, değil diyor. A bu kontrolü sonsuza kadar yapıyor, B'ye işi bırakmıyor ki adam bitirsin. Buna deadlock deniyor, yani sırası gelen program bağlı olduğu program işini bitirmediği için çalışmak istiyor çalışamıyor fakat sırasını da salmıyor. 

Tabii bunun çeşitli çözümü var, A'yı dosya yazamayınca uyutmak gibi. Tabii bu da sıkıntılar doğuruyor. Ders sıkıntılar silsilesiyle ilerliyor.

Bununla ilgili popüler ve eğlenceli bir örnek olan Dining Philosophers Problem yani "Makarna Yiyen Düşünürler Problemi"ni sizinle paylaşayım.



N tane filozofumuz var (N > 2) ve bunlar bir masada salçalı makarna yiyor (üniversite öğrencisi galiba bunlar) ama bunu sadece iki çatalları olduğu zaman yapabiliyorlar. Yemekten başka bir de düşünüyorlar. Yeterince düşündükten sonra acıkıp yiyorlar, yeterince yedikten sonra da çatalları bırakıp düşünüyorlar.

Fark ettiğiniz üzere hepsi aynı anda yiyemez, yan yana olan iki düşünür de aynı zamanda yiyemez. 

Hatalı çözüm:

Herhangi bir düşünür kodu: (her düşünürde bu kod var ve zamanlayıcı bunları sıra sıra çalıştırıyor)

while (true) {
    düşün();
    solÇatalıAl();
    sağÇatalıAl();
    ye();
    solÇatalıBırak();
    sağÇatalıBırak();
    geğir(); // tamam kötüydü
}

böyle oldu diyelim, birinci düşünür solÇatalıAl();'ı çalıştırdı o anda zamanlamayıcı çalıştı ikinci filozofa geçti, o da sol çatalı aldı. Hepsi sırayla sol çatalı aldı ve zamanlayıcı birinci filozofa geri döndü. 

Bu durumda herhangi bir sağÇatalıAl(); kodu çalışabilir mi? Tüm filozoflar solundaki çatalı aldıysa hayır çalışamaz çünkü N filozof için masada N tane çatal var.

Hiçbir sağÇatalıAl(); kodu çalışamayacağı için deadlock olur ve bilgisayar mavi ekran verir. (Not: Bu kodun herhangi bir yerinde "sağ çatalı alamıyorsan solu da bırak başkası yesin" diye bir şey yok dikkatinizi çekerim. Dolayısıyla kod sağÇatalıAl();'dan başka bir yere atlayamıyor kafasına göre.)

Bu problemi 1965'te Dijkstra isimli önemli bir bilgisayar bilimcisi hoca üniversitede sınava hazırlık egzersizi olarak vermiş. Sonra problem almış yürümüş oradan. Dijkstra'nın bulduğu çözümü burada anlatacağım ama size derste daha güzel ve verimli, fakat burada anlatması zor bir çözüm anlatacaklar :)

Dijkstra çatallara numara verelim demiş.


Kural şu "Her filozof önce en küçük numaralı çatalı alsın. Alamıyorsa yemekten vazgeçsin."

Bu durumda biri hariç herkes solundaki çatalı alacak, 1 ile 5 arasında kalan filozof ise hiçbir çatalı alamayacak. Böylece 4 ile 5 arasında kalan filozof iki çatalı da alıp yemeğini yiyebilecek ve çatalları bırakacak. Sonra öbürü, sonra öbürü. En sonunda herkes yemek yiyebilmiş olacak. 

Vikipediye göre bu çözüm çok fazla çatal alıp bırakma içerdiği için karmaşık sistemlerde verimsiz. (Bu kısmı ben de tam anlamadım, vikipediye yazan adam kısa geçmiş, verdiği kaynak da para istiyor.) Bu probleme daha güzel çözümler var elbet, fakat üşendiğim ve yazıyı da gereksiz yere uzatmak istemediğim için anlatmayacağım. Merak edenler için anahtar kelimeler philosophers dining problem ve semaphore

*

Dersin geri kalanında da Hafıza yapısı anlatılır. Atıyorum yeni bilgisayar aldınız ve içini beş megabytelık flaş oyunlarla doldurdunuz. Sonra büyüdüm ben diyip hepsini sildiniz. Bilgisayarınızın orasında burasında 5 megabytelık boşluklar kaldı. Boşluklar ardışık olmadığı için 50 gigabytelık GTA V'yi yükleyemiyorsunuz? Ne yapacaksınız? Neyse ki yıllar önce mühendisler bunu düşünüp önlem aldılar. 

*

Aşırı karışık ve zor konular olduğu için elimden geldiğince basit ve kısa anlamaya çalıştım. Lütfen 
anlamadığınız yer olursa bana mesaj atın. 

Yazı dizisinin de böylece sonuna gelmiş olduk.

6 yorum

Sizde hangi kernel ve işletim sistemini kullanıyordunuz azimli yazar bey.Bizde 2.4 kullanıldıda ne kadar günceli takip ediyoruz merak ettim.

Reply

Valla linux 14.04 kullanıyordum da artık Windows ve Mac kullanıyorum. Sistemci değilim ben pek kafa yormam böyle şeylere.

Reply

Derste ne kullandınız linux kerneli olarak onu sormuştum.

Reply

Bilkentte almadım o dersi. Singapur'da da şunu kullanın demediler. Kullanmadan sadece okulun serverını kullanarak iş yapabilirsin de. Böyle şeyler önemli şeyler değil.

Reply

Neden önemli zannettiğimi söyleyeyim;bizde process scheduler'ı değiştirmemizi istediler,kernelin versiyonuna göre scheduler'ın kompkleksliği değiştiğinden,bizim üniversitemiz öğrencilere zor geleceğini düşündüğü için yeni versiyonlara geçmiyordu,ben de merak ediyorum diğer üniversitelerde aynı anlayıştalar mı, yoksa güncel kernel sürümlerinde işler verebiliyorlar mı diye.

Ancak singapur sürüm dahi söylemiyorsa çok daha farklı bir ödev sistemleri var anladığım kadarıyla.

Reply

Singapur'da ders 2. sınıf dersiydi, dolayısıyla böyle karmaşık ödevler yoktu. En karmaşık (ve tek karmaşık) ödev sıfırdan dosya sistemi yazmaktı, onda da kodun büyük kısmını vermişlerdi. Hatta bizim kod çalışmadığı halde nasıl oldu bilmiyorum, A+ aldık?

Senin bahsettiğin ödevde kendi sisteminde değişiklik yapıyorsan kernel önemli tabii. OS almadım ama diğer derslere bakıp yorumlarsak sanki dersler temel ve öğretme amaçlı bir sistem üzerinde çalışacak şekilde işleniyordu hep (veya ders hangi üniversiteden kopyalandıysa ve o kopyalanan derste hangi kitap kullanılıyorsa o kitaptaki sistem. computer architecture da böyleydi mesela) Atıyorum database dersinde kimse şu dbyi kullanın ödevleri ona göre verecez gibi bişi dememişti. O yüzden önemli şeyler değil dedim.

Reply

Yorum Gönder