Doğada merkezi bir yönetici olmadan sergilenen kolektif davranışlar, şaşırtıcı derecede başarılı sonuçlar üretir. Kuşlar yiyecek ararken birbirlerinin hareketlerinden yararlanır, balıklar tehlikeden birlikte kaçar ve karıncalar en kısa yolu kimse onlara harita vermeden bulur. Parçacık Sürü Optimizasyonu (Particle Swarm Optimization veya PSO), bu sosyal davranışı matematiksel bir optimizasyon yöntemine dönüştürür.
Devamı...
Bir müzik uygulamasının yanlışlıkla diskin tamamını silmesini veya sıradan bir oyunun klavye sürücüsünü yeniden programlamasını istemeyiz. İşletim sistemleri bu felaketleri yalnızca yazılım kurallarıyla değil, işlemcinin uyguladığı ayrıcalık seviyeleriyle engeller. x86 mimarisinde bunlar Ring 0 ile Ring 3 arasında numaralandırılan güvenlik halkalarıdır: Sayı küçüldükçe yetki büyür, sorumluluk ağırlaşır.
Devamı...
Bir robot koluna “şimdi dur” dediğinizde komutun çekirdekte kahve molasına çıkmasını istemezsiniz. Standart Linux yüksek işlem hacmi ve adil kaynak paylaşımı için tasarlanırken endüstriyel kontrol sistemleri belirli bir işin öngörülebilir sürede tamamlanmasını ister. PREEMPT_RT, Linux çekirdeğinin uzun süre kesilemeyen bölgelerini azaltarak gecikmeyi yalnızca düşük değil, daha önemlisi tahmin edilebilir hâle getirir.
Devamı...
Bir terminalde çalışan programa Ctrl+C bastığınızda ekranda sihir gerçekleşmez; terminal sürücüsü, çekirdek ve hedef süreç arasında dikkatle düzenlenmiş bir mesajlaşma zinciri çalışır. POSIX sinyalleri, süreçlere “dur”, “devam et”, “çocuğun sona erdi” veya “hemen toparlan” gibi kısa bildirimler gönderen, veri taşımaktan çok olay duyurmaya odaklı mekanizmalardır.
Devamı...
Bir Linux sunucusunda RAM ve kullanılabilir takas alanı tükendiğinde sistem tatsız bir seçimle karşılaşır: Ya tüm makine kilitlenecek ya da bazı süreçler feda edilecektir. Kernel’ın OOM (Out of Memory) Killer bileşeni ikinci yolu seçer. Ancak süreçleri rastgele avlamaz; bellek tüketimi, yönetici tercihleri ve sürecin sistem açısından önemi gibi etkenlerden bir “kötülük” puanı üretir.

Devamı...
Çok çekirdekli bir sistemde iki iş parçacığı aynı veriye uzandığında küçük bir trafik kavşağı oluşur. Mutex kırmızı ışıkta motoru kapatıp beklemeye, spinlock ise ışık yeşile dönene kadar gaza basmadan motoru çalıştırmaya benzer. Hangisinin daha hızlı olduğu, kilidin ne kadar süre tutulduğuna ve işletim sisteminin bekletme maliyetine bağlıdır.
Devamı...
Geleneksel makine öğrenmesinde her yeni problem için veri toplar, modeli eğitir ve sabırla sonuç bekleriz. Meta-learning ise bu rutine küçük bir itiraz getirir: Model yalnızca görevleri çözmesin, yeni bir görevi nasıl hızlı öğreneceğini de keşfetsin. Böylece binlerce örnek yerine birkaç örnekle uyum sağlayabilen, deyim yerindeyse eğitim salonunda nasıl antrenman yapacağını öğrenen sistemler ortaya çıkar.

Devamı...
Modern işlemciler yalnızca hızlı koşmaz; önlerindeki yolu tahmin ederek henüz gerekli olup olmadığı bilinmeyen komutları da çalıştırır. Meltdown ve Spectre, performans uğruna geliştirilen bu davranışın mimari olarak görünmeyen fakat ölçülebilen izler bırakabildiğini gösterdi. Sonuçta saldırgan, doğrudan okuyamadığı parolaları, anahtarları ve başka süreçlere ait verileri önbellek zamanlamalarını dinleyerek çıkarabilir.
Devamı...
Bir Linux makinesi yalnızca paketleri alan bir posta kutusu değildir; gerektiğinde yönlendirici, güvenlik duvarı ve NAT geçidi olabilir. Bu yeteneklerin merkezinde, ağ paketleri çekirdek içinde ilerlerken belirli kontrol noktalarında onları yakalayan Netfilter kancaları bulunur. iptables ise bu altyapıyı yapılandırmak için kullanılan kullanıcı alanı aracıdır. Başka bir deyişle iptables trafik polisi, Netfilter ise yolların ve kontrol noktalarının kendisidir.
Devamı...

Bilgisayarın güç düğmesine bastığınızda Linux doğrudan / dizinine koşmaz. Çekirdek belleğe yüklense bile gerçek kök dosya sistemine ulaşmak için disk denetleyicisi, dosya sistemi, RAID, LVM veya şifreleme sürücülerine ihtiyaç duyabilir. İşte initramfs, bu tavuk-yumurta problemini çözen, RAM üzerinde kurulmuş geçici ve küçük bir kullanıcı alanıdır.
Devamı...
Bir konteynere “en fazla 512 MB bellek kullan” veya “işlemcinin yalnızca yarısını tüket” dediğimizde bu kuralları Docker’ın sihirli değneği değil, Linux çekirdeğinin control groups mekanizması uygular. Cgroups v2, ilk sürümün yıllar içinde karmaşıklaşan yapısını tek bir hiyerarşide birleştirerek kaynak yönetimini daha tutarlı, güvenli ve öngörülebilir hâle getirir.
Devamı...
Modern işlemciler son derece hızlıdır; ancak ihtiyaç duydukları veriyi ana bellekten beklemek zorunda kaldıklarında pahalı bir spor arabayı trafik ışığında bekletmeye dönüşürler. Döngülerimizi ve veri yapılarımızı işlemci önbelleğine uygun tasarlamak, daha yüksek saat hızına ihtiyaç duymadan programı birkaç kat hızlandırabilir.

Devamı...
Bir dosyayı ilk kez açarken kısa bir bekleme yaşayıp ikinci açılışta şaşırtıcı bir hız görmüş olabilirsiniz. Dosya diskte durduğu hâlde bilgisayarınız nasıl bir anda hızlandı? Çoğu zaman cevap daha hızlı bir disk değil, işletim sisteminin boş RAM alanını akıllıca değerlendirdiği page cache mekanizmasıdır.
Devamı...

Bir işletim sistemi çekirdeği için boş RAM, gelişigüzel dağıtılabilecek dev bir tarla değildir. Sürücüler, süreçler ve çekirdek veri yapıları sürekli farklı büyüklüklerde fiziksel bellek ister. Buddy bellek yönetimi, bu talepleri hızlı karşılamak için belleği ikinin kuvvetleri büyüklüğündeki bloklara ayırır; gerektiğinde blokları ikiye böler, serbest bırakıldıklarında ise yeniden birleştirir.
Devamı...
Dosya sistemi yazmak denildiğinde akla çekirdek kodu, korkutucu C işaretçileri ve bilgisayarı yeniden başlatma ritüelleri gelebilir. FUSE sayesinde bunların çoğuna gerek kalmadan Python veya Go ile dosya işlemlerine kendi kurallarımızı uygulayabiliriz. Örneğin içeriğini çalışma anında üreten, buluttaki verileri dosya gibi gösteren ya da tüm yazılanları otomatik şifreleyen bir sistem geliştirebiliriz.
Devamı...
Bir web sunucusunun aynı anda on binlerce bağlantıya cevap vermesi, yalnızca hızlı bir işlemciye sahip olmakla çözülmez. Asıl mesele, çoğu zaman hiçbir şey yapmadan veri bekleyen bağlantıları düşük maliyetle yönetebilmektir. Linux dünyasındaki epoll ve BSD/macOS tarafındaki kqueue, işletim sistemine “Hazır olanı bana haber ver, diğerleriyle beni uğraştırma” diyerek yüksek eşzamanlılığın kapısını açar.

Devamı...
Linux ağ yığınında paketleri yakalamak, filtrelemek veya yönlendirmek eskiden çekirdek modülü geliştirmeyi ve bazen çekirdeği yeniden derlemeyi gerektiriyordu. eBPF sayesinde artık doğrulanmış küçük programları çekirdek içinde güvenli biçimde çalıştırabiliyoruz. Böylece DDoS filtrelerinden gecikme ölçümüne kadar pek çok işi, kaynak koduna neşter vurmadan gerçekleştirmek mümkün.
Devamı...

Bir işlemci çekirdeği bir thread’i durdurup diğerini çalıştırdığında ekranda hiçbir şey kıpırdamaz; ancak donanım ve işletim sistemi küçük bir bavul toplama töreni gerçekleştirir. Yazmaçlar saklanır, yeni yürütme bağlamı yüklenir, adres çevirileri gözden geçirilir ve önbellek düzeni sarsılabilir. Context switch, yararlı iş üretmeyen fakat çoklu görev için kaçınılmaz olan bu sürecin adıdır.
Devamı...
Linux çekirdeği devasa bir monolitik yapı olsa da her özelliği kalıcı olarak çekirdeğe gömmek zorunda değildir. Yüklenebilir Çekirdek Modülleri (Loadable Kernel Modules veya LKM), çalışan sistemi yeniden başlatmadan sürücü, dosya sistemi ya da ağ özelliği eklememizi sağlar. Bu yazıda küçük bir karakter cihazı geliştirerek modül mimarisini güvenli biçimde keşfedeceğiz.
Devamı...
Fare düğmesine bastığınızda işlemcilerin hep bir ağızdan “Ben bakarım!” diye bağırdığını düşünebilirsiniz. Gerçekte donanım, işletim sistemi ve Gelişmiş Programlanabilir Kesme Denetleyicisi (APIC) birlikte çalışarak sinyalin hangi çekirdeğe gönderileceğini belirler. Bu mekanizma yalnızca kullanıcı girişlerini değil; ağ paketlerini, disk işlemlerini ve zamanlayıcı olaylarını da düzenleyen görünmez bir trafik polisidir.
Devamı...