Skip to content

Parallel dasturlash

Biz kompyuterda ishlayotgan vaqtimizda kompyuter bir vaqtning o'zida juda ko'plab amallarni bir vaqtda bajarayotganini ko'ramiz, aslida ham o'zi shundaymi? Kompyuter bir vaqtning o'zida ko'plab amallarni bajaradimi? Bu qismda shunga to'xtalib o'tamiz, lekin unda oldin ba'zi tushunishimiz kerak bo'lgan mavzular bor:

  • CPU va ko'p yadroli tizimlar (multi-core processors)
  • I/O operatsiyalari (disk, tarmoq va protsessor)
  • Protsess va oqimlar (process vs. thread)
  • Parallel va ko'p oqimli (multi-threading) dasturlar

Agar biz yuqorida sanab o'tgan mavzularni yaxshi tushunmasak concurrency, parallelism va Go goroutinelarni yaxshi tushunmaymiz yoki tushunishimiz qiyinroq bo'ladi.

CPU va ko'p yadroli tizimlar (multi-core processors)

CPU (Central Processing Unit) – kompyuterning asosiy hisoblash va boshqaruv komponenti bo'lib, barcha muhim hisob-kitoblarni bajaradi. U quyidagi asosiy qismlardan iborat:

  • ALU (Arithmetic Logic Unit) – arifmetik va mantiqiy amallarni bajaradi.
  • CU (Control Unit) – buyruqlarni boshqaradi va ma’lumotlar oqimini tartibga soladi.
  • Registrlar – tezkor vaqtinchalik ma’lumotlar saqlanadigan joy.

Info

Yuqoridagi qismlar haqida to'liqroq boshqa manbaalardan o'rganishingizni maslahat beraman.

Ko'p yadroli protsessorlar – bitta fizik protsessor ichida bir nechta hisoblash yadro (core) joylashgan arxitekturaga ega bo'lib, ular parallel ravishda ishlay oladi. Masalan, Dual-Core (2 yadro), Quad-Core (4 yadro), Hexa-Core (6 yadro), Octa-Core (8 yadro) va hokazo.

Ko'p yadroli (multi-core) protsessorlar bir vaqtning o'zida bir nechta hisoblash jarayonlarini bajarishga qodir bo'lgan CPU arxitekturasi bo'lib, zamonaviy kompyuterlar va mobil qurilmalarda keng qo'llaniladi.

Ko'p yadroli tizimlarning afzalliklari

  • Ko'p vazifali ishlash (Multitasking) – Bir vaqtning o'zida bir nechta dasturlar ishlaydi.
  • Yuqori ishlash tezligi – Har bir yadro alohida vazifani bajara olgani uchun umumiy hisoblash tezligi oshadi.
  • Energiyani tejash – Kam quvvat sarflagan holda yuqori unumdorlikka erishish mumkin.
  • Parallel ishlash – Ilovalar va operatsion tizimlar bir nechta yadrodan foydalanib, vazifalarni bo'lib bajaradi.

Ko'p yadroli protsessorlar qanday ishlaydi?

  • Simultaneous Multithreading (SMT) – har bir yadro bir vaqtning o'zida bir nechta jarayonlarni bajaradi.
  • Parallel Computing – katta hisob-kitob vazifalari bir necha yadro o'rtasida taqsimlanadi.
  • Task Scheduling – operatsion tizim muhim jarayonlarni turli yadroga taqsimlab beradi.

Misol uchun agar siz bir vaqtning o'zida brauzerda video tomosha qilayotgan bo'lsangiz, Microsoft Wordda hujjat yozayotgan bo'lsangiz va antivirus tizimi skaner olib borayotgan bo'lsa, har bir dastur alohida yadroda ishlaydi. Natijada kompyuter sekinlashmaydi va samaradorlik oshadi.

I/O operatsiyalari (disk, tarmoq va protsessor)

I/O (Input/Output) — bu kompyuterning ma'lumotni qayergadir yuborishi yoki undan qabul qilishi degani. Bu quyidagilarni o'z ichiga oladi:

  • Input (kiritish) — tizimga ma'lumot keladi (masalan, klaviatura, fayl, tarmoqdan so'rov).
  • Output (chiqarish) — tizimdan ma'lumot chiqadi (masalan, ekranga chiqarish, faylga yozish, so'rov javobini yuborish).

I/O operatsiyalariga quyidagilar kiradi:

  • Disk I/O (fayl o'qish/yozish)
  • Network I/O (tarmoq orqali data olish/jo'natish)

I/O operatsiyalarini samarali bajarish — bu tizimning tashqi qurilmalar yoki resurslar bilan ma'lumot almashinish (masalan, diskda fayl o'qish/yozish, tarmoq so'rovlarini yuborish/olish, foydalanuvchi inputini qabul qilish) operatsiyalarini optimallashtirishni anglatadi. Yaxshi I/O operatsiyalari bilan minimal kutish va resurslardan optimal foydalanish orqali tizimning umumiy ishlash tezligini oshirish mumkin.

I/O operatsiyalariga misollar:

Disk I/O (fayl o'qish va yozish):

  • Fayl tizimi orqali fayllarni o'qish, yozish yoki o'chirish operatsiyalari.
  • Masalan, katta ma'lumotlarni faylga yozish yoki o'qish — bu I/O operatsiyasi hisoblanadi.

Tarmoq I/O (network I/O):

  • Tarmoq orqali ma'lumot yuborish va olish, masalan, HTTP so'rovlarini yuborish va javoblarni olish, fayllarni serverga yuklash yoki serverdan yuklab olish.
  • Masalan, web saytdan ma'lumot olish yoki API xizmatdan ma'lumot olish — bular tarmoq I/O operatsiyalaridir.

Foydalanuvchi interfeysi (UI) I/O:

  • Foydalanuvchidan ma'lumot olish yoki ekranda ma'lumotlarni ko'rsatish, klaviatura, sichqoncha va boshqa input qurilmalari orqali foydalanuvchi bilan o'zaro aloqada bo'lish.
  • Masalan, foydalanuvchining forma maydonlarini to'ldirishi yoki tugmalarni bosishi — bu UI I/O hisoblanadi.

Ma'lumotlar bazasiga I/O:

  • Ma'lumotlar bazasiga so'rov yuborish va undan ma'lumot olish, yozish.
  • Masalan, SQL so'rovlarini bajarish yoki ORM yordamida ma'lumotlarni saqlash va olish — bu ham I/O operatsiyalariga kiradi.

Protsess va oqimlar (process vs. thread)

Operatsion tizimlar (OT) ko'plab vazifalarni samarali bajarish uchun protsesslar va oqimlardan (threads) foydalanadi. Quyida protsesslar va oqimlar o'rtasidagi asosiy farqlarni ko'rib chiqamiz:

Protsess - bu ishlayotgan dastur yoki dastur qismini tashkil etuvchi, mustaqil ravishda bajariladigan tizim obyekti. Har bir protsessning o'ziga xos xotira, resurslar va o'zgaruvchilar mavjud. Protsesslar bir-biridan izolyatsiya qilingan va ular orasidagi aloqa uchun maxsus vositalar kerak bo'ladi.

Oqim - bu protsessning kichik bir qismini tashkil etadi va bir xil protsess doirasida bir nechta oqimlar bir vaqtning o'zida ishlashi mumkin. Oqimlar bir xil xotira va resurslarga ega bo'lishadi, bu esa ularni protsesslarga qaraganda tezroq va samaraliroq qiladi.

Qaysi biri samarali?

Protsesslar katta va murakkab dasturlarni boshqarish uchun qulay, chunki ular mustaqil va xavfsizdir. Oqimlar esa resurslardan samarali foydalanish va bir nechta vazifani parallel bajarish uchun eng yaxshi tanlov, ayniqsa tezkor va ko'p vazifali tizimlarda.

Odatda, katta va murakkab tizimlarda ikkala konseptdan ham foydalangan holda, protsesslar asosiy vazifalarni bajaradi, oqimlar esa ichki vazifalar va parallel hisoblashlarni amalga oshiradi.

Parallel va ko'p oqimli (multi-threading) dasturlar

Dasturlashda parallelizm va ko'p oqimli dasturlarni ishlatish tizimning samaradorligini oshirish va bir vaqtning o'zida ko'plab vazifalarni bajarish imkoniyatini yaratadi. Bu ikki yondashuv bir-biriga o'xshash bo'lsada, ularning amalga oshirish usullari va ishlash prinsiplari farqlidir.

Ko'p oqimli dasturlash — bu bir dastur doirasida bir nechta oqimlar (threads) yaratish orqali parallel ravishda bir nechta vazifalarni bajarish jarayonidir. Har bir oqim protsessning kichik bir qismini bajaradi va ular bir-biriga mustaqil ishlash imkoniyatiga ega bo'ladi.

Parallel dasturlash — bu bir nechta protsess yoki oqimlar yordamida bir vaqtning o'zida bir nechta vazifani bajarish usulidir. Parallel dasturlashda, asosan muayyan vazifalarni bir nechta jarayonlarda (protsesslarda) yoki oqimlarda bir vaqtning o'zida bajarish orqali, hisoblash yukini taqsimlash uchun foydalaniladi. Bu ko'pincha ko'p yadroli (multi-core) protsessorlardan foydalanishni kerakligini anglatadi.

Qaysi biri yaxshiroq?

  • Ko'p oqimli dasturlar I/O operatsiyalari yoki foydalanuvchi interfeyslarini boshqarishda samarali bo'ladi. Bu holatda, ko'p oqimli yondashuv osonroq va tezroq ishlaydi, chunki ular bir xil protsessda ishlaydi va sinxronizatsiya osonroq amalga oshiriladi.

  • Parallel dasturlar ko'proq hisoblash yuklarini taqsimlash uchun ishlatiladi, masalan, matematik hisoblashlar, katta ma'lumotlarni tahlil qilish yoki ilmiy hisoblashlar. Bu yondashuv ko'p yadroli protsessorlardan foydalanishni talab qiladi va ishlash samaradorligini oshiradi.

Concurrency and Parallalism

Concurrency — bu bir vaqtning o'zida bir nechta vazifani bajarishga urinish bo'lib, ular amalda bir vaqtda bajarilmasligi mumkin (ayniqsa, agar tizimda faqat bitta protsessor yadrosi bo'lsa). Dastur bir vazifani vaqtincha to'xtatib, boshqa bir vazifaga o'tadi, keyin esa yana oldingi vazifasini davom ettiradi. Bu holat task switching ( vazifalar almashinuvi) orqali amalga oshiriladi.

Buni misol orqali aniqroq tushuntiraman. Tasavvur qiling, siz biror korxonada operator bo'lib ishlaysiz va navbatchi bo' lgan kuningizda faqat o'zingiz ishda qoldingiz, barcha telefon qo'ng'iroqlariga o'zingiz javob berishingiz kerak. Bir paytning o'zida bir nechta mijoz qo'ng'iroq qilganida, siz har bir mijozga navbat bilan javob berasiz — biriga javob berib, uni kutishga qo'yib, boshqasiga javob berasiz. Bu orada boshqa mijozlar sizni kutishda davom etadi. Ya’ni, siz barcha qo'ng'iroqlarga bir vaqtda javob bermaysiz, balki navbat bilan, biridan ikkinchisiga o'tib javob berasiz.

Parallelism (bir vaqtning o'zida bir nechta ishni bajarish) Parallelism — bu haqiqiy bir vaqtning o'zida bir nechta vazifani bajarish. Bu faqat ko'p yadroli (multi-core) tizimlarda sodir bo'ladi, har bir yadro o'zining alohida ishini qiladi.

Yuqoridagi misolimizdagi operatorlar ko'p bo'lsa har bir mijozga alohida operator xizmat ko'rsatadi ya'ni paralell ish bajariladi.

Xususiyat Concurrency Parallelism
Maqsad Ko'plab ishlarni boshqarish Ko'plab ishlarni bir paytda bajarish
Vazifalar soni Bir vaqtning o'zida ko'rinadi Haqiqiy bir vaqtning o'zida bo'ladi
Kerakli resurslar Bitta yadro yetarli Ko'p yadro yoki GPU kerak
Misol Qo'shimcha ishlarga javob berish 1000 rasmni bir paytda tahrirlash
Performance yondashuvi Responsiveness (javobchanlik) Throughput (umumiy ishlov)

Biz yuqorida Thread va Processlar haqida gaplashdik, bu tushunchalar Concurrency va Parallelismlarning amalda bajarish usullari hisoblanadi.

Tushuncha Nima uchun kerak? Qaysi kontseptsiyaga kiradi?
Thread Bitta jarayon ichida ko'p ishlarni bajarish (tez switching bilan) Concurrency (ko'pincha)
Multiprocessing Bir nechta jarayon orqali ishni bo'lish Parallelism (ko'pincha) Parallelism (ko'pincha)

Diagramma tarzida:

graph TD; A[Concurrency] --> B[Threading]; A --> C[Async/Await]; D[Parallelism] --> E[Multiprocessing]; D --> F[Multicore CPU];

Threading ko'pincha concurrency uchun ishlatiladi. Chunki bir vaqtning o'zida emas, tez navbat bilan ishlaydi. Multiprocessing ko'pincha parallelism uchun ishlatiladi. Chunki bir vaqtda bir nechta processlar ishlaydi.

Yuqorida ko‘rib chiqqanlarimiz umumiy tushunchalar edi. Go dasturlash tilida esa bu tushunchalar biroz boshqacha talqin etilishi mumkin. Shunga qaramay, bu tushunchalarni bilish muhim hisoblanadi.