3.1 Active object
Active object — bu dasturning mantiqasidan foydalanishni bir oqimdan boshqa bir oqimga ajratadigan dizayn patrni. Ushbu patrnning maqsadi - metodlarni asinxron qo'ng'iroqlarini va so'rovlar jadvalini ishlatib parallel bajarilishini ta'minlashdir.
Soddalashtirilgan varianti:
Klassik varianti:
Bu patrn oltita elementdan iborat:
- Proxy obyekti, mijozning ommaviy usullariga kirish interfeysi taqdim etadi.
- Aktiv obyektdan foydalanish metodlarini belgilaydigan interfeys.
- Mijozlardan kelib tushadigan so'rovlar ro'yxati.
- Jadvalchi (scheduler), so'rovlarni bajarish tartibini belgilaydi.
- Aktiv obyekti metodlarining realizatsiyasi.
- Callback yoki o'zgaruvchi (variable) yordamida mijozning natijani olish imkoniyati.
3.2 Lock
Lock patterni — bu bir nechta oqimlar orasida umumiy resursga eksklyuziv kirishni ta'minlash imkonini beradigan sinxronizatsiya mexanizmi. Blokirovkalar parallel bajarilishni boshqarish siyosatini ta'minlash usulidir.
Asosan, soft lock ishlatiladi, bu holatda har bir oqim ma'lum umumiy resursga kirishdan oldin blokirovka olishga harakat qiladi.
Lekin ba'zi tizimlarda majburiy blokirovka mexanizmi ta'minlanadi, uni ishlatish orqali ruxsatsiz kirishga urinish uyg'otish uchun aynan shu resursni bir bloklangan oqim ichida ishlovchi yaratadi.
Semaformi — eng oddiy blokirovka turi. Axborotdan foydalanish nuqtai nazaridan umumiy va eksklyuziv kirish rejimlari o'rtasida hech qanday farq qilinmaydi. Umumiy kirish rejimida bir nechta oqimlar ma'lumotlarga faqat o'qish rejimida kirish uchun blokirovkani talab qilishlari mumkin. Yangilash va o'chirish algoritmlarida eksklyuziv kirish rejimi ham qo'llaniladi.
Blokirovka turlari turli xil strategiyalar bilan ajralib turadi. Ko'pchilik realizatsiyalarda blokirovkani so'rash blokirovka qilingan resursga kirish paydo bo'lishi bilan oqimning keyingi bajarilishini to'sib qo'yadi.
Spinlock — bu blokirovka, kirishni kutayotgan bir tsikl ichida kutadi. Agar oqim blokirovkani qisqa vaqt kutayotgan bo'lsa, bu juda samarali bo'lishi mumkin, bu ortiqcha oqim dasturlarini qayta rejalashtirishdan qochadi. Biroq, bir oqim uzoq vaqt blokirovka qilsalar, kutish xarajatlari katta bo'ladi.
Blokirovka mexanizmini samarali amalga oshirish uchun apparat darajasida qo'llab-quvvatlash talab qilinadi. Bu turli xil atomik operatsiyalar, masalan, "test-and-set", "fetch-and-add" yoki "compare-and-swap" yordamida amalga oshirilishi mumkin. Bunday ko'rsatmalar orqali blokirovka bo'sh bo'lsa uni egallash imkonini beradi.
3.3 Monitor
Monitor patrni — yuqori darajadagi jarayonlararo sinxronizatsiya va o'zaro ta'sir mexanizmi bo'lib, umumiy resurslarga kirishni ta'minlaydi. Bu umumiy resursdan foydalanayotgan ikki yoki undan ortiq kompyuter vazifalari o'rtasida sinxronizatsiya usuli.
Monitorlarga asoslangan multitaskingda, kompilyator yoki interpretator dasturchi uchun tarmoq sinxronizatsiya primitivlariga murojaat qilishni o'chirib, to'g'ri shaklda berilgan protseduralarga bloklash-ochish kodini qo'shadi.
Monitor quyidagilardan iborat:
- umumiy resurs bilan ishlaydigan protseduralar majmuasi
- mutex
- bu resurs bilan bog'liq o'zgaruvchilar
- invariant, bu poyga holatini oldini olish uchun shartlarni ta'riflaydi
Monitor protsedurasi mutexni ishga tushirishdan oldin egallaydi va uni protseduradan chiqmaguniga qadar ushlab turadi yoki biror shartni kutadi. Agar har bir protsedura mutexni bo'shatishdan oldin invariantni haqiqatdan kelib chiqishini kafolatlaydi deb hisoblaydigan bo'lsa, poygaga yetaklaydigan holatda hech qanday vazifa resursni qabul qilolmaydi.
Bu Java da synchronized operatori wait() va notify() metodlari bilan qanday ishlashini tasvirlaydi.
3.4 Double check locking
Double checked locking — bu patrnga kirish boshlanishidagi ortiqcha xarajatlarni kamaytirishni maqsad qilgan parallel dizayn patrni.
Boshlanishida sinxronizatsiya ishg'ol qilmasdan blokirovka sharti tekshiriladi. Faqat blokirovkani olish kerakligini anglatadigan tekshiruv natijalari oqim faqat shunda blokirovkani olishga harakat qiladi.
//Double-Checked Locking
public final class Singleton {
private static Singleton instance; //Volatile modifierni unutmay
public static Singleton getInstance() {
if (instance == null) { //Read
synchronized (Singleton.class) { //
if (instance == null) { //Read Write
instance = new Singleton(); //
}
}
}
}
Thread-safe muhitda singleton obyektini qanday yaratish mumkin?
public static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
}
Agar sen har xil oqimlardan Singleton obyektini yaratayotgan bo'lsang, bir vaqtning o'zida bir nechta obyeklar yaratilishi mumkin. Bu qabul qilinmaydi. Shuning uchun obyekt yaratishni synchronized operatoriga o'rash maqsadga muvofiqdir.
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
Bu usul ishlaydi, lekin unda kichik minus bor. Bir marta obyekt yaratilganidan keyin, har safar uni olishga urinishda synchronized blokida tekshiruv amalga oshiriladi, demak, joriy oqim bloklanadi va bu bilan bog'liq har qanday narsalar ham. Shu sababli bu kodni bir oz optimallashtirish mumkin:
public static Singleton getInstance() {
if (instance != null)
return instance;
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
Ba'zi tillarda va/yoki ba'zi mashinalarda ushbu patrni xavfsiz ta'minlab bo'lmaydi. Shuning uchun, ba'zan uni anti-patrn deb atashadi. Bunday xususiyatlar Java Memory Model va C++ Memory Modelda qattiq tartib "happens before" munosabatiga sabab bo'ldi.
Ko'pincha, bu parallellikda lazy initializationni amalga oshirishda xarajatlarni kamaytirish uchun qo'llaniladi, masalan, Singleton dizayn patrnining bir qismi sifatida. Lazy initialization variabledagi qiymat kerak bo'lmaguncha, initialization kechiktiriladi.
3.5 Scheduler
Scheduler (Rejalashtiruvchi) — parralel dizayn patrn, siyosatni amalga oshirish mexanizmini ta'minlaydi, lekin u hech qaysi konkret siyosatga bog'liq emas. Oqimlar ketma-ket kodni bajarish tartibini boshqaradi, kutayotgan oqimlarning ketma-ketligini ochiq ko'rsatadigan obyekt yordamida.
Bu patrn bilan batafsil tanishishni rasmiy hujjatlarda ko'rishingiz mumkin. Shuningdek, ajoyib rus tilida maqola mavjud.
GO TO FULL VERSION