Guruh talabasi masharipov San`atbekning Operatsion tizimlar fanidan


Download 38.65 Kb.
Sana30.04.2023
Hajmi38.65 Kb.
#1404249
Bog'liq
operatsion tizimdan mustaqil ishi Masharipov Sanatbek


O‘ZBEKISTON RESPUBLIKASI
OLIY VA O’RTA MAXSUS TA’LIM VAZIRLIGI

MUHAMMAD AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI
URGANCH FILIALI

KOMPYUTER INJINERINGI FAKULTETI
961-20 GURUH TALABASI
Masharipov San`atbekning
Operatsion tizimlar FANIDAN

Mustaqil ishi



Mavzu: Parallel jarayonlarni tashkil etish


Bajardi: Kompyuter injineringi fakulteti
961-20 guruh talabasi S.Masharipov


Qabul qildi: Operatsion tizimlar fani o‘qituvchisi S.Davletboyev
1-§. Parallel dasturlashga kirish Parallelik nima? Agar biz chegaraga qadar soddalashtirsak, u holda parallelizm ikki yoki undan ortiq amallarni bir vaqtning oʻzida bajarishdir. Hayotda u har qadamda paydo boʻladi: biz bir vaqtning oʻzida yura olamiz va gaplasha olamiz yoki bir qoʻl bilan bir narsani, ikkinchisini esa boshqa qoʻl bilan qilishimiz mumkin va, albatta, har birimiz boshqalardan mustaqil ravishda oʻz hayotimizni yashaymiz - siz futbol tomosha qilasiz, men bu vaqtda suzaman va hokazo. 1.1. Hisoblash tizimlarida parallellik Kompyuterlar kontekstida parallelizm haqida gapirganda, biz bir xil tizim bir nechta mustaqil amallarni ketma-ket emas, balki parallel ravishda bajarishini nazarda tutamiz. Bu gʻoya yangilik emas: vazifalar oʻrtasida almashinish orqali bir kompyuterda bir vaqtning oʻzida bir nechta ilovalarni ishga tushirish imkonini beruvchi koʻp vazifali operatsion tizimlar koʻp yillar davomida odatiy holga aylangan, haqiqiy parallellikni ta’minlovchi bir nechta protsessorli qimmat serverlar esa bundan avvalroq paydo boʻlgan. Yangi narsa - kompyuterlarning keng qoʻllanilishi boʻlib, ular nafaqat vazifalarni bir vaqtning oʻzida bajarish illyuziyasini yaratibgina qolmay, balki ularni parallel ravishda bajaradilar. Tarixiy jihatdan, kompyuterlar odatda bitta protsessor yoki yadroli bitta protsessor bilan jihozlangan va bu bugungi kungacha koʻplab ish stoli mashinalari uchun amal qiladi. Bunday mashina aslida bir vaqtning oʻzida faqat bitta vazifani bajarishga qodir, lekin vazifalarni koʻp marta almashtirishi mumkin Shunday qilib, dastlab bitta vazifa biroz ishlaydi, keyin boshqasi va oxirida hamma narsa bir vaqtning oʻzida sodir boʻlayotganga oʻxshaydi. Bu vazifani almashtirish deb ataladi. Shunga qaramay, bunday tizimlar uchun biz parallellik haqida gapirishimiz mumkin: vazifalar juda tez-tez oʻzgarib turadi va protsessor qaysi vaqtda birini toʻxtatib, boshqasiga oʻtishini oldindan aytish mumkin emas. Vazifalarni almashtirish nafaqat foydalanuvchi uchun, balki dasturning oʻzi uchun ham parallellik illyuziyasini yaratadi. Ammo bu shunchaki illyuziya boʻlgani uchun, bir protsessorli muhitda va haqiqiy parallel muhitda dastur harakati oʻrtasida nozik farqlar boʻlishi mumkin. Xususan, xotira modeli haqidagi notoʻgʻri taxminlar (bir protsessorli muhitda paydo boʻlmasligi mumkin. Koʻp yillar davomida bir nechta protsessorli kompyuterlar serverlarni tashkil qilish va yuqori unumli hisoblashlarni amalga oshirish uchun ishlatilgan va hozirda bitta chipda bir nechta yadroli mashinalar (koʻp yadroli protsessorlar) tobora koʻproq foydalanilmoqda. Mashinaning bir nechta protsessorlari yoki bir nechta yadroli (yoki ikkalasining kombinatsiyasi) bir protsessor bilan jihozlanganligi muhim emas, u bir vaqtning oʻzida bir nechta vazifani bajarishi mumkin. Bu aparat parallelligi deb ataladi. 1-rasm ideallashtirilgan holatni koʻrsatadi: har biri oʻnta bir xil bosqichga boʻlingan ikkita vazifani bajaradigan kompyuter. Ikki yadroli mashinada har bir vazifa oʻz yadrosida ishlashi mumkin. Vazifalarni almashtirish bilan bitta yadroli mashinada ikkala vazifaning bosqichlari oʻzgaradi. Biroq, ular orasida juda oz vaqt bor (rasmda bu boʻshliqlar bajarishning kengroq bosqichlarini ajratuvchi kulrang chiziqlar sifatida koʻrsatilgan) - almashinishni ta’minlash uchun tizim har safar bir vazifadan ikkinchisiga oʻtganda kontekstni almashtirishni amalga oshirishi kerak va bu vaqt talab etadi. Kontekstni almashtirish uchun OT protsessor holatini va joriy vazifa uchun dastur hisoblagichini saqlashi, qaysi vazifa keyingi bajarilishini aniqlashi va yangi vazifa holatini protsessorga yuklashi kerak. Keyinchalik protsessor yangi vazifaning koʻrsatmalari va ma’lumotlarini kesh xotirasiga yuklashi kerak boʻlishi mumkin; ushbu operatsiya davomida hech qanday buyruq bajarilmaydi, bu esa qoʻshimcha kechikishlarni keltirib chiqaradi. Parallelizmning apparat ta’minoti koʻp protsessorli va koʻp yadroli kompyuterlarda aniq boʻlsa-da, bir yadroda bir nechta oqimlarni bajarishi mumkin boʻlgan protsessorlar mavjud. Aslida, muhim omil - bu apparat oqimlari soni - bu apparat bir vaqtning oʻzida bajaradigan mustaqil vazifalar sonining xarakteristikasi. Aksincha, haqiqiy parallelizmga ega tizimda vazifalar soni yadrolar sonidan oshib ketishi mumkin, keyin vazifani almashtirish mexanizmi qoʻllaniladi. Misol uchun, odatdagi ish stoli kompyuterida, hatto kompyuter hech narsa qilmasa ham, fonda ishlaydigan bir necha yuzlab vazifalar boʻlishi mumkin. Aynan kalit orqali bu vazifalar parallel ravishda bajarilishi mumkin, bu sizga bir vaqtning oʻzida matn protsessorini, kompilyatorni, muharrirni va veb1-rasm. Parallelizmga ikkita yondashuv: ikki yadroli kompyuterda parallel bajarish va bitta yadroli kompyuterda vazifani almashtirish brauzerni (va haqiqatan ham har qanday ilovalar kombinatsiyasini) ochishga imkon beradi. 2-rasmda ikki yadroli mashinada toʻrtta vazifani almashtirishni koʻrsatadi, yana ideallashtirilgan holatda, vazifalar teng davomiylik bosqichlariga boʻlinganda. Amalda, boʻlinish bir xil emasligi va rejalashtiruvchi protsessorni har bir vazifaga muntazam ravishda taqsimlamasligining koʻp sabablari bor. 2-rasmda. Ikki yadroli kompyuterda vazifalarni almashtirish 1.2. Parametrli yondashuvlar Tasavvur qiling-a, bir nechta dasturchilar bitta loyiha ustida ishlamoqda. Agar ular turli idoralarda oʻtirsa, ular bir-biriga aralashmasdan tinchgina ishlashlari mumkin va har birining oʻz hujjatlari mavjud. Lekin muloqot qilish qiyin – shunchaki aylanib, bir necha soʻz almashish oʻrniga, telefon qoʻngʻiroqlari qilish, xat yozish, hatto oʻrnidan turib hamkasbning oldiga yurish kerak. Bundan tashqari, ikkita ofisni Ikki yadroli kompyuter Bir yadroli kompyuter 1-yadro 2-yadro Ikki yadroli kompyuter 1-yadro 2-yadro saqlash xarajatlar bilan bogʻliq va hatto bir nechta hujjatlar toʻplamini sarflash kerak boʻladi. Endi tasavvur qiling-a, barcha ishlab chiquvchilar bitta xonada toʻplangan. Ular ilova loyihasini oʻzaro muhokama qilish, qogʻoz yoki doskaga chizmalar chizish, fikr almashish imkoniga ega boʻldilar. Siz faqat bitta ofisni saqlashingiz kerak boʻladi va bitta hujjatlar toʻplami yetarli boʻladi. Ammo kamchiliklar ham bor - endi ular uchun diqqatni jamlash qiyinroq va resurslarni almashish bilan bogʻliq muammolar boʻlishi mumkin. Ishlab chiquvchilarning ishini tashkil qilishning ushbu ikki usuli bir vaqtning oʻzida ikkita asosiy yondashuvni koʻrsatadi. Ishlab chiquvchi oqim modeli, shkaf esa jarayon modelidir. Birinchi holda, bir nechta bitta oqimli jarayonlar mavjud (har bir dasturchi oʻz ofisiga ega), ikkinchisida, bir jarayonda bir nechta oqimlar mavjud (bir oqimda ikkita dasturchi). Albatta, mustaqil ravishda kombinatsiyalar mumkin: bir nechta jarayonlar boʻlishi mumkin, koʻp tarmoqli va bitta oqimli, lekin prinsip oʻzgarishsiz qoladi. Endi keling, bir vaqtning oʻzida ushbu ikki yondashuv ilovalarga qanday qoʻllanilishi haqida bir oz gapiraylik. Bir nechta jarayonlar orqali parallellik. Ilovani parallellashtirishning birinchi usuli - uni bir vaqtning oʻzida bajariladigan bir nechta bitta oqimli jarayonlarga boʻlish. Brauzer va matn protsessorini birgalikda ishga tushirganingizda aynan shunday qilasiz. Ushbu individual jarayonlar 3-rasmda koʻrsatilganidek, standart jarayonlararo aloqa kanallari (signallar, soketlar, fayllar, konveyerlar va boshqalar) yordamida xabarlar almashishi mumkin. Jarayonlar oʻrtasidagi aloqani bunday tashkil etishning kamchiliklari uning murakkabligi, sekinligi va ba’zan ikkalasi ham birga boʻlishidir. Gap shundaki, operatsion tizim jarayonlarni hech biri tasodifan boshqasiga tegishli ma’lumotlarni oʻzgartira olmasligi uchun himoya qilishi kerak. Yana bir kamchilik bor - bir nechta jarayonlarni ishga tushirish uchun tiklanmaydigan ortiqcha xarajatlar: jarayonni boshlash uchun vaqt kerak, OT jarayonni boshqarish uchun ichki resurslarni ajratishi kerak va hokazo. Albatta, ortiqcha tomonlari ham bor. Operatsion tizim va yuqori darajadagi aloqa mexanizmlari tomonidan ta’minlangan mustahkam jarayon himoyasi jarayonlar bilan emas, balki jarayonlar bilan ishlashda xavfsiz, parallel kod yozishni osonlashtiradi. Masalan, Erlang ish vaqti a 3-rasm. Ikki parallel jarayon oʻrtasidagi aloqa asosiy parallellik mexanizmi sifatida jarayonlardan foydalanadi va bu katta ta’sir koʻrsatadi. Parallellikni amalga oshirish uchun jarayonlardan foydalanishning yana bir afzalligi bor - jarayonlar tarmoq orqali ulangan turli mashinalarda bajarilishi mumkin. Bu aloqa xarajatlarini oshirsa-da, yaxshi moʻljallangan tizimda parallellik darajasini oshirishning bu usuli juda samarali boʻlishi mumkin va umumiy koʻrsatkich oshadi. Bir nechta oqimlar orqali parallellik. Parallellikni tashkil qilishning muqobil yondashuvi bitta jarayonda bir nechta oqimlarni ishga tushirishdir. Oqimlarni yengil jarayonlar deb hisoblash mumkin - har bir oqim boshqalardan mustaqil ishlaydi va barcha oqimlar turli xil ketmaketliklarni bajarishi mumkin. Shu bilan birga, jarayonga tegishli barcha oqimlar umumiy manzil maydonini baham koʻradi va ma’lumotlarning koʻpchiligiga toʻgʻridantoʻgʻri kirish huquqiga ega - global oʻzgaruvchilar global boʻlib qoladi, koʻrsatkichlar va obyekt havolalari bir oqimdan ikkinchisiga oʻtkazilishi 1-jarayon Oqim Jarayonlararo aloqa Operatsion tizim Oqim 2-jarayon mumkin. Jarayonlar uchun siz umumiy xotiraga kirishni ham tashkil qilishingiz mumkin, ammo buni boshqarish qiyinroq, chunki turli jarayonlarda bir xil ma’lumotlar elementining manzillari har xil boʻlishi mumkin. Umumiy manzil maydoni va ma’lumotlarni turli xil oqimlar bilan kirishdan himoya qilishning yoʻqligi sababli, bir nechta oqimlarning mavjudligi bilan bogʻliq boʻlgan qoʻshimcha xarajatlar sezilarli darajada kamroq boʻladi, chunki operatsion tizim bir nechta jarayonlarga qaraganda kamroq buxgalteriya ishlariga ega. Biroq, umumiy xotiraning moslashuvchanligi qimmatga tushadi - agar ma’lum bir ma’lumot elementiga bir nechta oqimlar kirsa, dasturchi ushbu elementning namoyishi barcha oqimlar boʻylab izchil boʻlishini ta’minlashi kerak. Jarayon ichidagi oqimlarni ishga tushirish va ular oʻrtasida aloqa oʻrnatish uchun kam qoʻshimcha xarajatlar ushbu yondashuvni barcha umumiy dasturlash tillarida, shu jumladan C++ da, hatto xotira almashish bilan bogʻliq mumkin boʻlgan muammolarga qaramay mashhur qildi. Bundan tashqari, C++ standarti jarayonlararo aloqa uchun oʻrnatilgan yordamni ta’minlamaydi, ya’ni bir nechta jarayonlardan foydalanishga asoslangan ilovalar platformaga xos API-larga tayanishi kerak. Parallelizm nimani anglatishini hal qilgandan soʻng, keling, nima uchun ilovalarda kerak boʻlishi mumkinligini koʻrib chiqaylik. 1.3. Nima uchun parallellik kerak? Ilovada parallellikdan foydalanishning ikkita asosiy sababi bor: vazifalarni ajratish va ishlab chiqish. Bu yagona sabablar - agar diqqat bilan qarasangiz, hamma narsa bir yoki boshqasiga (yoki bir vaqtning oʻzida ikkalasiga) bogʻliq ekanligi ayon boʻladi. Vazifalarni ajratish uchun parallellikdan foydalanish. Dasturlarni ishlab chiqishda vazifalarni ajratish deyarli har doim ragʻbatlantiriladi: agar siz kodning tegishli va bir-biriga bogʻliq boʻlmagan qismlarini guruhlashtirsangiz, unda dastur testni tushunish osonroq boʻladi va shuning uchun kamroq xatolar boʻladi. Agar dasturning turli qismlari bilan bogʻliq operatsiyalar bir vaqtning oʻzida bajarilishi kerak boʻlsa ham, dasturning funksional jihatdan bogʻliq boʻlmagan qismlarini ajratish uchun parallellashtirishdan foydalanish mantiqan toʻgʻri keladi: aniq parallelizatsiyasiz biz yoki biron bir vazifani almashtirish infratuzilmasini amalga oshirishimiz kerak boʻladi. Gap operatsiyani bajarish jarayonida dasturning begona qismidan kodga kirishdan iborat. Ish stoli kompyuteridagi DVD pleer kabi murakkab hisob-kitoblarni amalga oshiradigan grafik dasturni koʻrib chiqing. Bunday dastur ikkita bir-biridan farq qiladigan mas’uliyatga ega: birinchidan, filmni tomosha qilishda toʻxtalish boʻlmasligi uchun diskdagi ma’lumotlarni oʻqish, tasvir va ovozni dekodlash va ularni grafik va ovozli uskunalarga oʻz vaqtida yuborish va ikkinchidan, foydalanuvchi harakatlariga javob berish uchun, masalan, Pauza, Menyuga qaytish va hatto Chiqish tugmalarini bosish orqali. Agar dastur bitta oqimli boʻlsa, u vaqti-vaqti bilan foydalanuvchi harakati bor-yoʻqligini tekshirishi kerak edi, shuning uchun DVD tinglash kodi foydalanuvchi interfeysi bilan bogʻliq kod bilan kesishadi. Agar siz ushbu mas’uliyatni ajratish uchun bir nechta oqimlardan foydalansangiz, interfeys kodi va ijro etish endi bir-biri bilan chambarchas bogʻliq boʻlmaydi: bir oqim foydalanuvchi harakatlarini kuzatishi mumkin, ikkinchisi - ijro etish. Albatta, ular hali ham qandaydir tarzda oʻzaro aloqada boʻlishlari kerak, masalan, agar foydalanuvchi "Toʻxtatib turish" tugmasini bosgan boʻlsa, lekin bunday bunday toʻgʻridan-toʻgʻri topshiriq bilan bogʻliq. Natijada, biz "javob beruvchi" interfeysga ega boʻlamiz, chunki foydalanuvchi interfeysi oqimi odatda foydalanuvchi soʻroviga darhol javob berishga qodir, hatto reaksiya kursor shaklini "band" ga oʻzgartirsa yoki "Iltimos, kuting" xabarini koʻrsatsa ham, soʻrovni qayta ishlash uchun boshqa mavzuga oʻtkazish uchun zarur boʻlgan vaqt uchun. Xuddi shunday, mahalliy qidiruv ilovasida fayl tizimi oʻzgarishlarini kuzatish kabi doimiy ishlaydigan fon vazifalarini bajarish uchun koʻpincha bir nechta iplar yaratiladi. Oqimlardan bunday foydalanish har bir oqimning mantigʻini sezilarli darajada soddalashtirishga imkon beradi, chunki ular orasidagi oʻzaro ta’sir dastur davomida boʻyalgan emas, balki bir nechta aniq belgilangan nuqtalar bilan cheklangan. Samaradorlikni oshirish uchun parallellikdan foydalanish. Koʻp protsessorli tizimlar oʻnlab yillar davomida mavjud boʻlib kelgan, ammo yaqin vaqtgacha ular faqat superkompyuterlar, asosiy kompyuterlar va yirik serverlarda ishlatilgan. Biroq, hozirgi vaqtda mikroprotsessor ishlab chiqaruvchilari bir yadroning unumdorligini oshirishdan koʻra, 2, 4, 16 yoki undan koʻp yadroli protsessorlar ishlab chiqarishni afzal koʻrishadi. Shu sababli, ish stoli kompyuterlari va hatto koʻp yadroli protsessorli oʻrnatilgan qurilmalar keng tarqalgan. Bu holda hisoblash quvvatining ortishi har bir alohida vazifaning tezroq bajarilishi bilan emas, balki bir nechta vazifalarning parallel ravishda bajarilishi bilan bogʻliq. Ilgari dasturchi oʻtirib, har bir yangi avlod protsessorlari bilan oʻz dasturining tezroq ishlashini hech qanday kuch sarflamasdan kuzatishi mumkin edi. Ammo endi, Gerb Satter aytganidek, "bepul nonushta qilish vaqti tugadi" [Sutter 2005]. Agar dastur hisoblash quvvatini oshirishdan foydalanishi kerak boʻlsa, u holda u parallel vazifalar toʻplami sifatida ishlab chiqilishi kerak. Shu sababli, dasturchilar yetib olishlari kerak va shu paytgacha parallelizmga e’tibor bermaganlar uni oʻz arsenaliga qoʻshishlari kerak. Ishlashni yaxshilash uchun parallelizatsiyadan foydalanishning ikki yoʻli mavjud. Birinchi va eng aniq, vazifani qismlarga boʻlish va ularni parallel ravishda bajarish, shu bilan umumiy bajarish vaqtini qisqartirishdir. Bu vazifani parallellashtirish. Garchi bu protsedura oddiy koʻrinsa-da, aslida turli qismlar oʻrtasida koʻplab bogʻliqliklar mavjudligi sababli narsalar juda murakkablashishi mumkin. Boʻlimlarni qayta ishlash nuqtai nazaridan ham shakllantirish mumkin: bir ip ishlov berishning bir qismini bajaradi, ikkinchisi boshqasini bajaradi yoki ma’lumotlar boʻyicha: har bir ip bir xil operatsiyani bajaradi, lekin har xil ma’lumotlar bilan. Oxirgi variant ma’lumotlarni parallellashtirish deb ataladi. Bunday parallellashtirishga osonlik bilan mos keladigan algoritmlar koʻpincha noqulay parallel, tabiiy parallel, qulay parallel deb ataladi. Ular juda yaxshi miqyosga ega - agar mavjud apparat oqimlar soni oshsa, algoritmning parallellik darajasi ham ortadi. Algoritmning tabiiy ravishda parallel boʻlmagan qismlarini qat’iy (va shuning uchun kengaytirib boʻlmaydigan) parallel vazifalar soniga boʻlish mumkin. Ishlashni yaxshilash uchun parallelizatsiyadan foydalanishning ikkinchi usuli - kattaroq muammolarni hal qilish uchun mavjud parallelizmdan foydalanish, masalan, bir vaqtning oʻzida bitta faylni emas, balki bir vaqtning oʻzida ikkita, oʻn yoki yigirmata faylni qayta ishlash. Bu mohiyatan ma’lumotlarni parallellashtirishning namunasidir, chunki bir xil operatsiya bir vaqtning oʻzida bir nechta ma’lumotlar toʻplamida amalga oshiriladi, ammo urgʻu biroz boshqacha. Bitta ma’lumotni qayta ishlash uchun avvalgidek vaqt kerak boʻladi, lekin belgilangan vaqt ichida koʻproq ma’lumotlarni qayta ishlash mumkin. Shubhasiz, bu yondashuv ham cheklovlarga ega va hamma hollarda ham foyda keltirmaydi, ammo erishilgan samaradorlik ba’zan yangi imkoniyatlarni ochadi. Misol uchun, agar tasvirning turli joylari parallel ravishda qayta ishlanishi mumkin boʻlsa, u holda yuqori aniqlikdagi videoni qayta ishlash mumkin. Qachon parallellik yomon? Parallelizmdan qachon qochish kerakligini bilish bir xil darajada muhimdir. Prinsip oddiy: bir vaqtning oʻzida foydalanmaslikning yagona sababi - xarajatlar foydadan ustun boʻlganda. Parallel dasturni tushunish koʻpincha qiyinroq, shuning uchun koʻp bosqichli kodni yozish va saqlash uchun qoʻshimcha intellektual kuch talab etiladi va shuning uchun xatolar soni ortadi. Agar potensial samaradorlik ortishi yetarli darajada katta boʻlmasa yoki erishilgan vazifalarni ajratish koʻp bosqichli dasturni ishlab chiqish, texnik xizmat koʻrsatish uchun sarflangan qoʻshimcha vaqtni oqlash uchun yetarli darajada aniq boʻlmasa, u holda parallellikdan qoching. Bundan tashqari, unumdorlikning oshishi kutilganidan kamroq boʻlishi mumkin: boshlangʻich oqimlar bilan bogʻliq tiklanmaydigan ortiqcha yuk bor, chunki OT stek uchun yadro resurslari va xotirani ajratishi va rejalashtiruvchiga yangi oqim haqida xabar berishi kerak va bularning barchasi talab qiladi. Agar alohida oqimda bajariladigan vazifa tezda bajarilsa, umumiy ish vaqti oqimni ishga tushirishga sarflangan xarajatlarga bogʻliq boʻlishi mumkin, shuning uchun umuman dasturning ishlashi topshiriqdan koʻra yomonroq boʻlishi mumkin. Bundan tashqari, oqimlar cheklangan manbadir. Agar bir vaqtning oʻzida juda koʻp oqimlar mavjud boʻlsa, u holda operatsion tizim resurslari tugaydi, bu butun tizimning sekinlashishiga olib kelishi mumkin. Bundan tashqari, haddan tashqari koʻp sonli oqimlarning xotirasi yoki jarayon uchun ajratilgan manzil maydoni tugashi mumkin, chunki har bir oqim oʻz stekiga muhtoj. Bu muammo, ayniqsa, "tekis" xotira tuzilmasi boʻlgan 32 bitli jarayonlarda tez-tez uchraydi, bu yerda manzil maydoni hajmi 4 Gb bilan cheklangan: agar har bir oqimda 1 MB stek boʻlsa (koʻp tizimlarda odatiy kelishuv), u holda 4096 oqimlar butun manzil maydonini egallaydi va kod, statik ma’lumotlar va toʻp uchun joy qoldirmaydi. 64-bitli tizimlar (va undan yuqori soʻz uzunligi boʻlgan tizimlar) manzillar maydonining hajmi boʻyicha bunday cheklovga ega emas, ammo resurslar hali ham cheklangan: agar siz juda koʻp oqimlarni ishlatsangiz, ertami-kechmi muammolar paydo boʻladi. Agar mijoz-server ilovasining server tomonida har bir ulanish uchun bitta oqim yaratilgan boʻlsa, u holda oz sonli ulanishlar bilan hamma narsa yaxshi ishlaydi, lekin serverdagi yuk ortib, u juda koʻp ulanishlarni boshqarishi kerak boʻlganda, bu texnika tezda tizim resurslarining tugashiga olib keladi. Bunday vaziyatda oqimlardan oʻylab foydalanish optimal ishlashni ta’minlaydi. Qancha koʻp oqimlar ishlayotgan boʻlsa, operatsion tizim kontekstni almashtirishni qanchalik tez-tez bajarishi kerak. Har bir bunday oʻzgartirish foydali ishlarga sarflanishi mumkin boʻlgan vaqtni oladi, shuning uchun bir nuqtada yangi oqimni qoʻshish koʻpaymaydi, lekin dasturning umumiy ishlashini pasaytiradi. Shuning uchun, tizimning mumkin boʻlgan eng yuqori ishlashiga erishishga harakat qilayotganda, mavjud apparat parallelizmini (yoki ularning yetishmasligini) hisobga olgan holda oqimlar sonini tanlashingiz kerak. Ishlashni yaxshilash uchun parallellashtirishdan foydalanish boshqa optimallashtirish strategiyasidan farq qilmaydi - bu dastur tezligini sezilarli darajada oshirishi mumkin, lekin shu bilan birga kodni tushunishni qiyinlashtiradi, bu xatolar bilan toʻla. Shuning uchun, parallellashtirish faqat oʻlchovli daromad keltirishi mumkin boʻlgan dasturning ishlash nuqtai nazaridan mantiqiy boʻladi. Ammo, albatta, agar samaradorlikni oshirish masalasi ikkinchi darajali boʻlsa va dizaynning aniqligi yoki vazifalarni ajratish birinchi oʻrinda tursa, unda koʻp tarmoqli tuzilma imkoniyatlarini koʻrib chiqishga arziydi. 1.4. C ++ da parallellik va koʻp oqimlilik Koʻp oqimlilik orqali standartlashtirilgan parallel qoʻllab-quvvatlash C++ uchun yangi tushunchadir. Faqat yangi C++11 standarti platformaga bogʻliq kengaytmalarga murojaat qilmasdan koʻp oqimli kod yozish imkonini beradi. Yangi C++ standart oqimlar kutubxonasida qabul qilingan koʻplab qarorlarning asoslarini tushunish uchun siz tarixni eslab qolishingiz kerak. C++ da koʻp oqimlilik tarixi. 1998-yildagi C++ standarti oqimlarning mavjudligini tan olmadi, shuning uchun turli til konstruksiyalarining ishlash natijalari ketma-ket mavhum mashina nuqtai nazaridan tasvirlangan. Bundan tashqari, xotira modeli rasmiy ravishda aniqlanmagan, shuning uchun 1998 C++ standart kengaytmalari koʻmagisiz koʻp bosqichli ilovalarni yozish mumkin emas edi. Albatta, kompilyator ishlab chiqaruvchilari tilga har qanday kengaytmalarni qoʻshish huquqiga ega va C tilida, masalan, POSIX C standartida koʻpoqimlilikni qoʻllab-quvvatlash uchun turli xil API-larning mavjud. Microsoft Windows API-da koʻplab C++ kompilyatorlarini platforma kengaytmalari orqali koʻp oqimlilikni qoʻllab-quvvatlashga majbur qildi. Odatda, bu qoʻllab-quvvatlash platformaga xos C API-dan foydalanishga ruxsat berish bilan chegaralanadi, bu esa C++ ish vaqti kutubxonasi (xususan, istisnolarni qayta ishlash mexanizmi) bir nechta oqimlar bilan toʻgʻri ishlashiga ishonch hosil qiladi. Garchi juda kam sonli kompilyator ishlab chiqaruvchilari koʻp oqimlilikni qoʻllabquvvatlaydigan rasmiy xotira modelini taklif qilgan boʻlsa-da, kompilyatorlar va protsessorlarning amaliy xatti-harakatlari koʻp sonli koʻp tarmoqli C++ dasturlarini yaratish uchun yetarli darajada maqbul ekanligini isbotladi. Koʻp oqimlilik bilan ishlash uchun platformaga xos C API-lardan foydalanishdan mamnun boʻlmagan C++ dasturchilari oʻzlari foydalanadigan sinf kutubxonalarida koʻp oqimli dasturlarni yozish uchun obyektga yoʻnaltirilgan vositalarni xohlashdi. MFC va Boost va ACE kabi umumiy C++ kutubxonalari kabi turli freymvorklar platformaga xos API-larni oʻrab oladigan va dasturlashni osonlashtirish uchun moʻljallangan yuqori darajadagi koʻpoqimli vositalarini taqdim etadigan C++ sinflari toʻplamini oʻz ichiga oladi. Ushbu kutubxonalarda amalga oshirish tafsilotlari, ayniqsa, yangi oqimlarni boshlash qismida sezilarli darajada farqlanadi, ammo sinflarning umumiy tuzilishi juda oʻxshash. Koʻpgina hollarda, mavjud C++ kompilyatorlarini koʻp qirrali qoʻllab-quvvatlash, platformaga xos API va platformaga bogʻliq boʻlmagan sinf kutubxonalari, masalan, Boost ACE kabi, koʻp bosqichli dasturlarni yozish uchun yetarlicha mustahkam asos boʻlib xizmat qiladi. Natijada, millionlab kod satrlarini oʻz ichiga olgan koʻp oqimli C++ ilovalari allaqachon yozilgan. Ammo standartda toʻgʻridan-toʻgʻri qoʻllab-quvvatlanmaganligi sababli, koʻp oqimlarni hisobga oladigan xotira modelining yetishmasligi muammolarga olib keladigan holatlar mavjud. Bu, ayniqsa, ma’lum bir protsessorning xususiyatlaridan foydalanib, unumdorlikni oshirishga harakat qilayotgan ishlab chiquvchilar uchun, shuningdek, turli platformalarda kompilyatorlar oʻrtasidagi farqlardan qat’iy nazar ishlashi kerak boʻlgan platformalararo kodni yozuvchilar uchun keng tarqalgan. Yangi standartda parallellikni qoʻllab-quvvatlash. Bularning barchasi C++11 standartining chiqarilishi bilan oʻzgardi. U nafaqat koʻp oqimlilikni qoʻllab-quvvatlaydigan mutlaqo yangi xotira modelini belgilaydi, balki oqimlarni boshqarish, umumiy ma’lumotlarni himoya qilish, oqimlar orasidagi amallarni sinxronlashtirish va past darajadagi atomik sinflarni ham oʻz ichiga oladi. C++ uchun yangi koʻp tarmoqli kutubxonaning asosi yuqorida aytib oʻtilgan sinf kutubxonalaridan foydalanish paytida olingan tajribadir. Xususan, Boost Thread Library yangi kutubxonaning nusxasi boʻlib, undan koʻplab sinflar strukturalar nomlari olingan. Yangi standartning evolyutsiyasi ikki tomonlama jarayon boʻldi va Boost Thread Library oʻzi standartga yaxshiroq moslashish uchun koʻp jihatdan oʻzgardi. Shu sababli, yangi standartga oʻtayotgan Boost foydalanuvchilari oʻzlarini juda qulay his qilishadi. Parametrlarni qoʻllab-quvvatlash - bu C++ standartidagi yangiliklardan biri. Ushbu mavzuning boshida ta’kidlanganidek, dasturchilar hayotini osonlashtirish uchun tilning oʻziga ham koʻplab oʻzgarishlar kiritilgan. Atom operatsiyalari uchun toʻgʻridan-toʻgʻri tilni qoʻllab-quvvatlash platformaga xos assembler tiliga murojaat qilmasdan, aniq belgilangan semantika bilan samarali kod yozish imkonini beradi. Bu samarali va koʻchma kod yaratishga harakat qilayotganlar uchun samoviy manna - kompilyator nafaqat platformaning xususiyatlariga gʻamxoʻrlik qiladi, balki optimallashtiruvchi ham operatsiyalar semantikasini hisobga oladigan tarzda yozilishi mumkin, shuning uchun dasturni umuman optimallashtirish yaxshiroqdir. C++ uchun koʻp oqimli kutubxonaning samaradorligi. Umuman olganda, C++ dan va ayniqsa C++ Thread Library-ga kiritilganlar kabi past darajadagi vositalarni oʻz ichiga olgan sinflardan foydalanishda yuqori unumli ilovalarni ishlab chiquvchilar duch keladigan muammolardan biri bu samaradorlikdir. Agar siz maksimal samaradorlikka erishmoqchi boʻlsangiz, ular bilan oʻralgan past darajadagi asboblar oʻrniga har qanday yuqori darajadagi mexanizmlardan foydalanish biroz qoʻshimcha xarajatlarni talab qilishini tushunishingiz kerak. Ushbu xarajatlar abstraktsiya toʻlovlari deb ataladi. C++ standartlashtirish qoʻmitasi buni umuman olganda C++ standart kutubxonasini va xususan C++ standart koʻp oqimlilik kutubxonasini loyihalashda yaxshi bilgan. Dizayn maqsadlari orasida quyidagilar bor edi: yuqori darajadagi oʻrash bilan solishtirganda past darajadagi asboblardan foydalanishning foydasi (agar u taqdim etilsa) ahamiyatsiz yoki umuman yoʻq boʻlishi kerak. Shuning uchun kutubxona eng mashhur platformalarda samarali (juda kam abstraksiya xarajati bilan) amalga oshirish uchun moʻljallangan. C++ standartlashtirish qoʻmitasi oʻz oldiga yana bir maqsad qoʻydi – “apparat” darajasida ishlashni xohlovchilar uchun yetarlicha past darajadagi vositalar bilan ta’minlash, undan eng yaxshisini siqib chiqarish. Shu sababli, yangi xotira modeli bilan bir qatorda, bit va bayt darajasida toʻgʻridan-toʻgʻri nazorat qilish, shuningdek, oqimni sinxronlashtirish va har qanday oʻzgarishlarning koʻrinishi uchun atom operatsiyalarining toʻliq kutubxonasi kiritilgan. Atom turlari va ularning tegishli operatsiyalari endi ilgari ishlab chiquvchilar platformaga xos assembler tili darajasiga tushishga majbur boʻlgan koʻplab joylarda qoʻllanilishi mumkin. Shunday qilib, yangi standart turlari va operatsiyalaridan foydalanadigan kod koʻproq portativ va texnik xizmat koʻrsatadi. C++ standart kutubxonasi, shuningdek, kamroq xatolar bilan koʻp bosqichli kod yozishni osonlashtiradigan yuqori darajadagi abstraktsiyalar va vositalarni taklif etadi. Ulardan ba’zilari qoʻshimcha kodni bajarish zarurati tufayli unumdorlikni biroz pasaytiradi. Biroq, bu qoʻshimcha xarajatlar abstraksiya uchun yuqori narxni anglatmaydi: umuman olganda, narx ekvivalent funksiyani qoʻlda yozish uchun toʻlanadigan narxdan yuqori emas va kompilyator katta miqdordagi qoʻshimcha kodni joylashtirishi mumkin. Ba’zi hollarda yuqori darajadagi vositalar ma’lum bir vazifa uchun talab qilinganidan koʻra koʻproq funksionallikni ta’minlaydi. Qoida tariqasida, bu qoʻrqinchli emas: siz foydalanmayotgan narsangiz uchun toʻlamaysiz. Kamdan-kam hollarda, lekin ortiqcha funksionallik dasturning boshqa qismlarining ishlashiga salbiy ta’sir qiladi. Agar xarajat juda yuqori boʻlsa va unumdorlik muhim boʻlsa, unda past darajadagi vositalar yordamida kerakli funksionallikni qoʻlda dasturlash mantiqiy boʻlishi mumkin. Ammo aksariyat hollarda qoʻshimcha murakkablik va xatolarni kiritish qobiliyati kichik ishlash yutuqlaridan ancha ustundir. Agar profil yaratish C++ standart kutubxona vositalari haqiqatan ham muammo ekanligini koʻrsatsa ham, muammo kutubxonaning yomon amalga oshirilishida emas, balki dasturning notoʻgʻri dizaynida boʻlishi mumkin. Misol uchun, bitta mutexda raqobatlashadigan juda koʻp oqimlar mavjud boʻlsa, unumdorlik keskin pasayadi. Ammo mutekslar bilan operatsiyalarni biroz tezlashtirishga urinmaslik, raqobatni kamaytirish uchun dastur tuzilishini oʻzgartirish yaxshiroqdir. Kamdan-kam hollarda standart kutubxona kerakli ishlash yoki xattiharakatni ta’minlamasa, platformaga xos vositalardan foydalanish kerak boʻlishi mumkin. Platformaga xos vositalar. C++ uchun koʻp oqimli kutubxona koʻp oqimli dasturlarni yaratish uchun juda toʻliq vositalar toʻplamini oʻz ichiga olgan boʻlsa-da, kiritilgan kutubxonadan tashqari har qanday platformada maxsus vositalar mavjud. Standart kutubxonadan voz kechmasdan, ushbu vositalarga kirishga ruxsat berish uchun koʻp oʻquv kutubxonasidagi turlar ba’zan platforma API darajasida ishlashga imkon beruvchi native_handle() a’zo funksiyasini oʻz ichiga oladi. Oʻzining tabiatiga koʻra, native_handle() funksiyasi bilan bajariladigan har qanday operatsiyalar platformaga bogʻliq va shuning uchun bu kitobda (shuningdek, C++ standart kutubxonasining oʻzida) yoritilgan emas. Takrorlash uchun savol va topshiriqlar: 1. C++ uchun koʻp oqimli kutubxonaning samaradorligini nimalarda koʻrinadi? 2. Yangi standartda parallellik qanday qoʻllab quvvatlanadi? 3. C++da koʻp oqimlilik tarixiga toʻxtalib oʻting. 4. Parallelikning yaxshi va yomon jihatlariga haqida gapiring. 5. Samaradorlikni oshirish uchun parallellikdan qanday foydalaniladi
Download 38.65 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling