İşletim Sistemi 101 – #7 (Boşlukları Dolduran Kavramlar)

Her ne kadar “101” konseptinde yazılar hazırlıyor olsam da, belirli noktalarda patır patır yeni kavramlar dökülüyor, bunun farkındayım. Öyle ki, bazı noktalarda name-dropping yaptığımı bile düşünebilirsiniz. Ama emin olun, name-dropping yapacaksam karşımdakinden gerçekten hoşlanmıyor olmam gerekir. 🙂

Kabul ediyorum. Bu konuları çok daha önceden yazmam gerekirdi. Fakat Star Wars’ı da 1’den itibaren izlemiyoruz. Dolayısıyla idare edin.

Tipik Bir Bilgisayarın Bileşenleri

“Böl ve fethet” kafasıyla yaklaşırsak eğer, bilgisayarı dört kategoride inceleyebiliriz: Donanım, işletim sistemi, yazılımlar ve kullanıcı(lar).

Donanım

Donanım için de yine klasikleşmiş bir tanım yapalım. Elle tutulur, gözle görülür, canınızı sıkan tiplerin kafasına atıldığında can yakar. Donanımları da işlemci (CPU), bellek (RAM) ve girdi/çıktı cihazları (I/O) olarak kategorize edebiliriz.

Central Processing Unit (CPU)^1: Cihazınızın hesaplama, karar verme mekanizmalarını barındıran parçasıdır. Verilerin işlenmesi, kodların çalıştırılması, matematiksel tüm işlemler bu parça üzerinde gerçekleştirilir. CPU mimarisini daha detaylı incelediğimizde karşımıza farklı yapılar çıkıyor, arithmetic logic unit (ALU) gibi.^2 Buralara girmiyorum.

Random Access Memory (RAM)^3: “Rastgele erişilebilir bellek”. Güzel bir isim. “Rastgele erişilemeyeni nasıl oluyor?” sorusunu aklımıza getiriyor tabii ki. Sözü fazla uzatmadan “kaset (tape)” deyip geçiyorum. Kaset sıralı erişim destekleyen bir depolama birimidir. Mesela, bir sonraki şarkıya geçmek için “ileri sarmanız” gerekir. RAM’lerin böyle bir sorunu yok. Bilgisayarınız ihtiyaç duyduğu takdirde farklı zaman dilimlerinde farklı RAM noktalarından farklı verileri çekebilir. Bilgisayarınızda çalışan process’lerin verileri RAM üzerinde yer alır. Bu konuyu process yazımda ayrıca ele almıştım. Çift tıkladığınızda bir süre bekliyorsunuz ya hani, verilerin diskten okunup RAM’e yazılmasını bekliyorsunuz işte o sırada. Peki bütün programı RAM’e getiriyor muyuz? Hayır, her zaman değil. Bariz bir örnek, oynadığınız oyunda bir bölümü geçtikten sonra “loading” ekranı görüyorsunuz ya hani? İşte o “loading” zamanında diskten ilgili bölümler okunup RAM’e getiriliyor gibi düşünebilirsiniz. Ya da tam gaz giderken haritanın bir bölümüne geldiğinizde oyun bir yavaşlar, ekran titrer. Dünya orada biter (Düz dünyacılar mutlu). Sonra önünüze yepyeni binalar, duble yollar döşenir (Düz dünyacılar yine hüsran). Aslında burada iş ekran kartı belleğine de dokunuyor ama çok deşmiyorum oraları şimdi.

I/O Aygıtları^4: Düz mantıkla çözülebilir aygıtlar aslında. Mesela hoparlör, ses çıkarıyor. Çıktı aygıtı. Mikrofon, sesi içeri alıyor. Girdi aygıtı. Monitör? Görüntü veriyor, çıktı aygıtı. Dokunmatik ekran? Hem girdi hem çıktı aygıtı. Diskiniz? Hem verileri saklıyor, hem de gerektiğinde diğer donanımlara sunuyor. Yine girdi ve çıktı aygıtı olarak düşünebiliriz.

İşletim Sistemi

Hep bahsettik ama yine de kısaca özetleyelim. Bilgisayarınızdaki donanımları yöneten bir programdır. Ayrıca donanım ile kullanıcılar arasında iletişimi kolaylaştıracak birtakım uygulamaları da üzerinde barındırır. Farklı bileşenleri olan bir yazılımlar grubudur.

Yazılım

Kullanıcının sorunlarını, bilgisayar donanımını kullanarak çözmeyi amaçlayan komutlar bütünüdür diyebiliriz. Bilgisayarınızda kullandığınız kelime işlemci, görsel düzenleyici, web tarayıcısı, medya oynatıcılar, oyunlar yazılıma^5 örnek verilebilir.

Kullanıcı(lar)

Sistemin bazen en masum bazen (çoğu zaman..) de en sorunlu bileşeni^6. Burada dikkat edilmesi gereken nokta şu. Bazı sistemler “çok kullanıcılı”^7 sistemlerdir. Çok kullanıcı işin içine girdiğinde; bu kullanıcıların güvenliği, kaynak paylaşımı gibi konular da gündeme geliyor.

Sistemlere Bakış Açıları

Bir sistemin tasarımını oluşturan en önemli sorulardan biri, bu sistemle “ne yapılacağıdır”. Bir cep telefonunu düşünelim. Temel görevi, hareket hâlindeyken arama yapmak. Performans kriteri olarak da önümüze batarya gücü, ses kalitesi gibi kriterler geliyor. “Akıllı” olarak nitelendirdiğimiz telefonlarda ise durum biraz daha değişiyor takdir edersiniz. Standart cep telefonunu kullanırken “Şarjı ne kadar gidiyor?” sorusu bizim için yeterliyken, günümüzde telefonlar için de işlemci, RAM gibi özellikleri konuşmaya başladık. Dönelim kişisel bilgisayarlara. “Aynı anda kaç kişiye hizmet verebilir?” sorusunu sormuyoruz. Zaten kişisel, bir kişi karşısına geçip kullanacak. Sunucu tarafından baktığımızda ise performans, uptime, güç tüketimi gibi sorular sormaya başlıyoruz.

Kullanıcı Tarafı

Kullanıcıların gözünden bilişim sistemlerini incelediğimizde, temel nokta “kullanım kolaylığına” geliyor. Bir kişi, bir cihaz. Dolayısıyla kişisel bilgisayarların işletim sistemleri de buna uygun tasarlanıyor. Böyle bir tasarımda “kullanıcılar arası kaynak yönetimi” gibi konulara çok girmeyiz.

Üniversite kütüphaneleri, bankalar gibi sistemleri düşünelim. Burada nispeten “küçük” bilgisayarlar görürüz. Kısıtlı işler yapan, bir yere (mainframe)^8 bağlanarak talepleri ileten ve sonuçları gösteren cihazlar kullanırız. Mainframe, bütün kullanıcılarına yetebilmek ister. Böyle bir cihazın işletim sistemi de takdir edersiniz ki daha farklı olacaktır.

Sistem Tarafı

Kullanıcının gözünde işletim sistemi, “bilgisayarı kullanırken muhatap olunan aracı” gibi görünüyor. Fakat konuya bilgisayarın gözünden bakmaya çalışırsak, işletim sisteminin donanımı yöneten bir yazılım olduğunu görürüz. Yukarıda da özetlemeye çalıştığımız gibi, bir bilgisayarın birçok donanımı mevcut. İşletim sistemi ise bu donanım kaynaklarını doğru şekilde dağıtmakla görevlidir.

Sonlu miktarda bellek alanınız var. Kullanıcı, aynı anda birden fazla program çalıştırmak istiyor. Bu programlar çalışmak için bellek alanı talep ediyor. Fakat talep edilen toplam miktar, sistemdeki toplam bellek miktarından daha fazla. Bu durumda ne yapabilirsiniz? Bir process (process-1), işini bitirmek için CPU’yu talep etti diyelim. Farklı bir process ise (process-2), “Ben process-1’in bana göndereceği veriyi bekliyorum.” diyerek CPU’yu meşgul ediyor. Bu senaryoyu nasıl yönetirsiniz? Ya da aynı anda aynı kaynaklara yapılan talepler olursa ne yaparsınız? Basitçe şunu düşünelim, oyun oynarken müzik dinlemek istiyoruz. Hoparlörü hangi programın sesleri için kullanacağız? Burada lütfen “E ikisinin de sesi gelir ki?!?” demeyin. Lütfen ama. Tabii ki gelir, mevzu o zaten. Bunun nasıl yapılabildiği.

Bir Bilgisayarın Çalışma Süreci

Bu konuya girmeden önce şunu belirtmek isterim. “Bir bilgisayar nasıl açılır?” konusu koskoca bir dönem, bir yıl hatta belki daha uzun süre eğitimi alınabilecek bir konu bence. Mevzu derinleştikçe içinde kaybolmak oldukça muhtemel. Ben burada çok temel düzeyde anlatacağım. Ama daha teknik bir şeyler okumak isterseniz, bir Intel x86 işlemcinin nasıl boot ettiğini anlatan şu yazıyı önerebilirim: How Does an Intel Processor Boot?

Günümüz sistemleri; bir ya da daha fazla işlemci, veriyoluna doğrudan bağlanan donanımlar (RAM gibi) ve veriyoluna kontrolcü (controller) aracılığıyla bağlanan donanımlar (HDD, klavye, fare gibi) bütününden oluşuyor. “Toplama bilgisayar” dönemini hatırlayın. Veriyoluna doğrudan bağlanan cihazlar için uyum gözetmek zorundasınız. Bu anakartın veriyoluna, bu CPU bağlanabilir mi? Birlikte çalışabilirler mi? Anakartım bu frekansta, bu boyutta bir RAM’i destekliyor mu? Controller aracılığıyla gerçekleşen bağlantılarda ise bu kadar soru sormak zorunda kalmıyoruz. “Bu klavye USB ile mi bağlanıyor? Evet. O zaman anakartımın üzerinde USB girişi olmalı.” Bu kadar. Bu kadar mı? Değil. Controller’ın cihazınızı yönetebilmesi için, işletim sisteminizin de controller’ı yönetebilmesi gerekir. Bu da bizi “driver” dediğimiz olaya getiren nokta. Aygıt sürücüleri doğru bir şekilde kurulmadan, bağlanan aygıtlar tam performansta çalışamayabilir, hatta hiç çalışmayabilir. “Ben herhangi bir fareyi alıyorum, takıyorum, driver kurmuyorum, çalışıyor.” derseniz de; bunun sebebi, ilgili controller driver’larının hâli hazırda işletim sisteminize gömülmüş olmasıdır. Birçok cihaz olmasına rağmen, her biri için ayrı driver yok. Böyle bir şeye gerek de yok. Gerek çalışma mantıkları, gerek üreticileri, gerekse kullanılan controller’lar bazında bakarsanız; driver’ları kategorilemek hayli mümkün.

Booting Up

Cihazınızın çalışması için, elektriğe ihtiyacı var. Elektrik verildikten sonra ise büyü (cıks, bilim) başlıyor. Sonrasında ise ROM’dan okunan bootstrap program devreye giriyor.

ROM^9: Read-only memory (Salt okunur bellek). Genelde firmware’in saklandığı kalıcı bellektir. Veriler, üretim sırasında belleğin içine yazılır. Sonrasında ise değiştirilmesi mümkün değildir. “Sadece okunabilir” olma kısmı buradan gelmektedir. Üretimi sonrasında değişikliği beklenmeyen yazılımlar, ROM’da saklanır. Zamanında kullandığımız oyun konsollarının (Atari, Nintendo Entertainment System gibi) oyun kartuşları, ROM’a örnek olarak verilebilir. Benzer şekilde, anakartlardaki BIOS’lar da ROM’a yazılır ve değiştirilemez. BIOS update ne oluyor o zaman? Geleceğiz 🙂

Firmware^10: Bir cihazın çalışabilmesi için gerekli olan low-level yazılıma verilen isimdir. Kullandığımız neredeyse her cihazın içinde bir yazılım mevcuttur. Otomobilinizin, kapı kilitlerinden sorumlu kumandasını düşünün. İki tuş olduğunu varsayalım, kilitle ve kilidi aç. Düşününce aslında epey garip bir durum. Normalde kapılar, anahtarla açılır. Bu sistemde kapıyı, kapının uzağından yönetiyoruz. Peki aracımız, hangi düğmeye bastığımızı nereden biliyor? Demek ki kumanda bu tuşlara göre farklı sinyaller gönderiyor. Hangi tuşa basıldığında hangi sinyali göndereceğini nereden biliyor? Firmware’i sayesinde.

EEPROM^11: ROM’ların geçmişini detaylıca okumanızı öneririm. Ben epey bir ileri atladım ve konuyu “Electrically Erasable Programmable Read-only Memory’e” getirdim. Elektrikle silinebilen, programlanabilen, salt okunur bellek. Burada işler ROM’a göre epey değişiyor. Yine üretim sırasında yazılmış bir veri var. Fakat sonrasında elektrik akımı sayesinde bu yazılım değiştirilebiliyor. BIOS update’leri bu sayede yapabiliyoruz. EEPROM’ların hayatımıza getirdiği bir başka güzellik, flash memory. Bildiğiniz flash bellek. Ek olarak SD kartlar ve Solid State Drive’lar (SSD) da EEPROM’un hayatımıza getirdiği donanımlar.

Nintendo 64 Oyun Kartuşu
Nintendo 64 Oyun Kartuşu

Bootstrap^12: Genel anlamda bootstrap, dışarıdan bir müdahale gerektirmeden kendi başına çalışabilen süreçler için kullanılıyor. Hatırlarsanız, giriş paragrafında ROM’dan okunan – ki burası EEPROM da olabilir, artık biliyorsunuz – bootstrap programından bahsetmiştim. Sisteme elektrik gelir gelmez, bu program kendi başının çaresine bakıyor. Bağcıklarını (bootstrap) kendi bağlıyor ve koşmaya başlıyor. Bootstrapping, bir olaylar zinciri. Bu süreçte self-test (Cihazda bir sorun var mı? Eksiklik var mı? Hani şu “Klavye bulunamadı, devam etmek için F1’e basın.” gibi manidar uyarılar vardır ya?), ayarların okunması (Hangi cihazdan çalışalım? USB yuvaları aktif olsun mu?), BIOS’un devreye alınması, işletim sisteminin çalıştırılması gibi adımlar vardır.

Bootstrap sürecinde, bootable bir cihaz aranır. Bu bir flash bellek, CD, DVD, HDD, SSD olabilir. Bu depolama birimleri üzerinde yer alan özel “Master Boot Record (MBR)^13 ya da “GUID Partition Table (GUID)^14 gibi alanlarda işletim sistemine ait ön yükleyiciler bulunur. Eğer sağlıklı çalışan bir ön yükleyici bulunursa, burada yer alan program(lar) belleğe getirilir ve siz de cihazınızda “Hoş geldiniz, yükleniyor, açılıyorum ben” gibi ibareler görmeye başlarsınız. Canavar gibi, cayır cayır.

Sonuç Olarak

Görüldüğü üzere, bir bilgisayarın, bir donanımın, bir elektrik devresinin böyle mucizeler yaratmasının ardında oldukça derin ve geçmişi olan konular var. Bu yazıda, başlıkları sadece özetlemeye çalıştım. İlerleyen yazılarımda, bu konuları daha detaylı inceleme ihtimalimiz var. Öte yandan, konunun meraklıları için saatler sürecek okuma bağlantılarını da aşağıya bırakıyorum. Umarım faydalı olmuştur.

Bağlantılar

1- Central processing unit, https://en.wikipedia.org/wiki/Central_processing_unit

2- Arithmetic logic unit, https://en.wikipedia.org/wiki/Arithmetic_logic_unit

3- Random access memory, https://en.wikipedia.org/wiki/Random-access_memory

4- Input/output, https://en.wikipedia.org/wiki/Input/output

5- Software, https://en.wikipedia.org/wiki/Software

6- Human, https://en.wikipedia.org/wiki/Human

7- Multi-user software, https://en.wikipedia.org/wiki/Multi-user_software

8- Mainframe computer, https://en.wikipedia.org/wiki/Mainframe_computer

9- Read-only memory, https://en.wikipedia.org/wiki/Read-only_memory

10- Firmware, https://en.wikipedia.org/wiki/Firmware

11- EEPROM, https://en.wikipedia.org/wiki/EEPROM

12- Bootstrapping#Computing, https://en.wikipedia.org/wiki/Bootstrapping#Computing

13- Master boot record, https://en.wikipedia.org/wiki/Master_boot_record

14- GUID Partition Table, https://en.wikipedia.org/wiki/GUID_Partition_Table

Referans

1 – Operating System Concepts Essentials, Abraham SILBERSCHATZ (Yale University), Peter Baer GALVIN (Corporate Technologies, Inc.), Greg GAGNE (Westminster College)

2 – Modern Operating Systems, Andrew S. TANENBAUM, Herbert BOS (Vrije Universiteit)