Ի՞նչ են օպտիմիստական և պессիմիստական արգելքները։
sobes.tech AI
Պատասխան AI-ից
Օպտիմիստական և պեսիմիստական փակումները՝ դա մրցակցային միջավայրերում (բազմասխալային ծրագրեր, տվյալների բազաներ) ընդհանուր տվյալների մուտքի կառավարման մոտեցումներ են:
Պեսիմիստական փակումը:
Նախատեսում է, որ տվյալների մուտքի ժամանակ հավանական են կոնֆլիկտները: Նախքան ռեսուրսին մուտք գործելը, հոսքը կամ գործարքը այն փակագծում է (առանձին կամ բաժանված փակագծով): Այլ հոսքերը, որոնք փորձում են մուտք գործել, կսպասեն, մինչև փակագծը բացվի:
- Առավելություններ: Տվյալների ամբողջականությունը ապահովում է, հեշտ է իրականացնել ցածր մրցակցությամբ:
- Կողմեր: Կարող է հանգեցնել deadlock-ների, բարձր մրցակցությամբ՝ նվազեցնել անցանելիությունը:
- Օրինակներ:
synchronizedբանալի բառը Java-ում, փակագծեր տողային կամ աղյուսակային մակարդակով տվյալների բազաներում:
// Պեսիմիստական փակման օրինակ Java-ում
public class Counter {
private int count = 0;
public synchronized void increment() {
count++; // Փակագծում է օբյեկտի վրա, միայն մեկ հոսք կարող է կատարել այս մեթոդը միաժամանակ
}
public synchronized int getCount() {
return count;
}
}
Օպտիմիստական փակումը:
Նախատեսում է, որ տվյալների մուտքի ժամանակ անհավանական են կոնֆլիկտները: Տվյալների մուտքը կատարվում է առանց փակագծերի: Փոփոխությունները պահելուց առաջ ստուգվում է, արդյոք տվյալները փոխվել են այլ հոսքի կողմից, երբ դրանք կարդացվել էին: Եթե փոխվել են, գործողությունը չեղյալ է հայտարարվում և սովորաբար կրկնվում է (retry):
- Առավելություններ: Բարձր անցանելիություն՝ ցածր մրցակցությամբ, առանց deadlock-ների:
- Կողմեր: Կոնֆլիկտներ կարող են առաջանալ, որոնք պահանջում են կրկնություն, ինչը բարդացնում է տրամաբանությունը:
- Օրինակներ: Compare-And-Swap (CAS) գործողություններ, տարբերակման կառավարման համակարգեր (versioning) տվյալների բազաներում՝ օրինակ՝ տարբերակի սյուն կամ ժամանակային նշան օգտագործելով:
// Օպտիմիստական փակման օրինակ CAS-ով (java.util.concurrent.atomic)
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
// Ատոմիկ ավելացման փորձ
// Եթե արժեքը փոխվել է միջեւ ընթերցում և նորացման փորձի, գործողությունը կրկնվում է
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
Համեմատություն:
| Գծագիր | Պեսիմիստական փակումը | Օպտիմիստական փակումը |
|---|---|---|
| Նպատկեր | Կոնֆլիկտները հավանական են | Կոնֆլիկտները քիչ հավանական են |
| Մուտք | Փակագծում մինչև մուտք գործելը | Մուտք առանց փակագծերի, ստուգում գրանցման ժամանակ |
| Բարձր կոնֆլիկտային արագության դեպքում | Կարող է հանգեցնել փակագծերի, նվազեցնել անցանելիությունը | Շատ հաճախակի կրկնություններ, նվազեցնել արտադրողականությունը |
| Նվազ կոնֆլիկտային արագության դեպքում | Կարող է ավելացնել ծախսեր | Բարձր անցանելիություն |
| Deadlock խնդիր | Միջնորդ է | Անհնար (համառոտ մուտքի տեսանկյունից) |