Process - Bir Yazılımın İşletim Sistemindeki Yaşam Döngüsü

İ. Başar YARGICI
folksdev
Published in
7 min readNov 1, 2022

İşletim Sistemlerindeki en önemli konseptlerden ve soyutlamalardan birisi Process kavramıdır ve bilgisayardaki çalıştırılabilir tüm yazılımlar bir dizi Process’ten oluşmaktadır.

Process kavramını daha iyi anlayabilmek adına, bilgi sahibi olunması gereken birkaç temel konu bulunmaktadır:

  • Günümüz bilgisayarlarının birçoğunun temel aldığı Von Neumann Mimarisi
  • İşletim sisteminin varoluşsal sancıları 😄

Von Neumann Mimarisi

Von Neumann Mimarisinin Şeması

Von Neumann mimarisini incelemek, günümüzdeki bilgisayarların çalışma prensibinin temelini anlamak için güzel bir kaynaktır. Bu mimari, veri ve komutları tek bir depolama biriminde bulundurmaktadır. Von Neumann, bir bilgisayarı oluşturan 3 ana bileşenin olduğunu savunmaktadır:

  • Giriş Çıkış Birimleri (Input/Output Devices): Kullanıcının komut girmesini sağlayan cihazlara Input Device, çıktıları gözlemleyebileceği cihazlara ise Output Device denmektedir.
  • Bellek (Memory): İşlenecek bilgilerin depolandığı birimdir.
  • İşlemci (CPU): Bellekten ya da giriş biriminden alınan verinin, makine kodu ile birleştirilerek, üzerinde aritmetiksel ve mantıksal işlemlerin yapıldığı birimdir.

🔗 Von Neumann Mimarisinin detaylarına buradan ulaşabilirsiniz.

İşlemciye Komutlarımızı Nasıl İletiyoruz?

İşletim sisteminin olmadığı zamanlarda (ilk bilgisayar dönemlerinde), komutları bilgisayara giren bilim insanları (benim tabirimle işletim insanları😃) bulunmaktaydı. Bu kişiler delikli kart (Punched Card) adı verilen karton parçalarını, programın akışına (Flow) uygun olarak gerekli slotlara takar ve hesaplamalar sonucu cihazdan bir sonuç alırdı.

Punced Card: Üzerinde belirli noktalara açılan (veya açılmayan) delikler sayesinde sayısal bilgi taşıyabilen karton parçaları.

Fortran programı: Z(1) = Y + W(1), son 8 sütun sıralama (sorting) bilgisi verir

İşletim Sistemi, bilgisayarda çalışan donanım kaynaklarını yöneten ve çeşitli uygulama yazılımları için yaygın servisler sağlayan yazılımlar bütünüdür. Aslında İşletim Sisteminin ortaya çıkış nedeni, yavaş, hata yapmaya açık ve verimi düşük olan bu işletim insanlarının yerini almaktır. İşletim Sistemine bir input verildiğinde bu input, CPU’daki hesaplamalar sonucunda bir output olarak istemciye geri verilir. Ek olarak, işletim sistemi, kullanıcıya bu outputu hız, doğruluk ve verim temelli bir yaklaşımla sunmaktadır.

Process

Process, çalışan programın soyutlaması olarak tanımlanabilir. Processler sayesinde, tek bir core’a sahip işlemci üzerinde sözde (pseudo) concurrency yakalanabilmektedir.

Bilgisayarda birçok işlemi aynı anda yapmaya çalışıyoruz. Örneğin, tarayıcı üzerinde gezinirken arkada Müzik çalmasını veya mail geldiğinde bir notification pop-up’ı gösterilmesini bekliyoruz. Elimizde tek core’a sahip bir işlemci olsun. İşlemlerimizin kısa bir süre içerisinde tamamlanabilmesi için bu işlemcinin olabildiğince az kesintili çalıştırılması gerekmektedir. Ama şöyle bir durum var ki işlemci, T anında sadece tek bir işlem gerçekleşeştirebilmektedir. Peki biz nasıl aynı anda birçok uygulamayı çalıştırabiliyoruz? Hadi bir örnek ile bunu pekiştirelim 😄

Facebook Server’ına bir istek (request) attığımızı düşünelim. Server’ın amacı, olabildiğince hızlı hizmet verebilmektir. Bu sebeple ilk olarak kendi önbelleğinde (Cache) “bu sayfa var mı?” diye kontrol eder. Eğer varsa, cache’deki sayfayı kullanıcıya gönderir (response) ve işlemi sonlandırır. Eğer sayfa cachede yoksa, server, kendi belleğinden sayfayı almak için belleğine bir istekte bulunur. CPU bu süreçte Input/Output (I/O) biriminden yanıt beklediği için bloklanmış bir şekilde bekleme durumunda bulunur. Şu anda CPU bekleme durumdayken, başka kullanıcılar tarafından da bu Server’a istekler gelecektir. CPU’nun bu istekleri işlemesi gerekir ki gecikmeyi (Latency) olabildiğince az tutsun ve kullanıcılar sistemden gelecek sonucu beklemesin. Bu bekleme süresini azaltmak için CPU kullanımını (Utilization) olabildiğince arttırmak gereklidir. CPU kullanımını arttırmak için de eş zamanlılığı (Concurrency) elde etmemiz gerekmektedir. Processler ve Threadler, eş zamanlılığı sağlamakta bizlere yardımcı olmaktadır. Eş zamanlılığı, tek bir işlemcide, farklı uygulamaların belirli zaman periyotlarında sıra sıra çalışması ya da iki farklı uygulamanın birbirinden farklı iki işlemcide aynı anda çalışması olarak düşünebilirsiniz.

Process aslında RAM’e taşınmış, çalışma durumunda olan, program sayacına (Program Counter), yazmaçlara (Register) ve değişkenlere (Variables) sahip olan bir programdır. Her Process, CPU’nun kendisine ait olduğunu düşünür. Ancak gerçekte şöyle bir işleyiş vardır;

  • Örneğin tek core’a sahip bir CPU’nun üzerinde çalıştığımızı ve elimizde birçok processin olduğunu varsayalım
  • İlk process CPU’ya geldi. İşlemlerinin bir kısmını CPU’ya yaptırdı ama kullanıcıdan veri almak için I/O controller’a gitmesi gerekti. Böylece CPU bloklanarak boş duruma (Idle) geçti.
  • CPU’yu boş durumda bırakmak istemediğimiz için sözde (Pseudo) paralel olarak Process 2'yi işleme aldık ve Process 1 gelene kadar ya da CPU’nun idle durumu oluşana kadar Process 2 üzerinde işleme devam ettik.
  • Process 2 bittikten sonra Process 1 hala gelmediyse, Process 3 e geçeriz ve aynı işlemi elimizdeki işler bitene kadar devam ettiririz.

CPU’yu boş durumda bırakmadan, Process’ler arasında sürekli değişim (context switch) yaptığımız bu yönteme çoklu programlama (Multiprogramming) denir.

Örnekte paralel kelimesinden önce parantez içinde “pseudo” kelimesini kullandım. Pseudo dememizin sebebi, aslında tek core’lu bu örneğimizde T anında birçok işlemin yapılmamasıdır. CPU’da hesaplamalar o kadar hızlı yapılıyor ki, bizler bu hesaplamayı farketmiyor, aynı anda paralel olarak bu işlerin hesaplandığını düşünüyoruz.

(a) 4 farklı programın Multiprogramming ile Memory’deki durumu
(b) Birbirinden bağımsız kendi Flow’una, Program Counter’ına (PC) sahip olan 4 process. Hangi process işlenirse onun PC’ı gerçek PC’ye yerleştirilir
(c) Tek core CPU’da sırasıyla Process’lerin işlenme durumu. Dikkatli bakılırsa T anında sadece tek bir process işleniyor. Pseudo kelimesinin kullanım sebebinin c grafiği ile daha iyi anlaşıldığını umuyorum.

Analojiler’in teknik eğitimlerde öneminin daha fazla olduğunu düşünüyorum. Yazımda ana kaynak olarak kullandığım ve incelenmesini kesinlikle önerdiğim Andrew S. TanenBaum ve Herbert Bos tarafından yazılan “Modern Operating Systems” kitabında bu konu ile ilgili çok beğendiğim bir analoji bulunmakta. Biz Process kavramını “program in execution” yani çalışma durumunda RAM’e taşınmış program olarak tanımlıyoruz. Bu analojideki hedeflenen amaç ise program ve Process arasındaki farkın daha iyi anlaşılabilmesidir.

Mutfak Meraklısı Bilgisayar Uzmanı Analojisi

Kız çocuğu için doğum günü pastası hazırlayan bir adam olduğunu varsayalım ve adına John diyelim. John’un elinde doğum günü pastasını hazırlayabilmek için bir tarif bulunmakta. Tezgahının üzerinde ise ihtiyacı olan her malzeme var; un, yumurta, şeker, vanilya tozu vs. Bu durumda pasta tarifini bir program, John’u CPU ve malzemeleri de input data olarak düşünebiliriz. John’un pasta tarifini okuması, malzemeleri eklemesi ve keki fırına verme süreci yani işin yapılma süreci bir Process’tir.

John, kekin 3. malzemesini karışıma eklerken oğlunun içeri koşarak geldiğini ve arı tarafından sokulduğunu söylediğini varsayalım. John, kekin yapım aşamasında hangi adımda kaldığını (3. malzemede kaldığını) deftere yazdıktan sonra (Process’in durumu (state) böylece kaydedilmiş oldu), doğrudan oğlunun yanına yardımcı olmak için gitti. Arı sokmasını görünce ilk yardım defterini açıp arı sokması ile ilgili talimatları okudu. John yani CPU’muz, birbirinden farklı iki program arasında (kek tarifi ve ilk yardım defteri), bir process’ten (kek harcı hazırlamak) daha öncelikli bir process’e (oğlunun sağlık durumuna bakmak) geçiş (Switch) yaptı. İlk yardım tamamlandıktan sonra John, kek harcını hazırlamaya geri dönerek defterine baktıktan sonra (State kontrolü) 3. malzemeyi harca ekleyerek işini yapmaya devam etti.

Bu analojide anlatılmak istenen bir diğer nokta da şu ki, Process; bir çeşit işlemin olduğu hareketliliktir. Program ise kağıda yazılmış bir komut listesidir.

Process Scheduler tarafından hangi processin seçileceği ise Scheduling Algoritmalarına dayanmaktadır. Scheduling Algoritmaları ile birlikte tek core’a sahip bir CPU’yu paylaşımlı olarak kullanabiliyoruz. Bu algoritmaları da sonraki yazılarımda incelemeyi planlıyorum 🚀

İşletim Sistemi Bir Process’i Nasıl Başlatır?

İşletim Sistemi, Process’i 4 farklı şekilde başlatabilir:

  1. Sistem’in Başlatılması (System Initialization):
    Bir bilgisayarı açtığımız zaman, birçok Process İşletim Sistemi tarafından başlatılır. Bu processlerden bazıları Foreground Process olarak tanımlanırken bazıları da Background Process olarak isimlendirilmektedir.
    Kullanıcının etkileşime girdiği processler , Foreground Process olarak isimlendirilir. Kullanıcı etkileşimi ile alakasız olan ama belirli bir amaç uğruna sistem tarafından başlatılmış olan processler ise Background Process olarak isimlendirilir.
    Örneğin; sistemde çalışmayan bir uygulamaya tıklayarak run etmemiz sonucu etkileşim sağlanacak ekranı göstermek için işletim sistemi bir Foreground Process başlatmış olur. Background Process’lere ise Mail Receiver örnek olarak verilebilir. Yani mail geldiği an bekleme durumundan çalışma durumuna geçerek işlevini yerine getirir.
    Ek olarak Background’da çalışan, belli tetiklemeler sonucu aktif olan Process’ler, Daemon olarak isimlendirilmektedir.
  2. Çalışan Process’in Sistemden Yeni Process Başlatma İsteği:
    Running State’e sahip bir process, yaptığı işi daha verimli yapabilmesi için sistemden yeni process başlatma isteğinde bulunabilir. Bu istek sonucunda da sistem yeni bir process başlatır.
  3. Kullanıcı İsteği:
    Kullanıcının komut girmesi sonucunda veya bir uygulamayı çalıştırmak amacıyla iconuna iki kez tıklanması sonucu yeni bir process başlatılabilir.
  4. Batch Başlatılması:
    Belirli bir zamanda yapılması gereken işleri Batch Job olarak isimlendirmekteyiz. İşletim Sistemi de bu işi yapabilmek için bir process başlatır.

Peki İşletim Sistemi Bir Process’i Nasıl Sonlandırır?

Bir Process’i sonlandırmak (Terminate) için 4 farklı senaryo vardır:

  1. Normal Sonlandırma (İstem sonucu — Voluntary):
    Process’lerin “işim bitti” çağrısı yapması sonucunda ya da kullanıcının uygulamayı kapat iconuna tıklaması sonucu oluşan senaryodur.
  2. Error Sonucu Sonlandırma (İstem sonucu — Voluntary):
    Process’in bir Fatal Error bulması sonucunda oluşan durumdur. Kullanıcı, bu hata ile ilgili bir pop up gösterilmesi sonucu bilgilendirilirip, kullanıcının tekrar işlem yapması istenebilir ya da doğrudan process sonlandırılabilir.
  3. Fatal Error Sonucu Sonlandırma (İstem dışı — Involuntary):
    Process’te bir bug olması (Örneğin yanlış hafıza adresini hedefleyerek işlem yapmaya çalışmak ya da bir sayıyı 0'a bölmeye çalışmak) sonucu process’in sonlandırıldığı senaryodur.
  4. Başka Process Tarafından Sonlandırma (İstem dışı — Involuntary):
    Process başka bir Process’i ve onun başlattığı tüm Process’leri sonlandırabilir. Bu işlemin yapılabilmesi için, sonlandıracak (Killer) process’in, sonlanacak (Killee) Process’ten daha yüksek bir yetkiye sahip olması gerekmektedir.

Process Durumları (States)

Bir Process’in, içinde bulunabileceği 3 durum vardır:

  1. Ready
  2. Running
  3. Blocked

Scheduler’in planlaması sonucu bir Process, işini tamamlayana kadar bu üç state arasında gidip gelir.

Process’in Stateler Arası Geçiş Temsili

Grafikteki bu geçişler sırasıyla aşağıdaki gibidir:

1. İşletim Sisteminin, process’in o an devam edemeyeceği (Örneğin I/O’dan bir veri beklemesi) sonucu yapılan geçiştir.

2 ve 3. Process Scheduler tarafından hangi processin çalışacağının seçilmesi sonucu gerçekleşen geçişlerdir.

4. Block’lanan process’in çalışmaya hazır olması durumunda (Örneğin I/O’dan bir veri gelmesi) gerçekleşen geçiştir.

Umuyorum ki bu yazı sizlere bir fayda sağlamıştır 😄 Bana ulaşmak için aşağıdaki linkleri kullanabilirsiniz:

Time slicing, evet 🤠 Kaynak: Giphy

Yazımda Faydalandığım Kaynaklar:

--

--

İ. Başar YARGICI
folksdev

Software Developer at ING • Computer Engineering Student