Process

Process
Process, kaba tabirle calisan bir program ornegi olarak isimlendirilebilir. Bir program calismaya basladigi zaman, kernel bu programi sanal bir hafizaya yukler, programin degiskenleri icin hafiza tahsis eder ve process ID, termination status, user ID, group ID gibi degiskenlerini saklamasi icin bir alan ayirir.
Bu noktadan baktigimiz zaman process, kernelin bilgisayar kaynaklarini paylasmak zorunda oldugu bir mekanizmadir. Hafiza gibi sinirlandirilmis kaynaklar icin kernel processlere calisabilmeleri icin belli buyuklukte bir alan ayirir ve bu alani process islemini bitirene kadar processin istegine sunar. Process sonlandigi zaman, tum alani diger processlerin kullanmasi icin tekrardan geri alinir. CPU, network bandwidth gibi diger kaynaklar yenilenebilir kaynak olmalarina ragmen bunlar da processler arasinda esit dagilimla paylasilmak zorundadirlar.

Process Hafizasi
Bir process mantiksal olarak segment adi verilen 4 adet alana ayrilir. 

- Text: Programin instruction (talimatlarinin) saklandigi alandir.
- Data: Program tarafindan kullanilan static degiskenlerin saklandigi alandir.
- Heap: Program tarafindan dynamic olarak kullanilacak extra hafiza bloklarini iceren alandir.
- Stack: Fonksiyon cagrilari, fonksiyonlarin local degiskenleri ve fonksiyonlarin link bilgileri gibi degisken bilgileri iceren, bu sebeple de dynamic olarak artip azalabilen hafiza bolgesidir.
          
Process Yaratma ve Program Calistirma
Bir process fork adindaki system call ile olusturulabilir. fork fonksiyonunu cagiran process, parent process olarak isimlendirilir. fork sonucu olusan process ise kernel tarafindan parent process'in bir kopyasi olarak dogar ve child process olarak isimlendirilir. child process, parent process'e ait olan data, stack ve heap bilgilerini birebir kopyalar ve parent process'ten bagimsiz bir sekilde bu alanlari modifiye edebilir. Programin text segment'i read-only olarak isaretlenmistir, bu yuzden iki process tarafindan paylasilir.

Child process, parent process'in sahip oldugu kod blogu icerisinde farkli fonksiyon cagrilari yapabilir. Genelde yeni bir program calistirmak veya yuklemek icin execve adindaki system call fonksiyonunu kullanir. execve cagrisi onceden olusturulmus text, data, stack ve heap segmentlerini yok eder ve onlari yeni programin text, data, stack ve heap segmentleri ile degistirir.

execve uzerine kurulmus C dili ile alakali bir cok kutuphane fonksiyonlari, ayni islemi biraz farkli bir arayuz ile saglarlar. Bu fonksiyonlarin hepsi exec on kelimesi ile baslarlar, genelde bu fonksiyonlara exec ailesi veya kisaca exec adi verilir.

Process ID ve Parent Process ID
Her process, PID (process identifier) adi verilen unique bir ID degerine sahiptir. Ayrica yine her process PPID (parent process identifier) adi verilen parent process'inin ID degerine sahiptir.

Process Sonlandirma ve Sonlandirma Statusleri
Bir process iki farkli sekilde sonlandirilabilir: _exit() system call fonksiyonu ile sonlanma islemini kernelden isteyebilir veya bir signal ile sonlandirilabilir. Her iki durumda da, process sonlandirma statusunu negatif olmayan kucuk bir integer deger ile ayarlar. Bu islemi kendisini wait adindaki fonksiyon ile bekleyen parent process'ine bildirmek icin yapar. _exit() cagrisinda, process kendi sonlanma statusunu kendisi belirlerken, eger bir signal tarafindan sonlandirilmis ise, processin olum nedenine signalin tipi karar verir.

Geleneksel olarak bir processin 0 status ile sonlanmasi o processin basarili bir sekilde isini tamamlayip oldugu anlamina gelirken, sifir olmayan bir status processin bir hata ve beklenmedik bir durum sonucunda oldugunu gosterir.

init Process
init process, sistem boot edildigi zaman kernel tarafindan yaratilan ozel amacli bir prcesstir. Sistem icerisinde tum processlerin dogrudan veya dolayli yoldan parent processi sayilir. /sbin/init dosyasinin calistirilmasi sonucu olusur. Sistemdeki tum processler fork fonksiyonunu kullanarak init processten veya init processin child processlerinden turerler. init processin ID'si her zaman 1'dir ve superuser (su) yetkisi ile calisir. Bu process superuser tarafindan bile oldurulemez, sadece sistem kapatildigi zaman sonlanir. init processinin temel gorevi calisan bir sistem icerisindeki processleri yaratmak ve onlari takip etmektir.

Daemon Processler
daemon, diger processler gibi sistem tarafindan yaratilip kontrol edilebilen fakat bazi karakteristik ozellikleri ile diger processlerden ayrilan ozel amacli processlerdir. Bu karakteristik ozellikler:

- daemon processler uzun yasarlar. Genelde sistem calismaya basladigi zaman dogup, sistem kapandigi zaman olurler.
- arka planda (bg) calisirlar. Input okumak veya output yazmak icin terminal kontrolu kullanmazlar.

Sistem loglarini kayit eden syslogd ve HTTP yoluyla web servisi saglayan httpd processleri, daemon processe ornektir.

Interprocess Communication (IPC) ve Senkronizasyon
Calisan bir Linux sistemi birbirinden bagimsiz olan onlarca process icerir. Bazi processler amaclari icin ortak calisirlarken, bazilari ise birbirleri ile haberleserek senkronize bir sekilde calisirlar.

Processleri kontrol etmenin tek yolu diske bilgi yazip okuma islemi ile yapilir. Bu islem cogu uygulama icin oldukca yavas ve etkisiz bir yontemdir. (Multi-process calisan her uygulama her zaman performans saglamaz.)

Cogu modern UNIX turevi gibi Linux de procesler arasi haberlesme islemi icin bir cok mekanizma saglar:

- signal: bir olay oldugunu belirtmek icin kullanilir.
- pipe: komut satirindaki | operatorune benzer. Processler arasi veri transferi icin kullanilir.
- socket: ayni veya farkli locallerdeki processler arasi veri transferi icin kullanilir.
- file locking: bir dosyanin iceriginin okunmasi veya guncellenmesi gereken durumlarda processlerin sirali olarak calismasi icin kullanilir.
message queue: processler arasinda mesajlasma islemi icin kullanilir.
- semaphore: processlerin calismasini senkronize etmek icin kullanilir.
- shared memory: iki yada daha fazla processin hafizanin belli bir bolgesini kullanmasi icin olusturulmus bir mekanizmadir.

Farkli UNIX turevlerinden dolayi sistemler arasi gecislerde IPC yontemleri farklilik gosterebilir. Ornegin: FIFO ve UNIX ana socketleri temelde ayni gorevi gormelerine sistemden sisteme farklilik gosterebilirler cunku FIFO System V sistemi icerisinde implement edilmisken socketler BSD sistemi ile olusturulmustur.

Signal
Yukaridaki bir cok IPC yontemi siralanmasina ragmen, signal processler arasinda haberlesmede en cok kullanilan mekanizmalardan birisidir, bu yuzden ayrica tartisilmayi hak etmektedir.

Signal, software interrupt olarak da bilinir. Bir signalin bir processe ulasmasi, bazi olaylarin veya sira disi durumlarin oldugunu gosterir. Sistem icerisinde tanimlanmis her farkli durum icin farkli signal tipleri mevcuttur. Her signal tipi farkli bir integer deger ile belirlenir ve sembolik 
olarak SIGxxx formunda tanimlanirlar.

Signal bir processe kernel, baska bir process veya kendisi tarafindan gonderilebilir. Ornegin kernel asagidaki durumlardan herhangi birisinin olusmasi durumunda bir processe signal gonderebilir:

kullanici interrupt (Ctrl + C) karakterine bastigi zaman,
- process'in child processlerinden bir tanesi sonlandigi zaman,
- process tarafindan kullanilan bir timer doldugu zaman,
- process gecersiz bir hafiza adresine erismek istedigi zaman

Shell kullanarak kill komutu da bir processe gonderilebilir. kill() system call fonksiyonu da ayni islemi yapar.

Bir process tarafindan signal yakalandigi zaman asagidaki durumlardan herhangi birisi yapilabilir.

- signal process tarafindan ignore edilebilir,
- signal tarafindan process oldurulebilir,
- ozel amacli bir signal tarafindan uyandirilana kadar process uyutulabilir.

Cogu signal tipi icin, programci direk olarak signali kabul etmek yerine signal handler adi verilen bir mekanizma araciligi ile signalin tipini  belirleyerek ona gore islem yapmayi secer. Signal handler programci tarafindan tanimlanmis ve processe gonderilen signalleri yakalayabilen bir fonksiyondur.

Olusturulma ve teslim edilme sureleri arasinda signal bir process icin bekleme modundadir. Bekleyen bir signal bir sonraki islemde calistirilmak uzere veya aninda ait oldugu processe teslim edilir. Ote yandan signal mask adi verilen bir mekanizma ile signali engellemek de mumkundur. Eger signal bloklandigi anda olusturulmus ise blogu kaldirilana kadar bloklanmis bir vaziyette beklemede kalir.


Popular posts from this blog

Polya’nın Problem Çözme Teknikleri

Mikroislemci Temelleri