Saturday 22 December 2007

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

Ali Rıza SARAL(1)

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

Süreçler
Bir süreç “içinde bir veya daha çok bağın çalıştığı ve o bağlar için gerekli sistem kaynaklarının yer aldığı bir adres alanıdır.” Şimdilik, bir süreci çalışmakta olan bir program olarak değerlendireceğiz.

Linux gibi çok-görevli (multi-tasking) bir işletim sistemi çok sayıda programın aynı anda çalışışına izin verir. Çalışmakta olan bir programın her bir gerçekleşişi(instance) ayrı bir süreç ortaya koyar.

Çok-kullanıcılı bir sistem olarak, Linux çok sayıda kullanıcının sisteme aynı anda erişişine izin verir. Her kullanıcı çok sayıda programları, hatta aynı programın çok sayıda gerçekleşişini aynı anda çalıştırabilir. Sistem kaynaklarını yönetmek ve kullanıcı erişimini kontrol etmek için sistemin kendisi başka programlar çalıştırır aynı zamanda.

Çalışmakta olan bir program—veya süreç—program kodu, veri, değişkenler (sistem belleğini kaplayan), açık dosyalar(dosya tanımlayıcıları), ve ortam(environment) ‘dan oluşur. Genellikle, Linux sistemi kod ve sistem kütüphanelerini süreçler arasında ortak kullandırarak bir anda bellekte kodun yalnız bir kopyasının bulunmasını sağlar.

Süreç Yapısı Şekil 1-1
Eğer ps komutunu aşağıda belirtildiği gibi koşturursak, çıkış şunun gibi görünecektir:

$ ps -af
UID PID PPID C STIME TTY TIME CMD
rick 101 96 0 18:24 tty2 00:00:00 grep pid_t /usr/include/sys/*.h
neil 102 92 0 18:24 tty4 00:00:00 grep XOPEN /usr/include/features.h

Her sürece süreç tanımlayıcıya SüreçKimlikNosu - process identifier PID adı verilen eşsiz bir sayı ayrılır. 1 sayısı diğer süreçleri yöneten özel bir süreç olan sıfırdan-başlat (init) ‘a ayrılır.

Normalde, bir Linux süreci program kodunu tutan bellek alanına yazamaz, dolayısıyla kod belleğe yalnız-oku (read-only) olarak yüklenir. Bu alana yazılamasa bile, bu alan emin bir şekilde başkaları ile paylaşılabilir.

Sistem kütüphaneleri paylaşılabilir. Böylece, çok sayıda program çağırsa bile, bellekte, örneğin printf ‘in tek bir kopyası oluşu yeterlidir. Bu Pencereler (Windows)‘in devingen ilişki kütüphaneleri (dynamic link libraries (DLLs))’nin çalışış şekline benzer fakat daha işlenmiş bir modeldir.

Standart kütüphanelerin ortak alt-programlarını hariç tutmak bütün işletim sistemi üzerinde büyük bir bellek alanı kurtarılışını sağlar. Fakat bir programın çalışışı için ihtiyacı olan herşey, örneğin kullandığı değişkenler, dosyalar her süreç için ayrıdır. Ek olarak, fonksiyonlar içindeki yerel değişkenler (local variables) ve fonksiyonları kontrol ve onlardan geri döndürülen değerler için kullanılan, bir sürecin kendine ait yığın(stack) alanı vardır. Aynı zamanda, yalnız bu sürecin kullanması için kurulmuş, ortam değişkenlerini içeren kendi ortam alanı (environment space) vardır.

Bir süreç, aynı zamanda kendisi ile ilgili çalışan bağ içinde, çalışırken nereye geldiğinin kaydını yani program sayacını tutmak zorundadır.

Bir çok LİNUX sisteminde ve bazı UNİX sistemlerinde /proc adı verilen özel bir dosya kümesi vardır. Bunlar gerçek dosyalar olmaktan çok, süreçler çalışırken sanki kütüphanelerdeki dosyalar gibi içlerine bakmanıza izin verdikleri için özeldirler.

Son olarak, LİNUX, UNİX gibi kod ve veriyi sabit diskin bir alanına sayfalayan sanal bir bellek sistemine sahip olduğu için fiziksel belleğe sığabilecek olandan çok dafa fazla sayıda süreç yönetilebilir.

Süreç Tablosu
Linux süreç tablosu (process table) şu anda yüklü olan bütün süreçlerin, örneğin PID, durum(status), ve komut dizisi türünden ps çıktısında görebileceğimiz türden bilgilerini tanımlar.

İşletim sistemi süreçleri SüreçKimlikNo’ları (PID) ‘nı kullanarak yönetir, ve onlar süreç tablosuna index olarak kullanılırlar. Bu tablo sınırlı büyüklüktedir, bu yüzden bir sistemin destekleyebileceği süreç sayısı sınırlıdır.