Proses konusunun devamı olan Fork() sistem çağrısından bahsedeceğim. Eğer daha önceki yazımı okumadıysanız ilk önce buraya tıklayarak o yazımı okumanızı tavsiye ederim.

Daha önceki yazımı okuduysanız orada bahsetmiştim. Bir program bir yada birden fazla proses tarafından çalıştırılabilir. Bir programın birden fazla proses tarafından çalıştırılması demek, tek bir prosesin yapacağı işi, birden fazla proses yaparak o programın daha kısa sürede ve daha hızlı bir şekilde çalışmasına yardımcı olduğundan bahsetmiştik. Yani bir binayı bir işçi yerine birden çok işçinin inşa etmesi nasıl ki o inşaat işinin daha kısa sürede tamamlanmasını sağlıyorsa, bunu da ona benzetebilirsiniz. Çünkü aynı anda birbirine paralel olan işler yürütülebilmektedir. Anne proses bir iş ile ilgilenirken çocuk proses aynı zamanda daha başka bir iş ile ilginiyor olabilir veya aynı işi yapıyor olabilirler yada bir diğerini bekliyor da olabilirler. Birebir aynı olduğu gibi farklı bir proses de olabilir. Biz bunu kullanacağım sistem çağrıları ile ayarlayabiliyoruz.

Fork() Çağrısı Nedir?

Bir programın çalışmasına yarayan bir prosesin kopyasının oluşturulması işlemidir. Yani kısacası yeni bir proses oluşturma işlemidir. Oluşan bu kopya prosese çocuk proses denir. Bu çocuk proses kimden kopyalandıysa, kopyalandığı o proseses ise Anne prosestir. Bu sistem çağrısı ile oluşan ikinci kopya prosesin yani çocuk prosesin tüm özellikleri, kod belleği birebir anne proses ile aynıdır.




Program koduna yazdığımız fork() ifadesinden sonra hem anne proses hem de çocuk proses aynı işlemi yapar.

Örneğin ben derleyiciye printf("Merhaba Dünya\n"); yazdırdım. Eğer ben bu tırnak içerisindeki kelimeyi fork() çağrısından sonra yazarsam, 2 defa "Merhaba Dünya" yazılır ekrana. Çünkü yazma işlemini hem çocuk proses yapıyor hem de anne proses yapıyor. Kullanacağımız sistem çağrıları yardımıyla çocuk prosese başka işler yaptıra da biliriz.

Aynı program içerisinde aynı işi yapan bu 2 prosesin herbirine farklı işler yaptırmak için hangi prosesin çocuk, hangi prosesin ise anne proses olduğunu bilmemiz gerekiyor. Bunu da anlamak için, proseslerin dönüş değerini bilmemiz yeterlidir. fork() dediğimiz çağrı ile çocuk proses "0" değeri atanır. Anne prosese ise "0" dan farklı bir numara atanır.

Bu aşamadan sonrası için bir video çektim. Daha iyi anlamanız açısından fork() çağrısı ve proseslerin detaylı anlatımı için bir video hazırladım.




Konu ile ilgili alıntı yaptığım ek bir bilgi : Ufak tefek işleri parent yaparken, bütün ameleliği çocuk prosese yükler. Oturup gazete okuyan bir babanın çocuğundan durmadan çay,terlik,yastık vs istemesi gibi bir şey bu. Bu olay proses'in daha hızlı işlem yapmasına olanak sağlar çünkü işleyiş iki koldan ilerler. İşleyiş olarak multithread olayına benzer ama temelde tamamen farklıdırlar.
Yazının devamını oku
Proses kelimesi ingilizcedeki process kelimesinden gelmektedir. Süreç, işlem gibi anlamlara gelmektedir. Bilgisayarımızın da merkezi işlem biriminde (CPU) çalışan işlemler yani prosesler vardır. Bu proseslerin kimisi işletim sisteminizi çalıştırmaya yararlar, kimiler ise kullandığınız diğer masaüstü programları çalıştırmaya yararlar. Tarayıcı, Media Player, ofis programları vs. gibi tüm programlar aslında birer prosestir ve kendi altında birden çok proses de bulundurabilirler.

  • Özet Bilgi : Karıştıranlar için şimdiden belirteyim. CPU, MiB ve İşlemci kelimeleri aynı şeylerdir. Bilgisayarın beynine verilen isimlerdir bunlar. Tüm veriler, programlar ve işlemler burada gerçekleşir. CPU, Central Unit Process anlamına gelir. MİB de bunun Türkçesi olan Merkezi İşlem Birimi anlamına gelir. Yazıyı okurken bu ifadeleri sık sık kullnacağım.

Bilgisayarda kullandığınız her program, bilgisayarın işlemcisindeki prosesler aracılığıyla çalışırlar. Örneğin siz müzik dinlemek için Windows Media Player'a tıklayıp açmak istediniz. Tıkladığınız sırada Windows Media Player'ın çalışmasına yarayan prosesler hemen devreye girerler ve bilgisayarın işlemcisine gelip işlem görürerler. Bilgisayar'da Media Player'ı açar. Bilgisayarlar o kadar hızlı çalışırlar ki bu işlemler milisaniyeler içinde meydana gelir.

Şimdide proseslere biraz daha somut olarak bakalım. Ctrl+Alt+Delete yapın ve görev yöneticisini açın. Üstteki sekmelerden "İşlemler" yazan kısma gelin. Bu kısımda gördükleriniz proseslerdir.


 
Alt kısımdaki "işlemler" yazan kısma dikkat edin. Benim bilgisayarımda şuanda aktif olarak çalışan 74 proses varmış.

Proses listesi açık iken masaüstünüzden herhangi bir program açıp kapatın. Açtığınız zaman o programa ait proses yada prosesler orada gözükeceketir. Kapattığınız zaman kaybolacaklardır. Bazı programlar için tek bir proses görülebilirken bazı programlar birden çok proses tarafından çalıştırılırlar. Örneğin yukarıdaki ekran görüntüsünde Google Chrome'un 4 farklı proses tarafından çalıştığını görebilirsiniz. Biraz daha alt kısımda yer alan Firefox'un tek bir proses tarafındna çalıştığını görebiliriz. Fakat sadece buna bakarak hangi programın daha iyi olduğuna karar vermeyiniz. Belkide içlerinde bulunan iplik sayıları farklıdır. İplik konusuna daha sonraki yazılarımda değineceğim.

Bir programı birden çok prosesin çalıştırmasının avantajları ve dezavantajları vardır. Avantajı; bir programın çalışması için birden çok proses çalıştığı için o program kısa sürede işleme girebilir. Yani bir binayı birden çok işçinin inşa etmesi gibi fakat; bunun şöyle bir dezavantajı var. Ne kadar çok proses olursa, bilgisayarın RAM'inde o kadar yer işgal edilecektir ve CPU bir program için birden fazla proses işleyeceği için bu bilgisayarı daha çok yoracaktır.

Şimdi proses durumlarını anlatayım. Neden işlemciyi daha çok yorduğunu ve ne demek Proseslerin Durum (Bağlam) Değiştirmesi kısmında daha iyi anlayacaksınız.

Proses Durumları

Prosesler hazır, bekleme ve çalışma durumlarında bulunabilirler.


Çalışma Durumu : Prosesin CPU'da işlem gördüğü durumdur.
Hazır Durumu     : Prosesin hazır olduğu ve çalışmak için (CPU'dan işlem görmek için) sırasının gelmesini beklediği durumdur.
Askıda Durumu   : Prosesin hazır duruma geçmek için bir olayın gerçekleşmesini beklediği durumdur.

Örneğin; hesap makinası programını açtınız. Açtığınız anda onu çalıştıran proses önce hazır kuyruğuna geçer, sonra işlemcide işlem görerek çalışma durumuna geçer ve program açılır. Tabi bunlar çok hızlı bir biçimde, milisaliseler içerisinde gerçekleşirler.  Daha sonrasında ise hesap makinesi programını çalıştıran proses, "Askıda Durumu"na geçer. Sizden rakam bekler. Siz rakam girip bir işlem yapmadığınız sürece o hep askıda kalır. Daha doğrusu askıda kuyruğuna geçer. Çünkü birden fazla proses askıda bekliyor olabilir. Bu sırada işlemcide başka bir program işlem görüyordur. Siz rakam girdiniz diyelim veya direkt olarak 3 + 2 yazdınız diyelim. (Tek tek uzun uzun anlatmamak için direkt olarak 3+2 dedim. Normalde 3 ve + ve 2 ayrı ayrı işlemlerdir.)
Program bu süre içerisinde yukarıda yazdığım işlemleri tekrar eder. Askıdan çıkar --> Hazır Kuyruğuna geçer --> Çalışır durumuna geçer. Çalışır durumunda size bir şey yansımaz ama o girdiğiniz ifadeleri bilgisayar kendi beyni olan CPU'da işler ve tekrar askıya geçer. Sizden tekrar bir işlem bekler. Askıda olduğu sürece işlem yapmaz. Siz eşittir yaptığınız sırada işlemler tekrar eder. Askıdan Kuyruğundan çıkar  --> Hazır Kuyruğuna geçer --> Hazır Kuyruğundan çıkıp --> Çalışır duruma geçer ve ekrana 5 sonucunu yazar.

Neden Hazır Kuyruğu veya Askıda Kuyruğu diyorum? Çünkü bilgisayarda birden çok proses vardır ve herbir proses işlemcide tek tek işlem görür. Yani uzun bir bilet kuyruğu düşünün. 1 tane gişe olduğunu düşünün. Gişe, işlemcidir. Kuyrukta hazır bekleyen insanlar ise birer proses olarak düşünülebilir. Tabi bu proseslerin kimisi askıda kuyruğundadır kimisi ise hazır kuyruğunda bekliyor olabilir. Kimisi ise işlem görüyordur.

Her Proses Kendi İle İlgili Olan Kuyruğa Girer!

Bu kısım önemli. Tüm programlar Merkezi İşlem Birimi'nde (MiB)'de yani CPU'da işlem görmeden önce, henüz askıda durumundayken, herhangi bir kuyruğa girmez. Kendi ile ilgili olan kuyruğa girer. Çünkü bazı programların çalışması daha uzun sürebilir bazı programların çalışması daha kısa sürebilir. Tüm prosesler aynı kuyruğa girerse, açılması daha kısa süren program, açılması daha geç olan programında arkasında sıraya girer ise, 1 saniyede açılacak olan program 10 saniyede açılabilir. İşletim sitemi geliştiriciler de bunun önüne geçebilmek için, benzer işlemleri yapan programları bilgisayar RAM'inde farklı farklı yerlerde kuyruğa girmesini sağlamışlardır.

Bakınız :



Bir Proses Neden Sürekli Çalışmayıp Askıda ve Bekleme Konumlarına Geçiyor?

Bilgisayarda hesap makinesi dışında onlarca çalışan program olduğunu Ctrl+Alt+Delelete yaparak  görmüştük. Her proses merkezi işlemci birimi olan CPU'yu yani bilgisayarın beynini işgal ederse ise sürekli, bilgisayar kitlenir. Bu sebeple işi biten proses işlemcide işlem gördükten sonra çıkmak zorundadır. Eğer proses tekrardan işlem görmek istiyorsan tekrardan hazır kuyruğuna geçer.


Prosesin Durum (Bağlam) Değiştirme Olayı

Proses Durum Değiştirirken Hangi İşlemler Gerçekleşir? Şimdi buna değinelim

Prosesler, içlerinde bir takım bilgiler barındırırlar.  Bu bilgiler Proses Kontrol Bloğu denen yerde tutulur. Bu proses kontrol bloğunda ise, şu bilgiler bulunur :



Proeses durum değiştirir iken... Yani; Hazır - Beklemede - Askıda durumları arası geçiş yaparken yukarıda sayılan PCB (proses kontrol bloğu) güncellenir. Tüm bu bilgilerin her durum değiştirme sırasında tekrardan güncellenmesi ise, işletim sistemi için zaman kaybıdır. PCB haricinde, durum değiştirme olayı sırasında proseslerde şu işlemler gerçekleşir :



Gördüğünüz gibi birden çok proses bir programı çalıştırırken o program için çalışma kolaylığı sağladığı gibi, dezavantaj olarak boş yere bilgisayar hafızasında yer kaplar ve işlemci daha çok işlem yapmak zorunda kalır. Bu da işlemcinin sırada bekleyen diğer işlemleri gerçekleştirmesi normalden daha uzun sürer.

FORK() Sistem Çağrısı

Bu çağrı yeni bir proses oluşturma çağrısıdır. Çalışan bir programa hizmet eden bir proses yerine birden çok prosesin hizmet etmesini sağlayabiliriz. Bu prosesler birnine paralel olarak çalışır. Örneğin çocuk proses başka bir prosesi çalıştırıp ona başka işlemler yaptırırken anne proses de kendi kendine başka işlemler yapabilir. Fork() olayı sayesinde oluşturacağımız proses ile aynı anda birbine paralel olarak çalışan birden çok işlem yapabiliyoruz. Fork sistem çağrısına bir sonaki yazımda ayrıntılı olarak değineceğim.

Konu ile ilgili aklınıza takılan tüm soruları aşağı kısma yorum olarak yazabilirsiniz. Size elimden geldiğince yardımcı olmaya çalışırım.
Yazının devamını oku

İstatistikler

BLOGKAFEM.NET

© Copyright 2008-2018
Sitedeki yazıların her hakkı BLOGKAFEM.NET sitesine aittir.
Kopyalanması halinde lütfen kaynak gösteriniz.
DMCA.com Protection Status
Anasayfa | Hakkımda | Bizden Haberler | Reklam | İletişim