Linux Sistemlerde Zamanlama Algoritmaları (Scheduler Algorithms

advertisement
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
Download