Linux Sistemlerde Süreç Zamanlama Algoritmaları (Scheduler Algorithms) ÜMİT İŞGÜDER 21/03/07 İşletim Sistemleri 1 Linux 2.6.8.1 Zamanlayıcısının Temelleri Linux 2.5.x 'in geliştirilmesi sırasında yeni bir zamanlama algoritması Linux çekirdeğine en önemli değişikliğini yaşattı. Linux 2.4.x zamanlayıcısı geniş bir alanda güvenilir, genelde sorunsuz olarak kullanılıyordu fakat birçok istenilmeyen özelliklere sahipti ve bunlar yapılanmadan ötürü yerleşik durumdaydı. 21/03/07 İşletim Sistemleri 2 Linux 2.6.8.1 Zamanlayıcısının Temelleri Ingo Molnar bunları iyileştirma çabası içine girdi ve eski algoritmada değişiklikler yapmak yerine tümüyle yeni olan bir algoritma oluşturdu. Linux 2.4.x zamanlama algoritmasının O(n) algoritmalarını içermesi belki de en büyük kusuruydu ve sonradan anlaşıldığı gibi en iyi gelişme yeni zamanlayıcının O(1) algoritmalarından oluşmasıydı. 21/03/07 İşletim Sistemleri 3 Peki nedir bu O(1) algoritması? 21/03/07 İşletim Sistemleri 4 O(1) Algoritması Bir algoritma girdiler (input) üzerine işlem yapar ve girdilerin sayısı genellikle çalışma zamanını belirler. Big-O notasyonu algoritmanın çalışma zamanının büyüme oranının girdi sayısınına dayalı olarak belirlenmesinde kullanılır. Örneğin O(n) algoritmasının çalışma zamanı n arttıkça doğrusal olarak artar. Bir O(n²) algoritması için üstsel olarak artar (quadratical). 21/03/07 İşletim Sistemleri 5 O(1) Algoritması Eğer bir algoritmanın çalışma zamanında (running time) sabit üs kullanmak mümkün olursa bu bize O(1)'i sağlar.Başka bir deyişle algoritmamız sabit zamanda çalışabilir. Yani bir O(1) algoritması bize girdi sayısı ne olursa olsun kesin bir sürede tamamlanma garantisi veriyor. 21/03/07 İşletim Sistemleri 6 Linux 2.6.8.1 Zamanlayıcısının O(1) Zamanında Görevini Yerine Getirmesini Ne Sağlıyor? 21/03/07 İşletim Sistemleri 7 Linux 2.8.6.1 Zamanlayıcısının Yapısı Linux 2.6.8.1 zamanlayıcısı O(1)'den daha kötü çalışan bir algoritma içermiyor. Bu durum zamanlayıcının her bölümünün sistemde ne kadar görev varsa kesin bir sürede çalıştırılacağına garanti veriyor. Bu da Linux çekirdeğinin etkin bir şekilde çok fazla sayıda artan görevlerin maliyeti arttırmaksızın yönetmesine izin veriyor. 21/03/07 İşletim Sistemleri 8 Linux 2.8.6.1 Zamanlayıcısının Yapısı Linux 2.6.8.1 zamanlayıcısında bu görevlerin O(1) zamanında gerçekleşmesini sağlayan iki adet veri yapısı vardır ve yapısı bunlar etrafında döner: Öncelik Dizileri -Priority Arrays Çalışma Kuyrukları -Runqueues 21/03/07 İşletim Sistemleri 9 Runqueues (Çalışma Kuyrukları) Runqueue veri yapısı Linux 2.6.8.1 zamanlayıcısında kullanılan en temel veri yapısıdır ve bütün algoritma bunun üzerine kuruludur. Aslında bir runqueue CPU'ya atanmış tüm çalışabilir görevlerin alan bilgisini tutar.Bunun için sistemde her CPU için bir runqueue oluşturulur ve yönetilir. 21/03/07 İşletim Sistemleri 10 Runqueues (Çalışma Kuyrukları) Her runqueue iki adet öncelik dizisi (priority array) içerir. Runqueue'nin işi CPU'nun özel thread bilgilerinin yerlerini tutup bunları iki öncelik dizisiyle yönetmektir. 21/03/07 İşletim Sistemleri 11 Runqueues Veri Yapısı ve Kullandığı Değişkenler Runqueue veri yapısı kernel/sched.c 'de tanımlanmış olan bir veri yapısıdır. spinlock_t lock Bu değişken runqueue'yi koruyan kilittir. Sadece bir görev belirli zamanda runqueue üzerinde oynama yapabilir. 21/03/07 İşletim Sistemleri 12 Runqueues Veri Yapısı ve Kullandığı Değişkenler unsigned long nr_running Runqueue'deki çalışabilir durumda olan görevlerin sayısını tutar. unsigned long expired_timestamp En son Priority Array değişiminden beri geçen zaman ( aktif 21/03/07 ölü ) İşletim Sistemleri 13 Runqueues Veri Yapısı ve Kullandığı Değişkenler unsigned long nr_uninterruptible Runqueue'deki çalışması kesilemeyen görevlerin sayısını tutar. task_t *curr En son çalışan göreve pointer. task_t *idle CPU'nun idle görevine pointer. ( Idle: sistem boşta hali ) 21/03/07 İşletim Sistemleri 14 Runqueues Veri Yapısı ve Kullandığı Değişkenler struct mm_struct *prev_mm Bir sonraki çalışacak olan görevin bulunduğu sanal belleğe pointer. Etkin olarak sanal bellek haritalama ve yönetiminde kullanılır. (cache) atomic_t nr_iowait I/O için runqueue'de sıra bekleyen görevlerin sayısını tutar. 21/03/07 İşletim Sistemleri 15 Runqueue ve Kilitleme Sadece bir görev belirli zamanda runqueue üzerinde oynama yapabilir ve bunu yapmak isteyen görev önce kilidi açmalıdır. Birden çok runqueue kilitlerini açmak karmaşıklıktan kaçınmak için runqueuenin azalan adresler olarak düzenlenmesi gerekir. İki runqueyi kilitlemek için uygun bir fonksiyon olan double_rq_lock(rq1, rq2) kilitleri kendi yönetir. Tersi olarak da, double_rq_unlock(rq1, rq2) ikisini birden kilitler. Runqueueyi kilitleme de task_rq_lock(task, &flags) adındaki fonksiyondaki bir görevdir. 21/03/07 İşletim Sistemleri 16 Priority Arrays (Öncelik Dizileri) Bu veri yapısı Linux 2.6.8.1 zamanlayıcısının O(1) zamanlı performansını sağlamadaki en önemli öğesidir. Zamanlayıcı daima sistemdeki en yüksek öncelikli görevleri zamanlar ve eğer birden çok görev aynı öncelik seviyesinde ise birbirleriyle dönüşümlü olarak zamanlanır. 21/03/07 İşletim Sistemleri 17 Priority Arrays (Öncelik Dizileri) Öncelik kuyrukları sistemde en yüksek seviyeli öncelikli görevleri bulurlar ayrıca sabit zamanda mümkün olduğunca öncelik seviyelerini dönüşümlü olarak ayarlarlar. 21/03/07 İşletim Sistemleri 18 Priority Arrays (Öncelik Dizileri) Bundan başka zaman dilimi bölümleri arasında geçiş yaparak iki öncelik kuyruğunu uyum içinde kullanmak sabit zamanlı işlemleri meydana getirdi. Bu zaman dilimi bölümleri tüm çalışabilir görevlerin yeni bir zaman dilimiyle başlamaları ve zamanlarını harcamaları arasındaki zamandır. 21/03/07 İşletim Sistemleri 19 Priority Arrays Nasıl Kullanılır? 21/03/07 İşletim Sistemleri 20 Priority Arrays Öncelik kuyrukları, her öncelik seviyesinden oluşan bağlı listeler dizisidir. (Linux 2.8.6.1'de 140 seviyede öncelik vardır ). Bir görev diziye eklendiğinde aslında listeye eklenen onun öncelik sırasıdır. Boyutu MAX_PRIO+1 olan bir bitmapde her öncelik seviyesi için aktif görevleri içeren bit seti vardır. 21/03/07 İşletim Sistemleri 21 Priority Arrays Dizideki en yüksek seviyeli öncelikli görevi bulmak için biri sadece bitmape konulan bitlerin ilkini bulmak zorunda. Aynı önceliğe sahip çoklu görevler dönüşümlü olarak zamanlanır; çalışmadan sonra, görevler öncelik seviyelerinin listesine göre dibe konulur. 21/03/07 İşletim Sistemleri 22 Priority Arrays Çünkü sonlu uzunluktaki bir bitmapde ilk biti bulmak ve listede ilk elemanı bulmak işlemin ne kadar zaman alacağını belirleyen bir dizi işlemlerdir. CPU'daki her görev aktif olan öncelik sırasında yaşamına başlar ve ona verilen zaman dilimi süresince yaşar ve süresi dolan ölü dolan görevlerin tutulduğu öncelik dizisine taşınır. 21/03/07 İşletim Sistemleri 23 Priority Arrays Taşınma süresinde de yeni çalışma süresi hesaplanır. Artık aktif öncelik dizisinde çalışabilir durumda bir görev kalmamışsa sadece diziler yer değiştirir. Çünkü zaman dilimleri görevlerin süreleri dolunca yeniden hesaplanır, ama bu tüm görevler için yeni zaman dilimlerinin hesaplanması demek değildir. 21/03/07 İşletim Sistemleri 24 Priority Arrays Bu birkaç görev için hesaplanan zaman dilimleri ve bunların iterasyonunu kullanmak yerine kullanılan birkaç küçük sabit-zaman işlemidir. Yani bizim O(n) algoritmamızdaki istemediğimiz olay çözüme kavuşmuştur. Ölü ve aktif öncelik dizilerimizin pointerlarının yer değiştirilmesi n adet görevi sayılarca diziden diziye taşıyan ve O(n) zaman alan işlemlerden kaçınan sabit-zaman işlemidir. 21/03/07 İşletim Sistemleri 25 Priority Arrays Veri Yapısının Kullandığı Değişkenler prio_array_t *active Aktif olan ve daha çalışma zamanları bulunan görevlerin bulunduğu aktif priority array'e pointer. prio_array_t *expired Zamanlarını kullanmış ve bitirmiş olan ölü priority array'e pointer. 21/03/07 İşletim Sistemleri 26 Priority Arrays Veri Yapısının Kullandığı Değişkenler int best_expired_prio Ölü bir dizide en yüksek öncelik. EXPIRED_STARVING makrosu içinde kullanılır ve çalışan görev öldükten sonra hangi görevin en yüksek öncelikli olduğunu saptamaya yarar. 21/03/07 İşletim Sistemleri 27 Linux Sistemlerde Süreç Zamanlama Algoritmaları (Scheduler Algorithms) ÜMİT İŞGÜDER 21/03/07 İşletim Sistemleri 28