İşletim Sistemleri ve Sistem Programlama

İşletim sistemlerinin temel bileşenleri (çekirdek, süreç yönetimi, bellek yönetimi, dosya sistemleri, G/Ç yönetimi), sistem programlama dilleri (C, C++, Rust, Assembly) ve sistem çağrıları, .NET ile düşük seviyeli etkileşim (P/Invoke, unsafe code) ve modern işletim sistemi güvenliği ile sanallaştırma konuları ele alınır.

İşletim Sistemleri ve Sistem Programlama

İşletim Sistemleri ve Sistem Programlama: Makine ile Kod Arasındaki Köprü

İşletim sistemleri, bilgisayar donanımı ile uygulama yazılımları arasında bir aracı görevi görür. Kaynak yönetimi, bellek tahsisi, süreç planlaması, dosya sistemleri ve güvenlik gibi temel hizmetleri sunar. Sistem programlama ise, bu işletim sistemi hizmetlerine doğrudan erişen, genellikle düşük seviyeli dillerle (C, C++, Rust, Assembly) yazılan ve donanım ile doğrudan etkileşen yazılımların geliştirilmesidir. Bu yazıda, işletim sistemlerinin temel yapı taşlarını, sistem programlama dillerini, kritik kavramları ve .NET dünyasından bu alana nasıl dokunulabileceğini derinlemesine ele alacağız.


1. İşletim Sistemi Temelleri

A. Çekirdek (Kernel) ve Kullanıcı Alanı (User Space)

  • Çekirdek: İşletim sisteminin kalbidir. Donanıma doğrudan erişir, bellek yönetimi, süreç planlaması, aygıt sürücüleri ve sistem çağrılarını (system calls) yönetir. Yüksek ayrıcalıklı modda (ring 0) çalışır.

  • Kullanıcı Alanı: Uygulama programlarının çalıştığı alandır. Burada çalışan programlar, işletim sistemine sistem çağrıları (syscalls) yoluyla istek gönderir. Daha düşük ayrıcalıklı modda (ring 3) çalışır.

B. Sistem Çağrıları (System Calls)
Uygulamaların işletim sistemi hizmetlerini talep etmesini sağlayan arayüzlerdir. Örnekler: open(), read(), write(), fork(), exec(), malloc(). .NET'teki File.Open, Console.WriteLine gibi metotlar, arka planda bu sistem çağrılarına karşılık gelir (P/Invoke veya doğrudan runtime aracılığıyla).


2. Süreç ve İş Parçacığı Yönetimi

  • Süreç (Process): Çalışan bir programın bellek içindeki örneğidir. Kendine ait sanal adres alanı, açık dosyaları ve iş parçacıkları vardır.

  • İş Parçacığı (Thread): Bir süreç içinde çalışan en küçük yürütme birimidir. Aynı sürecin iş parçacıkları, belleği paylaşır.

  • Zamanlama (Scheduling): İşletim sistemi, birden fazla süreç ve iş parçacığını CPU zaman dilimlerine bölerek çalıştırır. Algoritmalar: Round-Robin, Priority Scheduling, Multi-Level Queue.

  • IPC (Inter-Process Communication): Süreçler arası iletişim yöntemleri: Pipes, Message Queues, Shared Memory, Semaphores, Sockets.

.NET Bağlamı: System.Diagnostics.Process, System.Threading.Thread, Task (thread pool üzerinde), System.Threading.Mutex, SemaphoreSlim.


3. Bellek Yönetimi

  • Sanal Bellek (Virtual Memory): Her sürece, fiziksel RAM'den bağımsız, kendine ait sanal bir adres alanı sağlar. Sayfalama (paging) ve segmentasyon ile gerçekleştirilir.

  • Sayfalama (Paging): Sanal bellek adresleri, sabit boyutlu bloklara (sayfa/page) ayrılır. Fiziksel RAM ise çerçevelere (frame) bölünür. Bir sayfa tablosu (page table) kullanarak sanal-fiziksel eşleme yapılır.

  • Bellek Tahsisi: malloc() / free() (C), new / delete (C++), GC (.NET) ile yönetilir.

  • Sanal Bellek Yönetimi ve Çökme Koruması: Bir süreç başka bir sürecin bellek alanına erişemez (segmentation fault / access violation).

.NET Bağlamı: System.Runtime.InteropServices.Marshal (yönetilmeyen bellek tahsisi), Span<T>, Memory<T>, unsafe kod.


4. Dosya Sistemleri

  • Görevi: Verilerin depolama aygıtlarında (HDD, SSD) organize edilmesi, saklanması ve erişilmesi.

  • Veri Yapıları: FAT, NTFS, ext4, APFS. Her biri farklı metadata yapıları, journaling, izin modelleri sunar.

  • Erişim Yöntemleri: Sıralı erişim (sequential), doğrudan erişim (random), indeksli erişim.

  • Dosya İzinleri: UNIX/Linux'ta chmod, Windows'ta ACL (Access Control Lists) ile yönetilir.

.NET Bağlamı: System.IO.File, System.IO.Directory, FileStream, FileSystemWatcher.


5. Giriş/Çıkış (I/O) Yönetimi

  • Amaç: CPU ile çevre birimleri (klavye, fare, disk, ağ kartı) arasında veri aktarımını yönetmek.

  • Cihaz Sürücüleri (Device Drivers): Donanım ile işletim sistemi arasında arayüz sağlayan yazılımlardır. Her donanımın kendi sürücüsü vardır.

  • I/O Modları:

    • Programlı G/Ç (Programmed I/O): CPU, veri aktarımını doğrudan kontrol eder, bekler.

    • Kesmeli G/Ç (Interrupt-driven I/O): Cihaz, veri hazır olduğunda CPU'ya kesme (interrupt) gönderir.

    • Doğrudan Bellek Erişimi (DMA): Cihaz, CPU'dan bağımsız olarak veriyi doğrudan belleğe taşır (CPU müdahalesi az).

  • G/Ç Planlama: Birden fazla G/Ç isteği, verimlilik için sıraya alınır ve optimize edilir.

.NET Bağlamı: FileStream, NetworkStream, System.IO.Ports.SerialPort, System.Threading.Overlapped (Windows).


6. Sistem Programlama Dilleri

Dil Güçlü Yönleri Zayıf Yönleri Kullanım Alanları
C Donanıma yakın, minimal, hızlı, evrensel. Bel güvenliği (manual memory mgmt), gelişmiş özellikler yok. İşletim sistemleri, gömülü sistemler, sürücüler, gömülü sistemler.
C++ Nesne yönelimli, çoklu paradigma, yüksek performans. Karmaşık, öğrenme eğrisi dik, bellek yönetimi zor. Oyun motorları, yüksek performanslı uygulamalar, tarayıcılar.
Rust Bellek güvenliği (compile-time), sıfır maliyetli soyutlamalar, güvenli eşzamanlılık. Öğrenme eğrisi dik, derleme süreleri uzun. Sistem programlama, güvenli altyapı, WebAssembly.
Assembly Maksimum kontrol, minimal boyut, tam donanım erişimi. Son derece zor, taşınabilir değil, geliştirme süresi çok uzun. Bootloader'lar, çekirdek başlangıç kodları, ultra performans kritik parçalar.

.NET Bağlamı: .NET Runtime (CoreCLR) C++ ile yazılmıştır. C# ile unsafe ve fixed blokları ile düşük seviyeli işlemler yapılabilir. DllImport (P/Invoke) ile C/C++ kütüphaneleri çağrılabilir.


7. .NET ile Düşük Seviyeli Etkileşim

.NET geliştiricileri, doğrudan sistem programlama yapmasa da, aşağıdaki mekanizmalar ile işletim sistemi kaynaklarına erişebilir:

  • P/Invoke (Platform Invoke): [DllImport] ile Windows API veya Linux libc fonksiyonlarını çağırmak.

  • Unsafe Code: unsafe anahtar kelimesi ile pointer kullanımı, sabit bellek alanları (fixed).

  • Span<T> ve Memory<T>: Yönetilen/yönetilmeyen bellek üzerinde güvenli erişim.

  • System.Runtime.InteropServices: Yönetilmeyen bellek ayırma, veri marshalling.

  • System.Diagnostics: Süreç yönetimi, performans sayaçları, olay günlükleri.

Örnek (P/Invoke):

csharp

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes);

8. Modern İşletim Sistemi Güvenliği ve Sanallaştırma

  • Sanal Bellek ve Koruma: Her sürecin kendi adres alanı; yetkisiz erişim engellenir.

  • Kullanıcı / Çekirdek Ayrımı: Kullanıcı alanındaki kodlar çekirdeğe doğrudan erişemez; sistem çağrıları üzerinden iletişim kurar.

  • ASLR (Address Space Layout Randomization): Bellek adreslerini rastgeleleştirerek, bellek tabanlı saldırıları zorlaştırır.

  • DEP (Data Execution Prevention): Veri sayfalarının çalıştırılabilir olmasını engeller.

  • Hypervisor ve Sanallaştırma: Donanım üzerinde birden fazla işletim sistemini izole ederek çalıştırma (VMware, Hyper-V, KVM).

  • Konteynerler: (Docker) İşletim sistemi seviyesinde sanallaştırma (namespace, cgroups).


9. Gerçek Zamanlı İşletim Sistemleri (RTOS)

  • Amaç: Belirli bir zaman kısıtı içinde yanıt verilmesi gereken uygulamalar için.

  • Kullanım: Otomotiv (ABS, airbag), havacılık, tıbbi cihazlar, endüstriyel robotlar.

  • Örnekler: FreeRTOS, VxWorks, QNX.

  • Özellikler: Deterministik davranış, öncelik tabanlı planlama, düşük kesme gecikmesi.

Sonuç:

İşletim sistemleri ve sistem programlama, bilgisayar biliminin en temel ve en kalıcı alanlarından biridir. Donanım ile yazılım arasındaki bu derin etkileşimi anlamak, bir yazılım geliştiricisine performans optimizasyonu, güvenlik, kaynak yönetimi ve sistem tasarımı konularında paha biçilmez bir perspektif kazandırır. .NET gibi yüksek seviyeli platformlar, bu düşük seviyeli karmaşıklığın büyük kısmını soyutlasa da, gerektiğinde (P/Invoke, unsafe, Span) bu dünyaya erişim sunar. Modern yazılım dünyasında C, C++, Rust gibi dillerin yanı sıra işletim sistemi bilgisi, fark yaratan mühendisleri ayıran en önemli yetkinliklerden biridir.

Tüm yazılar