Monday 24 December 2007

LINUX Programlamağa Giriş– Süreçler 3

Ali Rıza SARAL(1)


(1) Neil Matthew ve Richard Stones, Beginning Linux Programming ‘den faydalanarak derlenmiştir.

Süreç Planlayış
Daha ileri bir ps çıktısı ps komutunun kendisi için olan hanedir.

1357 pts/2 R 0:00 ps –ax

Bu, süreç 1357’nin koşuş halinde (run state (R)) olduğunu ve ps –ax komutunu çalıştırmakta olduğunu belirtir. Böylece bu süreç kendi çıktısında tarif edilmektedir! Durum (status) belirteci yalnızca programın koşmağa hazır olduğunu belirtir, gerçekten o anda koştuğunu değil.

Tek işlemcili bir bilgisayar üzerinde, bir anda tek bir süreç çalışabilir, diğerleri sıralarını beklerken. Zaman dilimleri (time slices) olarak bilinen bu sıralar, çok kısadır ve programlar aynı zamanda çalışıyor izlenimini verirler. R yalnızca programın başka süreçlerin bitmesini beklemediğini ya da giriş çıkışın tamamlanışını beklediğini belirtir. ps çıktısında bunun gibi iki süreçgörmenizin nedeni budur. (Bir başka genellikle koşuyor şeklinde işaretlenmiş süreç X görüntü sunucusudur (X display server).

Linux çekirdeği hangi sürecin bir sonraki zaman dilimini alacağına karar vermek için bir süreç planlayıcısı (process scheduler) kullanır. Bunu süreç önceliğine (process priority) göre yapar. Yüksek öncelikli süreçler daha sık koşmak durumuna ulaşırken, düşük öncelikli arkaplan görevleri gibi diğerleri daha seyrek çalışır.

Linux ile, süreçler kendilerine ayrılan zaman dilimini aşamazlar. Şüf’alı çok görevli (pre-emptively multitasked) (*) oldukları için işbirlikleri gerekmeden askıya alınırlar ve kaldıkları yerden devam ederler. Eski sistemler, başka süreçlerin kaldıkları yerden devam edebilişleri için genellikle süreçlerin doğrudan kontrolü bırakışını gerektirir.

(Şüf’a = pre-emptive kelimesi Hukuk’ta geçer, Sn. Nadir YÜCEL’den alınmıştır.)

Linux gibi çok sayıda programın büyük olasılıkla aynı imkanlar için yarıştığı çok görevli bir sistemde, kısa iş yapış patlayışları ve giriş için ara verişler yapan programlar daha iyi davranışlı olarak değerlendirililer, aralıksızca bir değer hesaplayarak veya sistemi yeni girişi var mı diye sürekli sorgulayarak işlemciyi esir alanlara göre… İyi davranışlı programlar hoş (nice) programlar olarak adlandırılırlar, ve bu “hoşluk” bir bakıma ölçülebilir.

İşletim sistemi bir sürecin önceliğini bir “hoş” (nice) değerine dayanarak belirler, kendiliğinden değeri 0’dır, ve programın davranışına göre değişir. Hiç durmadan, uzun süreler için çalışan programlar düşük öncelikler alırlar. Girdi beklerken vb. duraklayan programlar ödüllendirilirler.

Bu, kullanıcı ile etkileşen bir programı canlı tutmağa yardım eder; öte yandan kullanıcıdan bir girdi beklerken sistem önceliğini arttırır, öyle ki kaldığı yerden devam etmeğe hazır olduğunda yüksek öncelik sahibi olur. Süreç hoş değerini hoş (nice) ile belirleyebiliriz ve yeniden-hoş (renice) ile ayarlayabiliriz. Hoş (nice) komutu hoş değerini 10 arttırır, ona düşük öncelik vererek. Faal süreçlerin hoş değerlerine ps komutunun –l veya –f (uzun çıktı için) seçenekleri ile bakabiliriz. İlgilendiğimiz değer NI(nice) sütununda gösterilir.
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 1259 1254 0 75 0 - 710 wait4 pts/2 00:00:00 bash
000 S 500 1262 1251 0 75 0 - 714 wait4 pts/1 00:00:00 bash
000 S 500 1313 1262 0 75 0 - 2762schedu pts/1 00:00:00 emacs
000 S 500 1362 1262 2 80 0 - 789 schedu pts/1 00:00:00 oclock
000 R 500 1363 1262 0 81 0 - 782 - pts/1 00:00:00 ps

Burada oclock programının(süreç 1362) kendiliğinden gelen hoş değeri ile çalıştığını görebiliriz. Eğer şu komut ile başlatılmış olsaydı

$ nice oclock &
+10 hoş değeri ayrılmış olacaktı ona. Eğer şu komut ile bu değeri ayarlarsak

$ renice 10 1362
1362: old priority 0, new priority 10

Saat (clock) programı daha seyrek koşacak. Değiştirilmiş hoş değerini yine ps ile görebiliriz:

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 1259 1254 0 75 0 - 710 wait4 pts/2 00:00:00 bash
000 S 500 1262 1251 0 75 0 - 714 wait4 pts/1 00:00:00 bash
000 S 500 1313 1262 0 75 0 - 2762 schedu pts/1 00:00:00 emacs
000 S 500 1362 1262 0 90 10 - 789 schedu pts/1 00:00:00 oclock
000 R 500 1365 1262 0 81 0 - 782 - pts/1 00:00:00 ps

Durum sütunu hoş değerinin kendiliğinden gelenden daha farklı olduğunu belirtmek için şimdi N değerini belirtir. ps çıktısının PPID alanı ebeveyn süreç KİMLİKNO (ID)’sunu belirtir, yani ya bu sürecin başlayışına neden olan sürecin SüreçKimlikNo’su (PID), ya da eğer bu süreç artık koşmuyorsa, sıfırdan-başla(init) (SüreçKimlikNo 1). Linux planlayıcısı hangi sürecin çalışışına izin vereceğine öncelik temelinde karar verir. Tam gerçekleyişler değişebilirler, tabii, fakat yüksek öncelikli süreçler daha sık koşar. Bazı durumlarda, eğer yüksek öncelikli süreçler koşmağa hazır iseler, düşük öncelikli süreçler hiçbir zaman çalışmayabilir.