multithread-,-asynchronous-ve-parallel-proqramlasdirmanin-ferqi

MultiThread , Asynchronous və Parallel proqramlaşdırmanın fərqi

Müasir dövrdə çoxnüvəli prosessorların mövcudluğu, son illərdə daha da aktual məsələ olan concurrent proqramlaşdırmanı ortaya çıxardıb. Concurrent proqramlaşdırmada məqsəd qısa  bir zaman kəsiyində çox iş görə bilməkdir. Bir neçə dəfə intervyuda “MultihThread , Asynchronous və Parallel proqramlaşdırmanın fərqi nədir?” sualını versəm də çox az iştirakçıdan cavab ala bilmişəm. Sual bir o qədər də asan deyil... Sizin ingilis dilində oxuduğunuz bir çox C# kitablarında məhz çoxnüvəli proqramlaşdırma məsələsi Multithreadingdən başlayır. Sadəcə o kitabların bir çoxunda bu suala niyəsə yer ayrılmır..

Multithread programming

               Multithread proqramlaşdırmada əsas məqsəd ən kiçik iş vahidlərini(metodları) Thread-lərə paketləyərək işə salmaqdır. Bu imkan verirki mümkün olsa metodlar paralel, olmasa kvant vaxtı çərçivəsində fasiləli formada işə düşsünlər.

 Əgər kompyuteriniz 4 nüvədən ibarətdirsə sizin kompyuter eyni zaman kəsiyində həqiqətən(mütləq olaraq) yalnız 4 iş görə bilər! Bəs mən 10 Thread yaratsam onda necə? Çox gümanki o threadlərdən bir çoxu həqiqətən eyni anda işləməyəcək. Çünki fiziki olaraq 1 nüvədə eyni anda 1 metod işləyə bilər. Biz kompyuteri işə salanda bu nüvələrin hamısı boş olmur. Çünki əməliyyat sisteminin özünün bir sıra servisləri varki onlar da işləmək üçün nüvə tələb edirlər.    

Multihreading bəs nə işə yarayır? Bizim metodları Thread klasına paketləyərək onların nüvələri daxil olub orada işləyə bilməsini təmin edir. Multihread proqramlaşdırma Paralel proqramlaşdırma deyil! Yalnız parallel proqramlaşdırmada eyni anda fiziki olaraq bir neçə işin görülməsini təmin etmək olar. Birdəki Multithread proqramlaşdırma müxtəlif nüvələrdə işləmək üçün dizayn olunmayıb. Bununçün parallel proqramming var. Siz old school Threadlərdən istifadə edəndə Multihtread proqramming işlətmiş olursunuz. Hazırda Thread APİ-si geniş istifadə olunmur. Daha kiçik iş vahidləri olan Task-lar istifadə edirik. (Gələn dərslərdən birində Thread və Task-in fərqini izah edəcəm)

               Multithreading əsasən kvant vaxtı ilə işləyir. Kvant vaxtı hər hansı bir Thread-ə random ayrılmış zaman kəsiyidir. Bu 5-10-15 və.s nanosaniyə ola bilər.Daha çox da ola bilər. Hər bir Thread ThreadManager tərəfindən kordinasiya olunaraq nüvəyə işləmək üçün göndərilir. Ona ayrılan kvant vaxtı bitdikdən sonra Thread-in mövcud vəziyyəti TLS(Thread Local Storage)-də saxlanılır və Thread müvəqqəti dondurulur, növbəti Thread işləmək üçün göndərilir. Sıra yenidən dondurulmuş Threadə çatdırda o öz məlumatlarını TLS-dən bərpa edərək işinə davam edir. Thread işini tam bitirdikdən sonra kordinasiya siyahısından çıxarılır.Yəni hər işi görmək üçün Thread ayrılır. Sənin 10 metodun varsa deməli 10 Thread-in olacaq. Multithreading təxminən bu formada işləyir.


 Asynchronous Programming

               Asynchronous Programming isə işlərin asinxron yerinə yetirilməsi prosesidir. Asinxron proqramlaşdırmaya keçmədən öncə “sinxron və asinxron anlayışları”nı izah edək. Bir işin sinxron yerinə yetirilməsi o deməkdirki əvvəlki iş bitmədən komanda növbəti işə keçmir! Asinxron proqramlaşdırmada isə bir iş bitmədən obiri iş start götürüb işləyə bilir və həqiqətən paralllik effekti yaranır. Çox vaxt yeni başlayan proqramçılar düşünür ki ,asinxron proqramlaşdırma ilə multihreading eynidir! Amma bunlar tamam fərqli - fərqli anlayışlardır. Asinxron proqramlaşdırmanı əsasən verilənlər bazasına qoşulan zaman,internetdən hansısa servisi istifadə edən zaman(networking), fiziki diskdən məlumat oxuyan zaman və.s istifadə edirik.Çoxlarının bildiyi ,asinxron deleqatlar(APM),EAV və Task APİ(TPL) də əsasən  asinxron proqramlaşdırma prosesləri üçün nəzərdə tutulub. Çox developer asinxron proqramlaşdırmanı yalnış istifadə etdiyinə görə Multithread effekti alır və elə düşünür ki , asinxron proqramlaşdırma Thread yaradır! Asinxron proqramlaşdırma Thread yaratmır!!

Sən götürüb Asinxron APİ-yə prosessor vaxtı tələb edən iş yükləsən təbiiki yeni Thread yaranacaq! Deməli sən Asinxron APİ-ni yalnış istifadə edirsən! Başa düş bunu blət! Asinxron proqramlaşdırma APİlərini yalnız asinxron işlər üçün istifadə etməliyik.


               Deməli hər hansı bir iş, prosessor vaxtı tələb edirsə (hansısa hesablama aparır, for,foreach istifadə edərək prosessor resursu yeyirsə) onunçün ya multithread ya da parallel programming isitfadə etməliyik.(işin həcminə görə) .Əgər hər hansı bir əməliyyat prosessor vaxti tələb etmirsə, disk, internet,baza və.s istifadə edərsə ozaman asinxron model işlətmək olar.

               

Parallel programming

Parallel programming isə C# -da Parallel APİ-si vasitəsilə yerinə yetirilir. Əgər hər hansı bir metod uzunmüddətli bir iş görürsə həmin iş kiçik hissələrə parçalanaraq ayrı ayrı nüvələrə verilir. Bununla da metod daha sürətli işləyir. Misalçün əgər siz 10 milyarda qədər bir for dövrü qurmusunuzsa bunun bir nüvədə icrasını gözləmək uzun olur. Parallel programming hemin metodu daha kiçik Tasklara parçalayaraq ötürür nüvələrə və əməliyyat daha sürətli və eyni zaman kəsiyində baş verir.

 

 

Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz