Concurrency, Asynchronous, Synchronous, Parallelism, Program, Thread, Process, Task, Core — 1

Tugay Ersoy
5 min readJan 1, 2020

--

Merhaba, uzun zamandır kafamı kurcalayan ve birbiri ile ilişkili bu kavramları; tek bir çatı altında, ayrıntılı inceleme gereksimine ihtiyaç duydum. Bu sebeple bu yazı serisinin ilki olan makalemde bu kavramların hardware ve OS (Operating System) tarafında ne ifade ettiğini aynı zamanda nasıl yorumlandığını inceleyeceğim bir yazı olacak. Şimdiden keyifli okumalar.

Günümüz sistemlerinde iki farklı işlemci yapısı mevcuttur. MCU (Micro Controller Unit) ve MPU(Micro Processor Unit) sistemlerin kullanım alanlarına göre bu iki farklı yapı tercih edilebilir. MCU’da tek çip üzerinde, CPU (Central Processor Unit), RAM, Timer, Storage yer alırken; MPU da ise hepsi farklı çipler üzerinde yer alır. Günümüz bilgisayarlarında genellikle işlemci ve diğer elemanlar farklı çipler üzerinde yer almaktadır.

MCU ve MPU yapısı

Bizim için önemli olan kısım CPU, yani bu çevre birimlerin yönetimini sağlayan ve algoritmaları yorumlayan birimdir. CPU bir programın işletilmesi için gerekli olan talimatları çevre birimlere ileterek bu program için gereklilikleri yerine getirir.

Program işletim süreci

Process, işlemci üzerinde işletilen aynı zamanda içerisinde programın işletilmesi için code, data ve file bulunan bir instance’dır. Bir programın işletimi esnasında bir process oluşabileceği gibi N adet process oluşabilir (Chrome buna güzel bir örnek). Kısaca process, programın işlemci içerisinde işletilen halidir.

Process’in yapısı

Process içerisinde N (N>0) adet thread, code, registers ve stack bulunur. Threadler aynı process içerisinde ortak data, file, code’u kullanırlar fakat memory için bu durum farklıdır.

In-Memory Layout of a Program (Process)

Bir process’in memory üzerinde aloke ettiği alan şekildeki gibi görülmektedir. Processler bu alanları ortak kullanamazlar. Processlerin aloke ettiği alanlar bağımsızdır fakat threadler aloke edilen bu alanları aynı process için kullanabilirler.

Bir process için threadler, o process’in aloke ettiği memory üzerinde static, heap ve code alanlarını ortak kullanırlar. Bu sebeple threadler arasında iletişim Processlere göre çok daha hızlı gerçekleşir aynı zamanda threadlerin başlatılması ve sonlanması çok hızlıdır context — switching durumu aynı process altındaki threadlerde, processlere göre çok daha hızlı gerçekleşir.

Thread ve Task

Core yani işlemci çekirdeği gerçekte t anında üzerinde 1 thread çalıştırabilir (hyper threading durumu hariç). Geçmişte sistemler genellikle tek çekirdekli olarak tasarlanıyordu. Zamanla işlem hacminin artması sebebi ile işlemciler yeterli gelmemeye başladı. Bunun için clock rateler arttırıldı böylelikle Task(Program Instruction)’ların daha hızlı işlenmesi sağlandı fakat böyle olunca işlemciler daha çok enerji tüketmeye ve ısınmaya başladılar. Bu sebeple Multi-Core (Çok çekirdekli) yapılara geçildi ve aynı anda birden fazla thread işletilebilir hale geldi.

Process’in 1 veya N(N>0) thread’den (iş parçacığı) oluştuğunu bahsetmiştim. Bu threadler core üzerinde, Taskların gerçekleştirilmesi için oluşturulan bir nevi yollardır. Sürekli yeni Thread oluşturup silmek maliyetli olduğu için Threadpool denilen bir pattern ortaya konmuştur. ThreadPool Concurrency(Eş zamanlılık)’i sağlamak için ortaya atılan bir patterndir. .Net dünyasında bakımı CLR(Common Language Runtime) tarafından yapılır.

Queue içerisinde bekliyan Tasklar ve ThreadPool içerisindeki Threadler

.Net içerisinde Worker Thread ve ICOP Thread (Input Output Completion Port) iki farklı ThreadPool içerisinde yer alırlar fakat teknik anlamda pek bir farkları yoktur. ThreadPool’un bir kapasitesi bulunmaktadır. İçerisinde belli sayıda Thread yer alır. İki çeşit Thread aynı ThreadPool içerisinde yer alsaydı I/O Threadler bütün Threadleri aloke edebilir ve tamamlanması beklenebilirdi bu da Worker Threadların çalışamaz hale gelmesini sağlardı (deadlock). Bu sebeple ICOP ve Worker ThreadPool’lar ayrıdır..

Visul Studio Debug yaptığımda oluşan Threadler.

Resimde de görüldüğü üzere Main Thread, Programı çalıştıran başlangıç Thread, Custom olarak oluşturduğumuz Thread, Worker Thread ve Task oluşturup işlettiğimizde ThreadPool içerisinden Idle olarak bekleyen bir Thread bize tahsis edildi. 3 farklı Thread içerisinde Program işletildi. Diğer önemli bir nokta ise bu 3 Thread aynı Process altında yer almaktadır.

Not: Bir Task bir Thread içerisinde işletilebileceği gibi farklı Threadler içerisinde de işletilebilir.

Concurrency ve Parallelism

Concurrency (Eş Zamanlılık) yani birden fazla Task’ı aynı anda çalıştırma.

Concurrency ve Parallelism

İlk şekilde 3 farklı Thread bulunmakta fakat aynı anda sadece 1 Task’ı işletebilmektedir (Single Core). Bu sebeple Eş zamanlı çalışma kavramsal açıdan gerçekleşmiş ama fiziksel açıdan gerçekleşmemiştir. İkinci şekilde ise Tasklar 3 Farklı Thread üzerinde aynı anda işletilebilmektedir (Multi Core). Bu işletime Parallel Execution denilmektedir. Bu şekilde eş zamanlılık hem fiziksel hem de kavramsal olarak gerçekleşmiş olur. Sonuç olarak Single Core’da Concurrency Context Switching ile Multi Core’da ise Parallel Execution ile sağlanmış olmaktadır.

Conccurency, Single Core
Conccurency, Multi Core

Not: Resimlerde yer alan Processleri Task olarak kabul ediniz.

Not: farklı kaynaklarda Multi Core için bu işletimi Parallelism, Single Core içinse Concurrency olarak keskin bir ayrım yapılmış ama genellikle kaynaklarda Multi Core sistemlerde Parallelism ile Concurrency sağlanmakta şeklinde geçmektedir.

Bir sonraki yazımda Async ve Sync kavramları üzerinde tekrar bu terimleri inceliyor ve .net tarafında implemente ediyor olacağım.

Okuduğunuz için teşekkürler :)

Kaynakça

  1. https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/
  2. https://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core
  3. https://medium.com/swift-india/concurrency-parallelism-threads-processes-async-and-sync-related-39fd951bc61d#72ba
  4. https://www.c-sharpcorner.com/article/task-and-thread-in-c-sharp/
  5. https://www.guru99.com/cpu-core-multicore-thread.html
  6. https://www.os-book.com/OS9/slide-dir/index.html

--

--