Sitemap

(Az) Thread hovuzu & Process & Thread…

6 min readJan 30, 2022

--

Press enter or click to view image in full size

Məqalə mövzularını interview-larda ən çox rastlaşdığım suallara əsasən yazıram.

Bugünkü mövzuda onlardan biridir hansı ki,hər bir developerin(xüsusilə Backend) bilməli olduğunu düşünürəm.

Bu anlayışlar cpu-un iş prinsipləri ilə bağlı olduğu üçün proqramlaşdırma dilindən çoxda asılı olmayan ümumi anlayışlardır və teorik olaraq bəzi anlayışları izah edəcəm.

Bu məqalədə toxunacağım mövzular:

Thread nədir? Hansı növləri var? Urgent Thread nədir? Fərqləri nələrdir?

Process və Child Processlər nələrdir? Thread ilə fərqləri nələrdir?

Multi-Thread,Single-Thread process nə deməkdir?

Thread pool nədir? Necə idarə olunur?

Thread pool-un limiti nə qədərdir və dəyişmək mümkündürmü?

Thread Secheduler necə işləyir?

Process Control Block və Processes table və sair bu kimi movzulara toxunacam bu məqalədə.

Xoş mütaliələr…

Thread & Process

Thread birdən çox işi eyni anda edə bilməmizə şərait yaradan konseptlərdən biridir.

Thread-lər Kernel Level ve User Level threadlər olaraq 2 yerə bölünür və tipindən asılı olmayaraq hər bir thread eyni zaman kəsimində yalnız bir iş görə bilir.

Process isə run olunmasını gözləyən proqramdır. Başqa sözlə thread-lər toplusu da deyə bilərik.

Hər hansı bir program(VS Code,Anydesc…) işləmədiyi müddətdə program’dır əgər işə salsaq artıq ona uyğun bir process yaranacaq.

İşə salınmış hər proqram üçün minimum 1 process mütləq işləyir. Əməliyyat sisteminin run olması da bura daxildir.

Process başladılanda ona uyğun müəyyən bir resources ayrılır və daxilindəki threads bu resources-ı istifadə edirlər.

Hər Process daxilində başqa process-lərə də bölünə bilir.Belə processlərə Child Process-lər deyilir.

Press enter or click to view image in full size

Process-lərin yaradılması Tree Structure ilə heyata keçirilir,yəni, hər Child process də öz Child processlərini yarada bilər.

1 proqram 1 dən çox processdə işlədə bilər. Bunun avantajı process-in tez bitməsi olsada dezavantaji RAM da çox yer işğal etməsi və CPU-nu çox yükləməsidir.

Process PCB(Process Control Block) adlanan data strukturla idərə olunur.

Processlə bağlı bütün məlumatlar PCB vasitəsi ilə Process table-da saxlanılır.

Process daxilində yalnız 1 thread işləyirsə həmin process Single-Thread,

1 dən çox Thread işləyirsə Multi-Thread process adlanır.(async I/O)

Məsələn 1 process daxilindəki 30 işi eyni anda görmək istəsək, 30 thread-ə ehtiyyacımız olacaq.

Birdə əsas anlayışlardan biri olan Cluster anlayışı var hansı ki, performansı optimize etmək üçün Child processlərin yaradılma(fork) yoludur amma çox uzun mövzu olduğu üçün növbəti məqaləyə saxlayacam bunu. Sadəcə bilməyənlər üçün belə bir şeyin olduğunu da bilmək kifayətdir hələki.

Press enter or click to view image in full size
Press enter or click to view image in full size

Difference between Process and Thread

Process is isolated but Threads share resorces(data, code, files,memory).

Processlər bir-birindən tam izolə olunmuş formada işləyir,yəni, fərqli resources istifadə edirlər amma Threadlər eyni resorces-u paylaşırlar.

If one process is blocked, then no other process can execute.

1 process block olarsa digərləri o unblock olana qədər işləmir amma 1 Thread block olarsa digəri onun işini görə bilir.

Changes to the parent process does not affect child processes.

Parent process-dəki dəyişiklik Child process-lərə təsir etmir amma Main Thread-dəki dəyişiklik digər thread-lərı təsir edir.

Process takes more time for creation unlike Thread.

Thread-in yaradılması və sonlandırılması Process-ə nisbətən çox qısa zaman alır.

Press enter or click to view image in full size

Difference between User Thread(UT)and Kernel Thread(KT)

Recognizing by OS

Yalnız “KT” Operationg System tərəfindən tanınır.

Implemention

“UT ” User tərəfindən, “KT ” isə OS tərəfindən impliment olunur.

Hardware support

Yalnız “KT”-in Hardware support-a ehtiyacı var.

Difficulty implementing

“UT ” implimentasiyası sadə,“KT ” implimentasiyası isə çox mürəkkəbdir.

Press enter or click to view image in full size

Thread Pool

Get Nazar Pashazade’s stories in your inbox

Join Medium for free to get updates from this writer.

Məqsədi sistemdəki thread sayını kontrolda saxlamaq və işi bitən threadləri sonlandırmaq yerinə yeni işlər üçün gözlətməkdir.

Bir Thread pool yaradılanda kankret sayda Thread yaranır və onlara uyğun iş gələnə qədər gözlədilir.

Məsələn NodeJS-də Thread pool avtomatik Libuv tərəfindən yaradılır və “Libuv thread pool”-un default max Thread tutumu 4-dür.

Thread pool-u manage etmək üçün bizim Queue-yə ehtiyacımız var hansı ki, əsas iki deQueue və enQueue method-larını istifadə edir.

Gəlin bu anlayışları Multithreading ile birlikdə anlamaga çalışaq.

Arxada Thread Pool istifadə etdiyi üçün crypto library-sinin pbkdf2() method-unu istifadə edəcəm.

Press enter or click to view image in full size

Nə baş verdi?

“Libuv thread pool”-un default ölçüsü 4-dür amma nümunədə 5 task var.

Bu halda task-ların hərəsinə uyğun bir thread işləyəcək.

Və bu thread-lər “OS Thread Scheduler” tərəfindən core-lar arasında paylaşılacaq.

OS Thread Scheduler-in əsas məqsədi hansı thread-in nə vaxt icra olunmasını manage etməkdir.

Məsələn şəkildə Mouse-un hərəkəti və Keyboard-ın istifadəsi kimi işləri görən thread-lər Urgent Threads olaraq qəbul olunur.

Scheduler həmin Urgent Threads-in çox gözləməməli olduğunu bilir və ilk əvvəl onları icra etməyə çalışır.

Press enter or click to view image in full size

Mövzudan uzaqlaşmadan qayıdaq yuxarıdakı məsələyə:

Default 4 thread-imiz olduğu üçün ilk 4 task eyni anda işə düşəcək.

Digər 5ci task-a uyğun boş thread olmadığı üçün Thread-lərdən hansı işini tez bitirsə 5ci task-ı icra edəcək.

Ona görədə ilk 4-ü eyni anda(2 seconds) console-a yazılacaq sonra 5-ci (+1 second).

Press enter or click to view image in full size
Press enter or click to view image in full size

Thread pool-un ölçüsünü necə dəyişə bilərik?

Bunun üçün aşağıdakı env variable-ı istifadə edəcəyik:

process.env.UV_THREADPOOL_SIZE = 5 (mac,linux)

amma Windowsda bunun işləmədiyini düşünürəm ona görədə run scripti olaraq istifadə edəcəm.

  "scripts": {
"start": "set UV_THREADPOOL_SIZE=2 & node threads.js"
}
,
Press enter or click to view image in full size

size=1 verəndə tek-tek, size=2 verdiyimiz halda isə nəticələr 2–2–1 seklinde console-a yazılacaq.

Press enter or click to view image in full size

Note: “fs” və “crypto ”kimi standart NodeJS libraries arxada thread pool-dan istifadə edir.

Note: Default Thread pool-da 4 thread olsada aşağıdakı halda 6 taskın hamısı eyni vaxtda işə düşəcək.

Yəni, bütün nəticələr eyni vaxtda yazılacaq console-a.Çünki network ilə bağlı bütün prosesslər async-dur.

Belə prosesslər Thread Pool-dan kənarda işləyir və direct OS tərəfindən manage olunur.

Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

Ən sonda task manager ilə cpu-nun bu dəqiqəki vəziyyətinə baxaq:

Press enter or click to view image in full size

Əlavə məlumat üçün usefull linkləri Title-lara əlavə etmişəm.

Ümüd edirəm faydalı olmuşdur. Diqqətiniz üçün təşəkkürlər.

--

--