80X86 İşlemcilerinde Context Switch Kavramı


Windows mimarisinde MS-DOS 4.0'dan öncesinde single-tasking bir yapı mevcuttu ve bu nedenle işletim sistemi aynı anda tek bir process'i çalıştırabildiğinden dolayı context switching gibi bir kavram mevcut değildi. MS-DOS 4.0'dan sonra multitasking bir yapı gelmiş ve aynı anda birden fazla process'in çalıştırılabilmesi olanağı sağlanmış fakat bir process'i bırakıp diğerine geçildiğinde bırakılan process'e geri dönüldüğünde kaldığı yerden devam etmesini sağlamak için context switching denilen kavram işletim sistemi mimarisine girmeye başlamıştır. Context switching, virtualization dünyasında işletim sisteminin snapshot'ını almaya benzer şekilde o anki tüm register, memory vb değerlerinin kaydedilmesi kavramına denilmektedir. Bu durum thread kavramı geldiğinde benzer nedenlerden dolayı thread'leri de ilgilendiren bir kavram olmuştur.


Bir thread/process’in çalışmasına ara verilip diğer bir thread/process’in kalınan yerden çalışmaya devam ettirilmesi sürecine context switch denilmektedir. Context switch “preemptive” işletim sistemlerinde donanım kesmeleriyle yapılmaktadır. PC mimarisinde tipik olarak “IRQ1 Timer” kesmesi bu amaçla kullanılmaktadır. Kesme oluştuğunda akış kernel moda geçerek işletim sisteminin kesme koduna aktarılır. Context switch burada yapılmaktadır.


Context switching sırasında geçiş oluştuğu noktadaki tüm CPU yazmaçlarının (matematik işlemci de dahil olmak üzere) bir veri yapısına aktarılması ve yeni geçilecek thread/process'in yazmaçlarının CPU yazmaçlarına geri yüklenmesi gerekir. Genellikle thread/process’li işletim sistemleri her thread ve process için PCB (Process Control Block) veya TCB (Thread Control Block) biçiminde organize edilne bir veri yapısı oluşturmaktadır.


Linux dünyasında bu iki ayrı veri yapısı tek bir çatı altında sunulmaktadır. Bu nedenle Linux sistemlerinde proses kontrol bloğu için task_struct şeklinde tanımlanan veri yapısı thread’ler için de  kullanılmaktadır. Aşağıdaki resimde görüleceği üzere veri yapısının içi ve kaydedilen değerler görülebilmektedir. 


Her biri process'e ait thread'ler için oluşturulan TCB'ler aşağıdaki resimde görülebileceği üzere bağlı liste biçiminde organize edilmektedir.


Preemptive olmayan (“cooperative” de denilmektedir) sistemlerde context switch kesme yoluyla değil açıkça bir fonksiyonun çağrılması yoluyla yani yazılımsal olarak yapılmaktadır.

Notlar:


  • Context switching işlemi eğer verimli bir şekilde kullanılamazsa işleminin maliyetinden dolayı işletimi sistemine fazladan yük getirme ihtimali vardır. Bu nedenle  işletim sisteminin context switching algoritması önem arzetmektedir.
  • cooperative multitasking (non-preemptive multitasking) : Bu tür multitasking sistemlerde işletim sistemi doğrudan context switching işlemini gerçekleştirmez. Her process/thread belirli bir süre çalıştıktan sonra çalışmasını bırakıp diğer process/thread'e geçilmesini sağlar. Windows 95 öncesi Windows 9x versiyonları 16'bitlik eski uygulamalar nedeniyle cooperative multitasking yapısı kullanılıyordu.
  • Linux kernelinde PCB için sched.h başlık dosyası içinde task_struct veri yapısında tanımlanmıştır.
  • preemptive multitasking (preemptive scheduling) : Bir process/thread çalışırken herhangi bir sebeple daha yuksek önceliğe (priority) sahip bir process/thread'in gelmesi durumunda interrupt edilip daha sonra kaldıgı yerden devam edebildiği işletim sistemi mimarileri denilmektedir.
  • Çok threadli preemptive sistemlerde bile bir çeşit “cooperative” thread oluşturma mekanizması bulunabilmektedir. Bu mekanizmaya “fiber” denilmektedir. Fiber işlemleri işletim sisteminin çekirdeği tarafından bilinmez. Tamamen “user” modda gerçekleştirilebilmektedir. Windows işletimi de belli bir versiyonundan sonra Fiber kavramını API fonksiyonlarıyla destekler hale gelmiştir.