Çokgörevlilik
Önceki Kabuk İşlemleri Sonraki
Çokgörevlilik
UNIX'in en büyük silahlarından biri süreçlerdir. Her süreç sistemde bağımsız çalışan, birbirini etkilemeyen ve herbiri kendi kaynağını kullanan programdır. Süreçler arkaplanda veya kabuğun kontrolünde çalışabilir. Çekirdek, her sürecin kullandığı sistem kaynağından haberdar olur ve bu kaynakların süreçler arasında adilce paylaşılmasından sorumludur.
Bir süreç, aksi belirtilmedikçe çalıştığı süre içinde klavyeden bilgi alır ve ekrana bilgi verir.
Kullanıcıların haberi bile olmadan çalışan süreçler, Linux makinasındaki G/Ç işlemlerini gerçekleştirebilmek için sürekli faaliyet içinde bulunurlar. Onlarca süreçten bazıları kullanıcıların sisteme girmesini sağlarken (getty) bazıları da WWW ve FTP gibi İnternet tabanlı istekleri yerine getirir (httpd, ftpd).
Arkaplanda Çalıştırma
Bir komutu arkaplanda çalıştırmak için, komutun sonuna & karakteri getirin. Komutu girdikten sonra tekrar kabuk istemcisine düşecek ve kaldığınız yerden devam edebileceksiniz. Program, arkaplanda diğer süreçlerle çakışmadan bir süre çalışır ve işi bittiğinde durur.
$ sort buyuk_dosya > buyuk_dosya.sirali &
[1] 772
Komutun arkaplana atılmasından sonra ekranda yeralan [1] , sürecin sıra numarasını, 772 sayısı ise süreç kimliğini (PID - Process ID) gösterir. Her program, sistem kaynaklarını biraz daha azalttığından Linux'çuların deyimiyle makina yavaşlar.
Çalışan programların listesini görmek için ps komutunu kullanın. Hiç parametre vermeden yazılırsa sadece üzerinde çalışılan kullanıcının süreçleri ekrana gelir. Sık kullanılan bir başka parametre dizisi de uax tir. Bu sayede sistemdeki o anda çalışan tüm programlar daha ayrıntılı bir şekilde ekrana listelenir.
$ ps
PID TTY STAT  TIME COMMAND
   76 v02 S     0:00 -bash
  111 v02 R     0:00 ps
$ ps -aux
USER       PID %CPU %MEM SIZE  RSS TTY STAT START   TIME COMMAND
bin         63  0.0  5.5   64  364  ?  S    11:12   0:00 /usr/sbin/rpc.portmap
gorkem      76  0.0  9.7  101  644 v02 S    11:12   0:00 -bash
gorkem     112  0.0  5.0   59  332 v02 R    11:16   0:00 ps -aux
root         1  0.0  5.0   56  332  ?  S    11:12   0:00 init [5]
root         6  0.0  4.2   35  284  ?  S    11:12   0:00 bdflush (daemon)
root         7  0.0  4.2   35  284  ?  S    11:12   0:00 update (bdflush)
root        48  0.0  5.1   45  340  ?  S    11:12   0:00 /usr/sbin/crond -l10
root        59  0.0  5.5   53  364  ?  S    11:12   0:00 /usr/sbin/syslogd
root        61  0.0  5.0   44  336  ?  S    11:12   0:00 /usr/sbin/klogd
root        65  0.0  5.5   62  364  ?  S    11:12   0:00 /usr/sbin/inetd
root        67  0.0  5.8   79  388  ?  S    11:12   0:00 /usr/sbin/rpc.mountd
root        69  0.0  6.0   88  400  ?  S    11:12   0:00 /usr/sbin/rpc.nfsd
root        75  0.1  9.9  115  660 v01 S    11:12   0:00 -bash
root        77  0.0  4.6   52  304 v03 S    11:12   0:00 /sbin/agetty 38400 tty3
root        78  0.0  4.6   52  304 v04 S    11:12   0:00 /sbin/agetty 38400 tty4
root        79  0.0  4.6   52  304 v05 S    11:12   0:00 /sbin/agetty 38400 tty5
root        80  0.0  4.6   52  304 v06 S    11:12   0:00 /sbin/agetty 38400 tty6
root        81  0.0  5.5   42  368  ?  S    11:12   0:00 gpm -t ms
Burada yeralan bilgiler sırasıyla:
PID
Süreç numarası. Her sürecin farklı bir numara alması sistem tarafından düzenlenir.
%CPU
İşlemcinin % olarak ne kadarı süreç tarafından kullanılıyor ?
%MEM
% olarak hafızada kapladığı yer
SIZE
Programın toplam kullandığı bellek alanı (kilobyte)
RSS
Programın bellekte kapladığı gerçel alan. Bu değer paylaşılan sistem kütüphaneleri (shared library) nedeniyle genellikle SIZE değerinden küçüktür.
TTY
Sürecin çalıştırıldığı (sanal) terminal
STAT:
Süreç o sırada ne yapıyor?
S
Uyumakta, bu durum genellikle sürecin bir G/Ç işlemi (örneğin fare'nin hareketi ya da ağdan gelecek veriler) beklemesi sırasında olur.
R
Çalışabilir. Çalışabilir süreçler, gereksinim duydukları bütün sistem kaynaklarına sahip olan süreclerdir. Çekirdek (tek işlemcili bir makinada) belirli aralıklarla bu süreçlerden sadece birini çalıştırır.
T
Durmuş. Bu durum sürecin kullanıcı tarafından (örneğin Control-Z tuşlarına basılarak) durdurulmasında görülür.
Z
Zombie. Bu tür süreçler, kendisini çalıştıran sürece mesaj bırakamadıklarından takılmış süreçlerdir. Öldürülemezler ancak sitem kaynaklarını da kullanmazlar.
D
Kesilemez uykuda. Bazı G/Ç işlemleri o sırada bu işlemi yapan sürecin kesilmemesini gerektirir. Böyle durumdaki süreçleri de ilgili G/Ç işlemi bitinceye kadar öldüremezsiniz.
START
Sürecin çalıştığı zaman
COMMAND:
komut satırından girilen programın ismi
ps komutuna bilgisayar üzerinde çalıştığınız her an ihtiyaç duymanız mümkündür, bu yüzden çeşitli parametrelerle kullanmayı öğrenmelisiniz.
Klavye Üzerinden Kesinti
Linux (ve UNIX) altında, klavyeden bazı tuş kombinasyonları yardımıyla çalışmakta olan program kesintiye uğratılabilir.
Klavyeden kabuk komut satırına yazılan bir programın uzun sürmesi halinde, eğer daha önceden komutun arkasına & işareti koyup arkaplanda çalışır halde bırakılmamışsa, klavyeden yapılan bir müdahele ile durdurulup arkaplanda çalışır hale getirilebilir. Örnek vermek gerekirse, uzun sürmesi beklenen bir komutu klavyeden yazalım ve ardından Control-Z tuşlarına basalım:
linux:/etc/rc.d# find /usr -name "o*" -print
/usr/bin/od
/usr/lib/lilo/doc/other.fig
/usr/lib/lilo/doc/other.tex
/usr/man/man1/od.1.gz

[1]+  Stopped                 find /usr -name "o*" -print
linux:/etc/rc.d#
Bu esnada sürecin çalışmasına ara verilmiş, fakat program tamamen durmamıştır. Programın çalışmasını arkaplanda sürdürmek için bg komutunu kullanın.
$ bg
Bu komutu tekrar komut satırında çalışacak ve klavyeden bilgi girilecek şekilde terminale bağlamak için fg yazın:
$ fg
Bir programı çalıştırmaya başlattıktan sonra tamamen durdurmaya karar vermişseniz klavyeden Control-C tuşlarına basın.
Durdurulup arkaplanda çalışmaya yönlendirilen süreçlere kısaca görev ismi verilir. Tüm görevleri görebilmek için
$ jobs
yazın. Görevler, birden fazla oldukları zaman sıra numarası ile belirtilirler.
Süreçlerin Sona Erdirilmesi
Her an çalışan süreçlerden biri veya birkaçı, beklenmedik döngüye girebilir. Bunun sonucu olarak sistemin kaynaklarını, özellikle hafızayı tüketici bir duruma gelebilir. Bu tür kısır döngüye giren süreçleri bulup, eğer hayati önem taşımıyorlarsa `öldürmek' gerekir. Süreci öldürmekten kasıt, programı tamamen durdurarak sistemle ilişkisini kesmektir. Bu sayede programın hafızada kapladığı bölge serbest kalacak, çekirdek de hafıza düzenlemesini tekrar yaparak başka süreçlere daha fazla yer ayıracaktır. Bir süreci öldürmek için kill komutu kullanılır. Yukarıdaki 67 numaralı sürece ait /usr/sbin/rpc.mountd programını öldürmek için şunları yazın:
$ kill 67
Birçok süreç sizden bu mesajı aldıktan sonra, dosya sistemi üzerinde yarattığı geçici dosyaları, dosyalar üzerine koyduğu kilitleri temizlemek gibi yapması gereken işlemleri yaptiktan sonra çalışmasına son verecektir. Eğer öldürmeye çalıştığınız süreç herhangi bir nedenle takılmışsa ve bu komuta tepki vermiyorsa aşağıdakini deneyin:
$ kill -9 67
Artık programın sistemle ilişkisi tamamen kesilmiştir. Kill komutu, -9 seçeneğiyle sürece 9 numaralı sinyali gönderir. Bu sinyali alan sürecin yukarıda sözü edilen iki özel durum dışında çalışmayı sürdürmesi olanaksızdır. -9 seçeneğini özellikle sistem süreçleri üzerinde gerekmedikçe kullanmamalısınız. Diğer sinyaller ve anlamları yeri geldikçe diğer bölümlerde anlatılacaktır.
Önceki Üst Ana Başlık Sonraki
Kanallama (pipe) İşlemleri Başlangıç Dosya ve Dizin İşlemleri
Bir Linux Kitaplığı Sayfası