mahalliy - bitta jarayonning vazifalari ( iplari ) o'rtasida sinxronizatsiya uchun mavjud ; umumiy xotiraning istalgan joyida joylashgan;
global - turli jarayonlarning vazifalari ( torlari ) o'rtasida sinxronlash uchun mavjud ; jarayonlar o'rtasida umumiy xotirada joylashgan.
Global mutex ekanligini unutmang Barcha operatsion tizimlar tomonidan ta'minlanmagan.
Ba'zi operatsion tizimlar mutex ob'ektlarini ta'minlaydi bir qator hollarda foydali bo'lgan maxsus xususiyatlarga ega. Quyidagi vaziyatni ko'rib chiqing. fl funktsiyalari va f 2 umumiy resurslarda ishlaydi va mutexdan foydalanadi m vazifalarni sinxronlashtirish uchun :
fl( )
Qulflash (m) ;
qulfni ochish (m);
f2()
Qulflash (m) ;
Qulfni ochish (m) ;
Dasturni ishlab chiqish natijasida biz fl funksiyasini chaqirishimiz kerak edi f2 dan :
f 2()
Qulflash ( m ) ;
fl ( );
qulfni ochish ( m ) ;
Biroq, bu boshi berk ko'chaga olib keladi : vazifa mutexning chiqarilishini kutayotgan abadiy tsiklga o'tadi. m fl da , chunki u allaqachon bu mutexga ega . Shuning uchun , ba'zi operatsion tizimlar mutex ob'ektlarining qo'shimcha turlarini taqdim etadi:
xato tekshirish - Muteks egasi tomonidan Lock -ga qo'ng'iroq qilish , shuningdek , egasi bo'lmagan tomonidan Unlock -ni chaqirish hech qanday ta'sir qilmaydi; mutex ekanligini unutmang bu turdagi yuqorida tavsiflangan muammoni hal qiladi, ammo yangisi mavjud: <2-deklar> (ehtimol, umumiy resursda ishlaydi) vazifa endi mutexga egalik qilmasa, bajariladi ;
rekursiv - mutex egasi tomonidan Lock -ga qo'ng'iroq qilish bunday qo'ng'iroqlar hisoblagichini oshiradi, egasi tomonidan Unlock chaqiradi - hisoblagichni kamaytiradi; aslida mutexni qulfdan chiqarish hisoblagich qiymati 0 bo'lganda sodir bo'ladi.
Condvar tipidagi sinxronizatsiya obyektlari
Condvar tipidagi sinxronizatsiya obyekti vazifani muayyan shartlarning bajarilishini kutish imkonini beradi . Aslida, u ob'ektdan iborat - E hodisasi (5.3-bo'limga qarang), bitta farq bilan: hodisa kelganda ( Yuborish funktsiyasi orqali ), hodisa uchun kutish hodisalarining faqat bittasi faollashadi. Vutex kabi , condvar ob'ekti vazifalar (jarayonlar) o'rtasida taqsimlangan xotiraga aniq joylashtiriladi, bu iplar o'rtasida sinxronlashda tizim qo'ng'iroqlarisiz bajarishga imkon beradi . Condvar obyektiga kirish uchun Uchta ibtidoiy operatsiya aniqlangan :
Kutish ( E , m ) (bu erda m mutex tipidagi ) - quyidagi amallarni bajaradi (ularning birinchi ikkitasi bo'linmaydi, ya'ni ularni bajarish paytida vazifalarni almashtirish taqiqlanadi):
joriy vazifa (ya'ni, ushbu operatsiyani chaqirgan) bo'yicha Unlock ( m ) ga qo'ng'iroq qiling
Kutishga qo'ng'iroq qiling (E),
Call Lock(rri) ;
Signal (E) - qo'ng'iroq smd(e):
Translyatsiya ( E ) - Yuborish ( E ) ga qo'ng'iroq qiling va barcha kutilayotgan vazifalarni faollashtiring (ya'ni, 5.3-bo'limda tasvirlangan Yuborish funksiyasi bilan bir xil effekt .
Keling, condvar ob'ektlaridan foydalanish misolini ko'rib chiqaylik . Tq , Ti , ... muammolari bo'lsin . ,T P , umumiy xotira maydonini almashish X. X ga kirishni sinxronlashtirish uchun mu tex dan foydalaning m . Tq vazifasi faqat P(X) qandaydir shart bajarilsagina faollashtirilsin . Ushbu o'zaro ta'sirni ta'minlash uchun biz condvar ob'ektidan foydalanamiz E. Keyin Tq operatsiya algoritmini sxematik tarzda quyidagicha yozish mumkin: T _0 ()
uchun (;;)
Qulflash (m) ;
kuting (E, m);
/* Biz umumiy xotira X bilan ishlay olamiz, chunki biz mutexga egamiz m */
agar (P(X))
/* Shart bajarildi: kerakli harakatlarni bajaring */
qulfni ochish ( m ) ;
Keyin operatsiya algoritmi 7) ( ya'ni = bir,... ,n sxematik tarzda quyidagicha yozilishi mumkin:
T_i ()
uchun (;;)
Qulflash (m) ;
/* Biz umumiy xotira X bilan ishlay olamiz, chunki biz mutexga egamiz m */
/* X ga ma’lumotlarni yozish */
Signal (E);
qulfni ochish ( m ) ;
Do'stlaringiz bilan baham: |