Masaüstünüzde aynı anda bir tarayıcı, müzik uygulaması, indirmeler ve onlarca sistem servisi çalışırken bilgisayarın her şeyi aynı anda yapıyormuş gibi görünmesi oldukça normaldir.

Görev Yöneticisi’ni açtığınızda ise arka planda binlerce thread, yani iş parçacığının aktif olduğunu görebilirsiniz.

Fakat işlemcinizde belki yalnızca 8 veya 16 çekirdek vardır.

Peki birkaç fiziksel çekirdek, binlerce işi nasıl yönetiyor?

Cevap, işletim sisteminin programları doğrudan işlemci çekirdeklerine vermek yerine onları farklı katmanlar üzerinden planlamasında yatıyor.

Bu yapıyı anlamak için programdan başlayıp CPU’ya kadar uzanan zincire bakmak gerekiyor.

Her Şey Diskteki Program Dosyasıyla Başlıyor

Bilgisayarınızdaki bir program ilk etapta çalışan bir yapı değildir.

Diskte duran bir dosyadır.

Bu dosya içerisinde programın çalışması için gerekli komutlar ve veriler bulunur. Siz programı çalıştırdığınızda ise işletim sistemi bu statik dosyayı bir çalışma ortamına dönüştürür.

İşte bu noktada process, yani süreç kavramı ortaya çıkar.

İşletim sistemi program için bellekte özel bir alan ayırır ve gerekli kaynakları tanımlar.

Ancak burada önemli bir ayrım vardır:

Process, doğrudan kod çalıştıran bir yapı değildir.

İşlemci çekirdeği bir process’i alıp komutları baştan sona onun üzerinden yürütmez.

Process daha çok uygulamanın çalışması için oluşturulan korumalı bir ortamdır.

Process Neden Gerekli?

Process’in en önemli görevlerinden biri izolasyon sağlamaktır.

Bir programın diğer programların belleğini rastgele değiştirmemesi gerekir.

Örneğin tarayıcının kullandığı belleğin başka bir uygulama tarafından gelişigüzel değiştirilmesi, sistemin kararlılığını ciddi biçimde bozabilir.

Process’ler bu nedenle uygulamalara ait bellek alanlarını ve kaynakları birbirinden ayıran önemli bir çalışma sınırı oluşturur.

Bu nedenle process’i şöyle düşünebiliriz:

Process = Uygulamanın çalıştığı korumalı ortam

Fakat bu ortamın içerisinde gerçekten komutları çalıştıracak başka bir yapıya ihtiyacımız vardır.

Bu yapı da thread’dir.

Gerçek Yürütme Birimi: Thread

ir uygulamanın içerisindeki kodu gerçekten çalıştıran temel birim thread, yani iş parçacığıdır.

Thread, bir process içerisinde komutları sırayla yürüten temel çalışma birimidir.

Bir process yalnızca tek bir thread içerebilir.

Ancak daha karmaşık uygulamalarda aynı process içerisinde onlarca farklı thread bulunabilir.

Bu thread’lerin her birinin kendi yürütme bağlamı vardır.

Örneğin her thread’in kendisine ait bir stack’i bulunur. Bunun yanında komut sayacı ve yazmaç durumu gibi yürütmenin devam edebilmesi için gerekli bilgiler de thread’in çalışma bağlamının parçasıdır.

Buna karşılık aynı process içerisinde bulunan thread’ler, process’in ortak bellek alanını paylaşabilir.

Dolayısıyla process ile thread arasındaki temel farkı şu şekilde özetleyebiliriz:

  • Process, uygulamanın korumalı çalışma ortamıdır.
  • Thread, bu ortam içerisinde kodu gerçekten yürüten birimdir.

Ve işletim sisteminin işlemci üzerinde planladığı asıl birim thread’dir.

Windows Scheduler Trafiği Nasıl Yönetiyor?

Bilgisayarınızda çalıştırılmayı bekleyen binlerce thread olabilir.

Ancak işlemcinin aynı anda çalıştırabileceği iş sayısı sınırlıdır.

Bu noktada Windows Scheduler, yani zamanlayıcı devreye girer.

Scheduler’ın temel görevi, hangi thread’in ne zaman işlemci üzerinde çalışacağını belirlemektir.

Bunu bir trafik polisi gibi düşünebilirsiniz.

Nasıl yoğun bir kavşakta her aracın aynı anda ilerlemesine izin verilemezse, işlemcide de hazır durumdaki bütün thread’ler aynı anda fiziksel çekirdeklere gönderilemez.

Scheduler karar verirken thread’lerin önceliklerini, çalışma durumlarını ve sistemdeki diğer zamanlama koşullarını dikkate alır.

Örneğin kullanıcı etkileşimine duyarlı bazı işler, arka planda çalışan düşük öncelikli işlerden farklı şekilde zamanlanabilir.

Bu sayede sistem, kullanıcının yaptığı işlemlere hızlı tepki verirken arka plandaki görevleri de yönetmeye devam eder.

Her Thread Sürekli Çalışmaz

Bilgisayarınızdaki bütün thread’lerin sürekli olarak CPU üzerinde çalıştığını düşünmek yanlış olur.

Bazı thread’ler bir I/O işlemini veya kullanıcı girdisini beklerken bekleme durumuna geçer.

Bu durumda CPU zamanı boşa harcanmaz.

Scheduler, çalışmaya hazır olan thread’lere işlemci zamanı vermeye devam eder.

Böylece sistem kaynakları yalnızca gerçekten çalışmaya hazır işler için kullanılır.

Bu mekanizma, aynı anda çok sayıda program açıkken bilgisayarın neden kullanılabilir durumda kalabildiğinin temel parçalarından biridir.

Logical Processor Nedir?

Scheduler’ın seçtiği thread, fiziksel çekirdeğin sunduğu logical processor, yani mantıksal işlemciye atanır.

Burada fiziksel çekirdek ile mantıksal işlemciyi birbirine karıştırmamak gerekir.

Örneğin Hyper-Threading teknolojisi, tek bir fiziksel çekirdeğin iki mantıksal işlemci sunmasına olanak sağlayabilir.

Fakat bu, sistemde iki adet tamamen bağımsız fiziksel çekirdek bulunduğu anlamına gelmez.

Mantıksal işlemciler, fiziksel çekirdeğin kaynaklarını paylaşan yürütme bağlamlarıdır.

Bu ayrım, Görev Yöneticisi’nde gördüğümüz işlemci sayılarının neden fiziksel çekirdek sayısıyla birebir aynı olmayabileceğini anlamak açısından önemlidir.

Bilgisayarın En Büyük İllüzyonu: Her Şey Aynı Anda Çalışıyor

Asıl ilginç nokta burada ortaya çıkıyor.

Tek bir CPU çekirdeği, birden fazla thread’i aynı anda gerçek anlamda paralel şekilde çalıştırmaz.

Bunun yerine çekirdek, thread’ler arasında çok hızlı geçişler yapar.

Bu geçişler o kadar kısa zaman aralıklarında gerçekleşir ki kullanıcı açısından bütün programlar aynı anda çalışıyormuş gibi görünür.

İşte bilgisayarın çoklu görev deneyiminin önemli bir bölümü bu hızlı planlama ve geçiş mekanizmasından kaynaklanır.

Bir thread çalışırken başka bir thread bekliyor olabilir. Daha sonra scheduler başka bir thread’i çalıştırabilir.

Bu işlemler sürekli tekrarlandığında biz ekranda kesintisiz bir çalışma deneyimi görürüz.

Context Switch: İşlemci Bir Thread’den Diğerine Nasıl Geçiyor?

Bir thread’in çalışması durdurulup başka bir thread’in çalıştırılması gerektiğinde Context Switch, yani bağlam değişimi gerçekleşir.

Önce çalışmakta olan thread’in yürütme durumu saklanır.

Ardından çalıştırılacak yeni thread’in daha önce saklanan yürütme bilgileri yüklenir.

Böylece yeni thread kaldığı yerden devam edebilir.

Ancak burada önemli bir ayrıntı bulunuyor:

Context switch ile process değişimi aynı şey değildir.

Aynı process içerisindeki thread’ler arasında geçiş yapmak, farklı bir process’e geçişten farklı maliyetlere sahiptir.

Farklı bir process’e geçildiğinde adres alanı değişikliği nedeniyle ek yönetim maliyetleri ortaya çıkabilir.

Bu nedenle işletim sisteminin gerçekleştirdiği her geçiş aynı ölçüde maliyetli değildir.

Thread’ler Sabit Aralıklarla Değiştirilmez

Context switch mekanizmasını bazen “işlemci her belirli sayıda milisaniyede bir thread değiştirir” şeklinde basitleştirmek mümkündür.

Ancak gerçek sistem bundan daha dinamiktir.

Thread geçişleri sabit ve değişmez zaman aralıklarına bağlı değildir.

Sistemin yükü, kesmeler ve thread’lerin mevcut durumları gibi faktörler zamanlama kararlarını etkileyebilir.

Dolayısıyla:

“Her 10 milisaniyede bir kesin olarak thread değişir.”

gibi sabit bir kuraldan söz etmek doğru değildir.

Scheduler, sistemin o anki durumuna göre dinamik kararlar verir.

Programdan CPU’ya Uzanan Zincir

Bütün yapıyı bir araya getirdiğimizde bilgisayarın çoklu görev mimarisi daha net hale geliyor.

Program diskte duran dosyadır.

Process, bu programın çalışması için oluşturulan korumalı çalışma ortamıdır.

Thread, işletim sisteminin planladığı ve kodu gerçekten yürüten temel birimdir.

Scheduler, hangi thread’in ne zaman işlemci üzerinde çalışacağını belirleyen karar mekanizmasıdır.

Logical processor, thread’in atanabileceği mantıksal işlemci birimidir.

CPU ise komutların fiziksel olarak yürütüldüğü işlemci çipidir.

Bu zincirin her halkasının farklı bir görevi vardır.

Program
   ↓
Process
   ↓
Thread
   ↓
Scheduler
   ↓
Logical Processor
   ↓
CPU

Bu yapı sayesinde bilgisayarınızda onlarca uygulama ve binlerce thread bulunmasına rağmen sistem size her şey aynı anda çalışıyormuş gibi bir deneyim sunabilir.

Aslında Bilgisayarınız Aynı Anda Her Şeyi Yapmıyor

Günlük kullanımda tarayıcıda bir sayfa açarken müzik dinlemek, dosya indirmek ve arka planda sistem servislerinin çalışması bize bilgisayarın bütün bu işleri aynı anda yürüttüğü hissini verir.

Ancak perde arkasında işletim sistemi sürekli olarak hangi işin çalışacağını, hangisinin bekleyeceğini ve işlemci kaynaklarının nasıl dağıtılacağını yönetmektedir.

Buradaki temel fikir şudur:

Çok sayıda işin bulunması, hepsinin aynı anda CPU üzerinde çalıştığı anlamına gelmez.

İşletim sistemi bu işleri planlar, uygun zamanda çalıştırır, gerektiğinde durdurur ve başka bir işe geçer.

Bütün bunlar çok hızlı gerçekleştiği için kullanıcı açısından sistem kesintisiz görünür.

Bu Zincirin Bir Sonraki Halkası: Program Nasıl Çalışan Bir Sürece Dönüşüyor?

Artık işletim sisteminin binlerce thread’i birkaç CPU çekirdeği üzerinde nasıl yönettiğini biliyoruz.

Fakat hâlâ önemli bir soru cevaplanmış değil:

Bir program ikonuna çift tıkladığımız ilk anda, diskte duran o dosya nasıl çalışan bir process’e dönüşüyor?

Program belleğe nasıl yerleştiriliyor?

DLL’ler ve runtime kütüphaneleri bu sürece nasıl dahil oluyor?

Bir sonraki aşamada programın açılış anına yakından bakarak bellek ve process oluşturma zincirini inceleyeceğiz.

By mgm

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir