Multiprocessing və Multithreading nədir?
Multiprocessing və Multithreading arasındakı fərq nədir?
Hər bir proqram bir proses kimi rama düşür və bizim CPU həmin proqramın kodlarını oxuyaraq onları icra edir. Hər bir prosesin əməliyyat sistemində 3 hissəsi olur. Prosesin birinci hissəsi fixed(dəyişilməz) ölçüdə olur. Həmin hissəyə proqramımızda olan constantlar,stringlər bir sözlə dəyişilməyən məlumatlar yazılır. Hər bir komputerin arxitekturasından asılı olaraq həmin hissənin bir ölçüsü olur. Həmin hissəyə, yəni birinci hissəyə stack deyirlər. 2-ci hissədə isə əmrlər toplusu olur. Yəni döngülər,funksiyalar,şərt operatorlarımız və sair., 2-ci hissəyə isə instruction deyirlər. Sonuncu hissə, yəni 3-cü hissə isə böyüyən ya da azalan hissədir. Məsələn biz bir for döngüsü yaratmışıq və hər döngü tamamlandıqca massivə yeni məlumat yazırıq və ya silirik. Həmin əməliyatlara uyğun olarağ 3-cü hissə ya böyüyür yada kiçilir. 3-cü hissəyə isə hip deyirik.
Əməlyat sistemi hər bir proses üçün müəyyən prioritet verir və hər bir prosesin icra olunması üçün müəyyən müddət verir. Bu müddət milli saniyələrlə ölçülür. Əgər verilən müddətdə CPU 3 hissənin 3-də yerinə yetirərsə həmin əməlyat bitmiş sayılır və komputerin ramından silinir. Əgər həmin müddətdə bitirə bilməzsə CPU-nun registerlərində qeyd olunur və həmin prosesin prioriteti və zamanı dəyişir. Məsələn, eyni anda 4 proqram işləyirsə 2-ci proqram vaxtında icra olunmazsa onun prioriteti olur 5, zamanı isə 50ms idisə olur 40ms(rəqəmlər təsadüfi olaraq qeyd olunub) .CPU keçir növbəti prosesləri yerinə yetirməyə. Bu gedişat digər proseslər üçündə keçərlidir. CPU yarıda qalmış proqrama çatanda isə qaldığı sətirdən prosesi(proqramı) icra etməyə davam edir. Bu zamanlar çox az olduğundan biz proseslərin dəyişməsinin fərqinə varmırıq.
Bir prosesdən digər proseslər yaranır. Komputer işə düşəndə ilk yaranan prosesin adı init-dir. Və həmin prosesdən digər proseslər yaranır. Bəzən bizim yazdığımız proqrama da ehtiyac duyulur ki, müxtəlif proseslərə bölək. Səbəbi ondan irəli gəlirki bizim yazdığımız kodlar bir prosesdə olsa və CPU-nun verdiyi zamanda bitməzsə ləngimə baş verəcək bunun nəticəsi olaraqda yazdığımız proqram gec cavab verəcək. Bir sözlə prosesin tez bitməsi üçün yeni bir proses yaratmağa multiprocessing deyilir. Və bununla belə biz proqramlarımızı paralel icra etdirmiş oluruq. Amma bu prosesin yaranması resurs israfına yəni ramda daha çox yer tutmasına gətirib çıxarır. Daha da ciddi problem isə bir prosesdə olan dəyişənə digər prosesdən müdaxilə etmək olmur. Bunu processor təhlükəsizlik baxımından edir. Yoxsa bir proqram digər proqramın məlumatlarını oxuya bilərdi. Bunun üçün yeni bir əməliyyat gətiriblər. Bu əməliyyatın adı unix socket-dir. Belə ki, hər bir prosesdə bir biriylə əlaqədə olan məlumatlar bir fayla yazılır. Həmin proseslər lazımı məlumatı fayla yazır və digəri oxuyur. Fayla yazıb oxumaq əməliyyatı, ağır əməliyyat olduğundan bu qənatə gəlmək olar ki, multiprocessing bizə çox sürət qazandırmır.
Multithreading və Multiprocessing bir-birinə çox bənzəyir. Bir proqram başka proseslər yarada bildiyi kimi başka thread-lərdə yarada bilər. Bunlarada CPU prioritet və zaman verir. Amma thread-lərin 1 və 3-cü hissəsi olmur yalnız intruction hissəsi olur. Bu thread-lər, stack və hip üçün öz ana proseslərindən istifadə edirlər. Amma bu prosesin də mənfi cəhəti var. Mənfi cəhəti odur ki, bir prosesdən 2 və ya daha artıq thread yaransa birinə lazım olan data eyni zamanda digərinə də lazım ola bilər. Bu zaman bizim proqram düzgün işləməz. Bu problemin adı race condition-dır. Məsələn, bizim bir variable(dəyişənimiz) var və dəyəri 30-dur. Bir proses də üzərinə 10 gəlirik və digərin də 20 çıxırıq. Hər iki proses də eyni zamanda icra olunduğu üçün bizdə cavab 10 olacaq. Əslində isə cavabımız 20 olmalı idi. Ona görə thread-lərə lock-lama(kilitləmə) mexanizmi gətirdilər. Lock-lama mexanizmi odurki bir thread hər hansı bir dəyişən üzərində əməliyyat edirsə kilitlənir və digər thread-lər həmin dəyişəndən istifadə edə bilmir. Thread-in işi bitdikdən sonra kilit açılır və digər thread-lər istifadə edə bilir. Amma bununda problemi var bu problemə dead lock deyirlər. Bu problemin mənbəyi isə bəzən thread-lər lock-lama xüsusiyyətini deaktiv etmirlər və digər proqramlar onu gözləyir.Buna görə bəzən bizim proqramlarımız donur və məcbur proqramdan çıxıb onu yenidən açırıq.
Qeyd: proqramın donması bir çox səbəblərdən ola bilər. Bəzi hallarda deadlock-a görə bəzənsə ramın dolub daşmasına görə və digər hallarda da baş verə bilər.