Кіріспе

Компьютерлік ғылым мен инженерияда транзакциялық жад бір мезгілде бағдарламалауды жеңілдетуге бағытталған, жүктеу және сақтау нұсқауларының тобын атомдық түрде орындауға мүмкіндік береді. Бұл, бір мезгілдегі есептеулерде ортақ жадқа қол жеткізуді басқару үшін деректер базасы транзакцияларына ұқсас, бір мезгілделікті басқару механизмі. Транзакциялық жад жүйелері, төменгі деңгейдегі жиектерді синхрондаудың орнына жоғары деңгейдегі абстракцияны ұсынады. Бұл абстракция, параллель жүйелерде ортақ деректерді бір мезгілде оқу және жазуды үйлестіруге мүмкіндік береді.

Мотивация

Бір мезгілдегі бағдарламалауда, қатарлы жіптер ортақ ресурсқа қол жеткізуге тырысқанда синхронизация қажет. Құлыптар сияқты төмен деңгейлі жіп синхронизациясы құрылымдары пессимистік болып табылады және маңызды бөлімнен тыс жіптерге маңызды бөліммен қорғалған кодты орындауға тыйым салады. Құлыптарды қолдану және босату процесі көбінесе жіптер арасында келіспеушілік аз болған кезде қосымша жүктеме ретінде жұмыс істейді. Транзакциялық жад, жіптерге минималді кедергімен қатар жұмыс істеуге мүмкіндік беру арқылы оптимистік қатарлы басқаруды қамтамасыз етеді. Транзакциялық жад жүйелерінің мақсаты – атомдық қасиеттерді, дәйектілікті және оқшаулануды сақтап, транзакция ретінде белгіленген код аймақтарын ашық түрде қолдау. Транзакция – бұл қақтығыс болмаған жағдайда өзгерістерді орындап, бекітетін операциялардың жиынтығы. Егер қақтығыс анықталса, транзакция бастапқы күйіне (өзгерістер жасау алдында) қайта оралады және барлық қақтығыстар жойылғанға дейін қайтадан орындалады. Сәтті бекітуге дейін транзакция ішіндегі кез келген операцияның нәтижесі болжамды болып табылады. Деректердің бұзылуын болдырмау үшін операцияларды тізбектеп орындауға негізделген құлыптау синхронизациясына қарағанда, транзакциялар ортақ ресурсты өзгертуге тырысатын операциялар аз болғанда қосымша параллелизмге мүмкіндік береді. Бағдарламашы құлыптарды немесе олардың қолданылу ретін нақты анықтауға жауапты болмағандықтан, транзакциялық жадты пайдаланатын бағдарламалар өлі тұруға (deadlock) әкелмейді. Аппараттық транзакциялық жад жүйелері процессорларға, кэш жадына және транзакцияларды қолдау үшін шина протоколына өзгерістер енгізуі мүмкін. Транзакциядағы болжамды мәндер буферде сақталуы керек және басқа жіптерге бекітілгенге дейін көрінбеуі керек. Үлкен буферлер болжамды мәндерді сақтау үшін қолданылады, сонымен бірге негізгі кэш жадының сәйкестік протоколы арқылы жазудың таралуын болдырмайды. Дәстүрлі түрде буферлер жад иерархиясындағы әртүрлі құрылымдарды, мысалы, сақтау кезектерін немесе кэш жадыны пайдалана отырып іске асырылады. Процессордан алыс орналасқан L2 кэш сияқты буферлер көбірек болжамды мәндерді (бірнеше мегабайтқа дейін) сақтай алады. Коммерциялық бағдарламаларда транзакциялардың қолданылуы шектеулі болғандықтан буфердің оңтайлы көлемі әлі де талқыланып жатыр және минималды аппараттық қолдауды қажет етеді (әдетте, атомдық салыстыру және алмастыру операциясы немесе оған баламасы). Алайда, бағдарламалық іске асырулар аппараттық шешімдермен салыстырғанда өнімділік жоғалтуына әкелуі мүмкін. Аппараттық үдеткіш бағдарламалық транзакциялық жадпен байланысты кейбір қосымша шығындарды азайта алады. Қазіргі іске асырулардағы аппараттық транзакциялық жадтың шектеулі мүмкіндіктеріне байланысты, оны пайдаланатын бағдарламаларға толыққанды пайда алу үшін кең ауқымды жөндеулер қажет болуы мүмкін. Мысалы, динамикалық жадты бөлуші өнімділікке елеулі әсер етуі мүмкін, ал құрылымды толтыру кэш жадының сәйкестігі және жалған ортақтастыру мәселелеріне байланысты өнімділікке әсер етуі мүмкін; виртуалды машина контекстінде әртүрлі фоновые жіптер күтпеген транзакцияны тоқтатуға себеп болуы мүмкін.

Тарих

Транзакциялық жадтың ең алғашқы іске асырылған түрлерінің бірі – Transmeta компаниясының Crusoe және Efficeon процессорларында қолданылған есікті сақтау буфері. Дегенмен, бұл тек екілік кодты аудармалау арқылы болжамды оңтайландыруды жеңілдету үшін ғана пайдаланылды, емес, кез келген түріндегі болжамды көп өрісті жұмыспен немесе бағдарламашыларға тікелей қолжетімді ету үшін. Azul Systems Java құрылғыларын жылдамдату мақсатында аппараттық транзакциялық жадты іске қосты, бірақ ол да сыртқы қолданушылардан жасырын болды. Sun Microsystems өзінің Rock процессорында аппараттық транзакциялық жадты және шектеулі болжамды көп өрістілікті іске асырды. Бұл іске асыру, оның құлыптауларды (lock) жою және транзакциялар аппараттық және бағдарламалық қамтамасыз етудің үйлесімімен жүзеге асырылатын күрделі гибридтік транзакциялық жад жүйелері үшін қолданылуы мүмкін екенін көрсетті. Rock процессоры 2009 жылы Oracle компаниясы сатып алғанға дейін тоқтатылды; нақты өнімдер жарыққа шықпады, бірақ зерттеушілерге прототиптік жүйелердің бірнеше үлгісі қолжетімді болды. GCC 4.7 нұсқасынан бастап гибридтік іске асыруды қолданатын транзакциялық жадқа арналған эксперименталды кітапхана бар. Python тілінің PyPy нұсқасы да осы тілге транзакциялық жадты енгізеді.