Кіріспе

Компьютерлік бағдарламалаудағы ұғым. Қайта кірісу – функция немесе кіші бағдарлама орындалуын аяқтамай үзіліске ұшырап, кейін қайта жалғастырыла алатын бағдарламалау ұғымы. Бұл функцияның бұрынғы орындалуын аяқтамас бұрын қайта шақырылуы мүмкін дегенді білдіреді. Қайта кірісетін код бір функция бірнеше рет бір мезгілде немесе жылдамдықпен шақырылғанда қауіпсіз және болжамды жұмыс істеуі үшін жасалады. Компьютерлік бағдарлама немесе кіші бағдарлама егер бірнеше шақыруды бірнеше процессорда қауіпсіз түрде бірдей орындай алса, немесе бір процессорлы жүйеде орындалуы үзіліске ұшырап, оның жаңа орындалуы қауіпсіз түрде бастала алса (оны "қайта кіргізуге" болады) қайта кірісетін болып есептеледі. Үзіліс ішкі әрекет, мысалы, секіру немесе шақыру арқылы немесе сыртқы әрекет, мысалы, үзіліс немесе сигнал арқылы туындауы мүмкін. Рекурсиядан айырмашылығы, онда жаңа шақырулар тек ішкі шақыру арқылы ғана жасалады. Бұл анықтама көп бағдарламалық ортадан шыққан, онда бірнеше процесс бір мезгілде жұмыс істей алады және басқару ағыны үзіліске ұшырап, үзіліс қызметіне (ISR) немесе "басқарушы" кіші бағдарламасына берілуі мүмкін. Басқарушы қолданған, үзіліс туған кезде орындалуы мүмкін кез келген кіші бағдарлама қайта кірісетін болуы керек. Сол сияқты, ортақ деректерге қол жеткізетін екі процессордың ортақ коды да қайта кірісетін болуы тиіс. Көбінесе операциялық жүйе ядросы арқылы қол жетімді кіші бағдарламалар қайта кірмейді. Сондықтан үзіліс қызметтері орындай алатын әрекеттерімен шектеледі, мысалы, олар әдетте файлдық жүйеге кіруге және кейде тіпті жадты бөлуге тыйым салынған. Қайта кірісу көп өрісті ортадағы өріс қауіпсіздігі үшін қажет емес, сонымен қатар жеткілікті де емес. Яғни, қайта кірісетін кіші бағдарлама өріс қауіпсіз болуы мүмкін, бірақ керісінше, өріс қауіпсіз код қайта кірісетін болуы міндетті емес (мысалдар үшін төменде қараңыз). Қайта кірісетін бағдарламаларды сипаттау үшін "ортақ код" термині де қолданылады. Кейде қайта кірісетін кіші бағдарламалар анықтамалық материалдарда "сигнал қауіпсіз" деп белгіленеді. Қайта кірісетін бағдарламалар көбінесе "таза процедуралар" болып табылады.

Өмірбаян

Қайта кірісу идемпотенциядан өзгеше, онда функция бірнеше рет шақырылуы мүмкін, бірақ тек бір рет шақырылғандай дәл сол нәтижені беруі мүмкін. Жалпы айтқанда, функция кейбір кіріс деректеріне негізделген шығыс деректерін жасайды (бірақ екеуі де, әдетте, міндетті емес). Кез келген функция кез келген уақытта ортақ деректерге қол жеткізе алады. Егер деректерді кез келген функция өзгерте алса (және ешқайсысы да осы өзгерістерді қадағаламаса), деректі пайдаланатындарға оның кез келген уақытта бұрынғыдай болады деген кепілдік жоқ. Деректердің қолданылатын аумағын сипаттайтын ауқым деп аталатын қасиеті бар. Деректер ауқымы жаһандық (ешқандай функцияның ауқымынан тыс және белгісіз мерзімді) немесе жергілікті (әр функция шақырылғанда жасалады және одан шыққанда жойылады) болуы мүмкін. Жергілікті деректер қайта кіруге қатысқан немесе қатыспаған кез келген процедурамен бөліспейді, сондықтан ол қайта кіруге әсер етпейді. Жаһандық деректер функциялардың сыртында анықталады және бірнеше функцияға қол жеткізе алады, жаһандық айнымалылар (барлық функциялар арасында ортақ деректер) немесе статикалық айнымалылар (бір функцияның барлық шақырулары үшін ортақ деректер) түрінде. Объектіге бағытталған бағдарламалауда жаһандық деректер сыныптың ауқымында анықталады және жеке болып, тек сол сыныптың функцияларына қол жеткізуге мүмкіндік береді. Сондай-ақ, сынып айнымалысы сынып мысалымен байланысқан инстанция айнымалылары деген ұғым бар. Осы себептерге байланысты, объектіге бағытталған бағдарламалауда бұл айырмашылық әдетте сыныптан тыс қол жетімді деректерге (ашық) және сынып мысалына тәуелсіз деректерге (статикалық) қатысты қолданылады. Қайта кірісу жіп қауіпсіздігінен өзгеше, бірақ оған тығыз байланысты. Функция жіп қауіпсіз болса да, қайта кіре бермейтін болуы мүмкін. Мысалы, функцияны мутекстің ішіне орауға болады (бұл көп жіпті ортадағы проблемаларды болдырмайды), бірақ егер бұл функция үзіліс қызметтік бағдарламасында қолданылса, ол мутексті босату үшін күтіп, ашарлыққа ұшырауы мүмкін. Шатасудың басты себебі - қайта кіріс тек бір жіптің орындалуына қатысты. Бұл көп тапсырмалы операциялық жүйелердің болмаған кезінен қалған ұғым.

Қайта кіру ережесі

Қайта кіріп тұратын код синхрондастырусыз статикалық немесе жаһандық тұрақты емес деректерді ұстай алмайды. Қайта кіріп тұратын функциялар жаһандық деректермен жұмыс істей алады. Мысалы, қайта кіретін үзіліс қызметтік бағдарламасы жұмыс істеу үшін аппараттық күйдің бір бөлігін (мысалы, тізбектік портты оқу буферін) алуы мүмкін, ол жаһандық ғана емес, сонымен қатар өзгергіш. Дегенмен, статикалық айнымалыларды және жаһандық деректерді пайдалану ұсынылмайды, синхрондалған код бөлімдерінен басқа, осы айнымалыларда тек атомдық оқу-жазу нұсқауларын қолдану керек (осындай нұсқау орындалу кезінде үзіліс немесе сигнал келуі мүмкін болмауы керек). C тілінде тіпті оқу немесе жазудың атомдығы кепілденбеуі мүмкін; ол бірнеше оқу немесе жазу операцияларына бөлінуі мүмкін. C стандарты және SUSv3 осы мақсатта sig_atomic_t түрін ұсынады, бірақ тек қарапайым оқу және жазу операциялары үшін кепілдіктер беріледі, арттыру немесе кеміту үшін емес. Күрделі атомдық операциялар C11 стандартында қолжетімді, ол stdatomic.h кітапханасын ұсынады. Қайта кіріп тұратын код синхрондастырусыз өзін өзгертпеуі керек. Операциялық жүйе процеске оның кодын өзгертуге рұқсат беруі мүмкін. Бұған түрлі себептер болуы мүмкін (мысалы, графикалық кескіндерді жылдам өзгерту), бірақ бұл әдетте қайта кіруге байланысты проблемаларды болдырмау үшін синхрондауды қажет етеді. Алайда, егер код өзінің жеке жадысында орналасқан болса, өзін өзгерткісіне болады. Яғни, әрбір жаңа шақыру бастапқы кодтың көшірмесі жасалған басқа физикалық машиналық код орнында болса, ол басқа шақыруларға әсер етпейді, тіпті осы нақты шақыру орындалу кезінде өзін өзгертсе де (жіп). Қайта кіріп тұратын код синхрондастырусыз қайта кіріп тұратын компьютерлік бағдарламаларды немесе процедураларды шақыра алмайды. Пайдаланушы, нысан немесе процестің басымдығының бірнеше деңгейлері немесе көп процессорлық жүйелер әдетте қайта кіруге болатын кодты басқаруды қиындатады. Қайта кіруге арналған процедураның ішінде жасалған кез келген кіріс немесе жанама әсерлерді қадағалау маңызды. Операциялық жүйе ресурстарымен немесе жергілікті емес деректермен жұмыс істейтін процедураның қайта кіруі тиісті операциялардың атомдығына байланысты. Мысалы, егер процедура 32 биттік машинада 64 биттік жаһандық айнымалыны өзгертсе, операция екі 32 биттік операцияға бөлінуі мүмкін, сондықтан егер процедура орындалу кезінде үзіліске ұшырап, үзіліс өңдеушісінен қайта шақырылса, жаһандық айнымалы тек 32 биті жаңартылған күйде болуы мүмкін. Бағдарламалау тілі секіру немесе шақыру сияқты ішкі әрекеттерден туындаған үзілістер үшін атомдық кепілдіктерді ұсынуы мүмкін. Содан кейін (global := 1) + (f) сияқты өрнекте, онда субөрнектерді бағалау тәртібі бағдарламалау тілінде кездейсоқ болуы мүмкін, жаһандық айнымалы 1-ге немесе оның бұрынғы мәніне орнатылады, бірақ тек бір бөлігі жаңартылған аралық күйде емес. (Бұл C тілінде болуы мүмкін, өйткені өрнекте реттілік нүктесі жоқ.) Операциялық жүйе сигналдар үшін атомдық кепілдіктерді ұсынуы мүмкін, мысалы, жүйелік шақыру сигналмен үзілгенде жартылай әсер етпейді. Процессордың аппараттық құралдары үзілістер үшін атомдық кепілдіктерді ұсынуы мүмкін, мысалы, үзілген процессор нұсқауларының жартылай әсері болмайды.

Мысалдар

Қайта кірісуді мысалмен түсіндіру үшін, бұл мақалада екі нұсқаушыны қабылдап, олардың мәндерін ауыстыратын C тіліндегі қосымша функциясы және сол swap функциясын шақыратын үзіліс қызметтік бағдарламасы қолданылады.

Қайта кіріп-шығатын үзіліс басқарушысы

Қайта кіретін үзіліс өңдеуші – үзіліс өңдеушінің басында-ақ үзілістерді қайта қосатын өңдеуші. Бұл үзіліс жауабының уақытын қысқартуға мүмкіндік береді. Әдетте, үзіліс қызметтік процедураларын бағдарламалау кезінде, үзіліс өңдеушіде мүмкіндігінше ертерек үзілістерді қайта қосу ұсынылады. Осылай істеу үзілістерді жоғалтудан сақтайды.