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.
öncelikle teşekkürler.
YanıtlaSilhocam vidyonun en sonunda getpid() ve getppid() yazdık ve anne ve çocuğun numaralarını aldık fakat fork'u hiç çalıştırmadan yaptık bu işi buraya kadar olan kısımda hep fork() kullandık ve çocuk process oluştu ama bu kısımda fork yazmadan kodu çalıştırdık yani çocuk process i biz oluşturmadık. burayı tam anlamadım. şimdiden teşekkür ederim.
Derlediğimiz kodlar sonucu çalışan programın, yani konsolun kendisi de bir prosestir zaten. O şekilde düşün.
SilReis biraz daha detaylı anlatabilirdin ve video sesi çok yetershttps://www.blogkafem.net/logout?d=https://www.blogger.com/logout-redirect.g?blogID%3D27097030415787171%26postID%3D1217109107849787739iz kalmış
YanıtlaSilO zamanın şartlarında ancak bu şekilde bir video çekebilmiştim. Geri dönüşünüz için teşekkür ederim. Videolarda ses kötü olduğu için, tüm videolara alt yazı da ekledim. Videoyu alt yazıları takip ederek de izleyebilirsiniz.
Sil