Pthreads bilan Umumiy xotirali dasturlash
Mavzu: Pthreads bilan Umumiy xotirali dasturlash Reja: Kirish 1. Pthread s jarayonlar va kutubxonalar 2. Dastlabki o'yinlar 3. Matritsa-vektorlarni ko'shtirish 4. MUHIM BO'LIMLAR Foydalangan adabiyotlar
Kirish Eslatib o'tamiz, dasturchi nuqtai nazaridan umumiy xotira tizimi bitta barcha yadrolar barcha xotira joylariga kirishi mumkin (4.1-rasmga qarang). Shunday qilib yadrolar ishini muvofiqlashtirish muammosiga aniq yondashuvni aniqlashtirishdir ba'zi xotira joylari "birgalikda" ekanligi. Bu parallellikka juda tabiiy yondashuv dasturlash. Haqiqatan ham, nima uchun barcha parallel dasturlar buni ishlatmasligiga hayron bo'lishimiz mumkin umumiy xotira yondashuvi. Biroq, biz ushbu bobda muammolar mavjudligini ko'ramiz umumiy xotira tizimlarini dasturlashda ko'pincha muammolardan farq qiladi taqsimlangan xotira dasturlashda duch keladigan muammolar. Misol uchun, 2-bobda biz ko'rdikki, agar turli yadrolar bitta umumiy xotira manzilini yangilashga harakat qilsa, u holda uning mazmuni qo'yilgan joy oldindan aytib bo'lmaydigan bo'lishi mumkin. Umumiy joylashuvni yangilaydigan kod muhim bo'limga misoldir. Biz tanqidiy bo'limlarning boshqa misollarini ko'rib chiqamiz va biz bir nechta usullarni o'rganamiz muhim bo'limga kirishni nazorat qilish uchun. Biz umumiy xotira dasturlashning boshqa masalalari va usullari haqida ham bilib olamiz. Umumiy xotirali dasturlashda protsessorda ishlaydigan dasturning namunasi odatdathreadsdeb ataladi (MPI dan farqli o'laroq, u jarayon deb ataladi). Har birthreadsblokni bajarishni kutishi uchun iplarni qanday sinxronlashtirishni o'rganamiz boshqa mavzu ba'zi ishni tugatmaguncha bayonotlar. Vaziyat yuzaga kelmaguncha, biz ipni qanday qilib "uxlashga" qo'yishni o'rganamiz. Biz ba'zi holatlar mavjudligini ko'ramiz, ular dastlab tanqidiy qism juda katta bo'lishi kerakdek tuyulishi mumkin. Biroq, biz ba'zan dasturning ko'p qismini parallel ravishda bajarish uchun ushbu katta kod bloklariga kirishni "nozik sozlash" imkonini beradigan vositalar mavjudligini ham ko'ramiz. Biz kesh xotiralaridan foydalanish umumiy xotira dasturining sekinroq ishlashiga olib kelishi mumkinligini ko'ramiz. Nihoyat, biz ketma-ket qo'ng'iroqlar orasida "holatni saqlaydigan" funktsiyalar nomuvofiq yoki hatto noto'g'ri natijalarga olib kelishi mumkinligini ko'ramiz. Ushbu bobda biz umumiy xotira funktsiyalarining ko'pchiligi uchun POSIX R iplaridan foydalanamiz. Keyingi bobda biz OpenMP deb nomlangan umumiy xotira dasturlashning muqobil yondashuvini ko'rib chiqamiz.
PTHREADS JARAYONLAR VA KUTUBXONALAR 2-bobdan eslaylikki, umumiy xotirali dasturlashdathreadsbiroz MPI dasturlash jarayoniga o'xshaydi. Biroq, bu printsipial jihatdan, "engilroq" bo'lishi mumkin 4.1-rasm. Umumiy xotira tizimi Jarayon ishlayotgan (yoki foydalanilgan) dasturning namunasidir. Bajarilishi mumkin bo'lgan narsadan tashqari, u quyidagilardan iborat: Stack uchun xotira bloki Yig ‘ish uchun xotira bloki Tizim jarayon uchun ajratgan resurslar deskriptorlari, masalan, fayl deskriptorlari. Xavfsizlik ma'lumotlari - masalan, jarayon qaysi apparat va dasturiy ta'minot resurslariga kirishi mumkinligi haqidagi ma'lumot. Jarayonning holati to'g'risidagi ma'lumotlar, masalan, jarayon ishga tayyormi yoki resursda kutilmoqdami, registrlar tarkibi, shu jumladan dastur hisoblagichi va boshqalar. Aksariyat tizimlarda, sukut bo'yicha, jarayonning xotira bloklari shaxsiydir: agar operatsion tizim aralashmasa, boshqa jarayon jarayonning xotirasiga bevosita kira olmaydi. Bu mantiqiy. Agar siz dastur yozish uchun matn muharriridan foydalanayotgan bo'lsangiz (bitta jarayon - ishlaydigan matn muharriri), brauzeringiz (boshqa jarayon) matn muharriri xotirasini qayta yozishni xohlamaysiz. Bu ko'p foydalanuvchi muhitida yanada muhimroq. Bir foydalanuvchining jarayonlariga boshqa foydalanuvchi jarayonlarining xotirasiga kirishga ruxsat berilmasligi kerak. Biroq, biz umumiy xotira dasturlarini ishga tushirganimizda, bu biz xohlagan narsa emas. Hech bo'lmaganda, biz ba'zi o'zgaruvchilar bir nechta jarayonlar uchun mavjud bo'lishini xohlaymiz, shuning uchun umumiy xotira "jarayonlari" odatda bir-birining xotirasiga kirishni ancha osonlashtiradi. Shuningdek, ular tez-tez stdout-ga kirish kabi narsalarni baham ko'rishadi. Aslida,
ular o'zlarining steklari va dastur hisoblagichlaridan tashqari, jarayonga xos bo'lgan deyarli hamma narsani baham ko'rishlari mumkin. Buni bitta jarayonni boshlash va keyin jarayonni ushbu "yengilroq" jarayonlarni boshlash orqali nisbatan oson tartibga solish mumkin. Shu sababli, ular ko'pincha engil vaznli jarayonlar deb ataladi. Ko'proq ishlatiladigan atama, ip, "nazorat ipi" tushunchasidan kelib chiqqan. Boshqaruv zanjiri - bu dasturdagi gaplar ketma-ketligi. Bu atama bitta jarayonda boshqaruv oqimini nazarda tutadi va umumiy xotira dasturida bitta jarayon bir nechta boshqaruv zanjiriga ega bo'lishi mumkin. Yuqorida aytib o'tganimizdek, ushbu bobda biz foydalanadigan iplarning maxsus amalga oshirilishi POSIX iplari yoki ko'pincha Pthreads deb ataladi. POSIX [41] Unix-ga o'xshash operatsion tizimlar uchun standartdir, masalan, Linux va Mac OS X. U bunday tizimlarda mavjud bo'lishi kerak bo'lgan turli xil imkoniyatlarni belgilaydi. Xususan, u ko'p bosqichli dasturlash uchun amaliy dasturlash interfeysini (API) belgilaydi. Pthreads dasturlash tili emas (masalan, C yoki Java). Aksincha, MPI kabi, Pthreads C dasturlari bilan bog'lanishi mumkin bo'lgan kutubxonani belgilaydi. MPI dan farqli o'laroq, Pthreads API faqat POSIX tizimlarida mavjud - Linux, Mac OS X, Solaris, HPUX va boshqalar. MPI-dan farqli o'laroq, ko'p tarmoqli dasturlash uchun keng qo'llaniladigan bir qator boshqa spetsifikatsiyalar mavjud: Java iplari, Windows ish zarralari, Solaris iplari. Biroq, barchathreadsspetsifikatsiyalari bir xil asosiy g'oyalarni qo'llab-quvvatlaydi, shuning uchun Pthreads-da qanday dasturlashni o'rganganingizdan so'ng, boshqa thread API-ni qanday dasturlashni o'rganish qiyin bo'lmaydi. Pthreads C kutubxonasi bo'lganligi sababli, u, asosan, C++ dasturlarida ishlatilishi mumkin. Biroq, umumiy xotira dasturlash uchun C++ standartini (C++ 0x) ishlab chiqish ustida ish olib borilmoqda. Agar siz C++ dasturlarini yozayotgan bo'lsangiz, Pthreads o'rniga undan foydalanish mantiqiy bo'lishi mumkin.
SALOM DUNYO Qani boshladik. Keling, Pthreads dasturini ko'rib chiqaylik. 4.1-dastur asosiy funktsiya bir nechta iplarni ishga tushiradigan dasturni ko'rsatadi. Har bir mavzu xabarni chop etadi va keyin tugaydi. Bajarish Dastur oddiy C dasturi kabi tuzilgan, bundan mustasno, Pthreads kutubxonasiga ulanishimiz kerak bo'lishi mumkin: 1 $ gcc — g — Wall — o_pth hello pth hello.c — lpthread -lpthread kompilyatorga Pthreads kutubxonasida bog'lanmoqchi ekanligimizni bildiradi. E'tibor bering, bu -lpthread emas, balki -lpthread. Ba'zi tizimlarda kompilyator avtomatik ravishda kutubxonaga bog'lanadi va -lpthread kerak bo'lmaydi. Dasturni ishga tushirish uchun quyidagi kodni yozamiz $ ./pth hello <number of threads> 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 5 / _ Global variable: accessible to all threads _ / 6 int thread count; 7 8 v oid _ Hello( v oid _ rank); / _ Thread function _ / 9 10 int main( int argc, char _ argv[]) f 11 long thread; / _ Use long in case of a 64 ??????bit system _ / 12 pthread t _ thread handles; 13 14 / _ Get number of threads from command line _ / 15 thread count = strtol(argv[1], NULL, 10); 16 17 thread handles = malloc (thread count _ sizeof (pthread t)); 18 19 for (thread = 0; thread < thread count; thread++) 1 Eslatib o'tamiz, dollar belgisi ($) qobiq so'rovidir, shuning uchun uni kiritmaslik kerak. Shuni ham yodda tutingki, biz Gnu C kompilyatoridan foydalanamiz, deb taxmin qilamiz, gcc va biz doimo variantlari — g, — Wall, and — o. Qo'shimcha ma'lumot uchun 2.9-bo'limga qarang.