Կարդալ-պատճենել թարմացում


RCU-ն մեթոդ է, որը կարող է կառավարել բազմաթիվ գործընթացների կատարումը և կարող է տեղակայվել ցանկացած օպերացիոն համակարգում, և դրանցից մեկը Linux միջուկն է: Դա գործընթացի համաժամացման հեշտ մեթոդ է և այն բաժանում է RCU-ի թարմացումը երկու փուլի՝ մասնավորապես հեռացման և վերականգնման: Այս մեխանիզմը թույլ է տալիս կարդալ միաժամանակ թարմացումների հետ միասին: Գործընթացը տեղի է ունենում միաժամանակ բազմաթիվ ընթերցողների և օպերացիոն համակարգի թարմացնողների միջև: Բացի հեշտ գործընթացից, այն նաև հուսալի է մուտք գործել միաժամանակյա գործընթացի համար:

Կարդալ-պատճենել թարմացում

Սահմանում

Read-copy update-ը (RCU) տվյալների լավագույն կառուցվածքներից մեկն է, որը հետևում է միաժամանակյա գործընթացների համաժամացմանը, որը սահմանափակում է մուտեքսների կամ կողպեքների օգտագործումը, երբ բազմաթելերը միաժամանակ աշխատում են՝ կարդալու և թարմացնելու ընդհանուր ռեսուրսները, ինչպիսիք են հիշողությունը, սարքը կամ ֆայլը:

Read-Copy թարմացման փուլերը (RCU).

Թարմացումը բաժանված է երկու փուլի՝ մասնավորապես.

  • Հեռացում

  • Մելիորացիա

Առանց RCU-ի օգտագործման, հեռացող կամ հեռացվող շարանը պետք է արգելափակի տարրը, որպեսզի որևէ այլ տարր չկարողանա մուտք գործել այն: Բայց RCU-ի դեպքում հեռացման փուլն օգտագործվում է տարրը հղում կատարելու համար և հեշտությամբ հեռացվում է՝ առանց ազդելու անցումների ցուցակների վրա: Շարանը պետք է սպասի, որ բոլոր նախորդ ընթերցողները ավարտեն իրենց RCU-ի ընթերցման կողմի հիմնական բաժինները, նախքան հեռացման փուլում տարրի հղումը ցանկից հեռացնելուց հետո անցնել վերականգնման փուլին:

Կարդալ/գրել կողմի կոդը

Տվյալների կառուցվածքը բաժանված է կարդալու և գրելու գործողությունների: Read-side-ը միաժամանակյա տեսակն է, որը չի փոխում տվյալների կառուցվածքի մոդելը, մինչդեռ գրելու կողմը փոխում է տվյալների կառուցվածքը: RCU-ն օգտագործում է գործընթացի համաժամացումը՝ ընթերցողի և գրողի միջև խոցելիությունից խուսափելու համար:

Միայն այն դեպքում, երբ ընթերցման կողմի միաժամանակյա կոդը օգտագործում է ոչ համաժամանակացված կոդի նման հիշողություն, կարող է աշխատել նույնքան արագ, որքան վերջինս: Քանի որ ատոմային գրությունները դանդաղ են և արգելափակում են հիշողության ավտոբուսները, կարդալու կողմի կոդը չի կարող գրել ընդհանուր տվյալների կառուցվածքներում: Ըստ էության, յուրաքանչյուրը գրում է ընդհանուր տվյալների կառուցվածքում ընդհանուր քեշի տողում, որի արդյունքում ընդհանուր տողը հեռացվում է այլ պրոցեսորների քեշից:

Մյուս պրոցեսորի քեշերը պետք է վերաբեռնեն տվյալները այս վտարումից հետո, որը կպահանջի առնվազն հարյուրավոր ցիկլեր: Քեշի գծի ցատկումը այն խնդիրն է, որտեղ քեշի գծի սեփականությունը փոխարինվում է միջուկների միջև: Այլ թանկարժեք հրահանգներ, ինչպիսիք են հիշողության ցանկապատերը, չեն կարող օգտագործվել ընթերցման կողմի ծրագրերի կողմից:

Այս պայմանները, ըստ էության, բացառում են կարդալու կամ գրելու կողպումը որպես տարբերակ: Կարդալ կողմի գործողությունները պետք է կատարեն ատոմային գրառումներ ընդհանուր տվյալների կառուցվածքներում՝ կարդալու/գրելու ամենապարզ կողպեքներով, որոնք հետևում են միաժամանակ ընթերցողների թվին:

RCU գործողություններ

Պայմանական մեթոդի ընթերցողները օգտագործում են կողպեք, որպեսզի դադարեցնեն թարմացումը տվյալների տարրերը ջնջելուց: Ներկայումս RCU ընթերցողները կարող են օգտագործել շատ ավելի թեթև համաժամացման կամ նույնիսկ ընդհանրապես համաժամացման բացակայություն՝ սպասելով մինչև բոլոր ընթերցողները ավարտեն:

Կիրառական ծրագրի միջերես −

RCU API-ի մի մասը տրված է ստորև,

  • rcu_read_lock  Այն նշում է տվյալների կառուցվածքը, որ RCU-ն պաշտպանված է չի կարող վերականգնվել ամբողջ ժամանակ և հանդիսանում է կրիտիկական հատվածի սկզբնական գործողությունը:

  • rcu_read_unlock  Այս ֆունկցիան օգտագործվում է ընթերցողի կողմից՝ տեղեկացնելու համար, որ այն հեռանում է կրիտիկական հատվածից:

  • Synchronize_rcu()  Synchronize_rcu() ֆունկցիան օգտագործվում է ընթերցող, որը սպասում է, մինչև քննադատական բաժնի ընթերցված կողմը դուրս գա գործընթացից և անմիջապես չի վերադառնա:

  • Call_rcu − Այն ֆունկցիա է, որը կոչվում է synchronize_rcu, երբ բոլոր ակտիվ RCU-ն ընթերցում են կրիտիկական հատվածները: ավարտվել են, ի տարբերություն արգելափակման: Հետադարձ զանգի այս տեսակը հատկապես օգտակար է, երբ արգելափակումն արգելված է կամ երբ թարմացման արդյունավետությունը կարևոր է:

  • Call_rcu  Այս ֆունկցիան ավելի շատ մտահոգված է տեղեկացնելու անվտանգությամբ ընթերցողը թարմացումների արժեքի մասին: Այն նաև պատասխանատու է RCU-ի կողմից պաշտպանված ցուցիչների մասին տվյալների գրանցման համար:

  • rcu_dereference  Այս ֆունկցիան օգտագործվում է բացառապես տեղեկություններ ստանալու համար ցուցիչներ, որոնք ապահովության մեջ են դրվում RCU-ի կողմից: Կրիտիկական հատվածի թելերի ընթացքում այս գործառույթները ներգրավված են միայն այս ֆունկցիայի մեջ

RCU-ի իրականացում

RCU-ն կարող է իրականացվել Linux օպերացիոն համակարգում երկու տարբեր եղանակներով: Դրանցից մեկը օգտագործում է կողպեքի մեթոդը, իսկ մյուսը՝ RCU-ի դասական մեթոդը։

Չնայած կողպման մեթոդը հեշտ է, այն չի կարող իրականացվել իրական ժամանակի օգտագործման մեջ, քանի որ այն անցնում է ընթերցման կողմի երկու կարևոր բաժինների միջև: RCU-ի դասական եղանակով այն ավելի քիչ կատարում է ցույց տալիս թարմացումների վրա:

Read-Copy Update-ի թերությունները

Read-copy թարմացման հիմնական թերությունն այն կանխարգելումն է, քանի որ այն չի կարող օգտագործվել օգտագործողի ռեժիմում: Այս Read-copy թարմացումները չեն կարող օգտագործվել ծառի տվյալների կառուցվածքի կողմից, քանի որ դա կարող է կախված լինել բազմաթիվ թարմացումներից, որոնք չեն կարող ինքնաբերաբար կատարվել:

Եզրակացություն

RCU մեխանիզմն այն է, որը կարող է օգտագործվել ցանկացած օպերացիոն համակարգում՝ արգելափակման մեթոդներից խուսափելու համար: RCU ընթերցումը սկսվում է կողպման գործառույթից և ավարտվում բացելու գործառույթով: Հիմնական ալգորիթմը, որին հետևում է RCU-ն, փոփոխություններ է կատարում՝ սպասելով, որ առկա RCU-ի ընթերցման կողմի կրիտիկական հատվածը ավարտվի և վերջապես մաքրվի գործընթացը: