Кіріспе
Компьютерлік бағдарламалаудағы ұғым. Қайта кірісу – функция немесе кіші бағдарлама орындалуын аяқтамай үзіліске ұшырап, кейін қайта жалғастырыла алатын бағдарламалау ұғымы. Бұл функцияның бұрынғы орындалуын аяқтамас бұрын қайта шақырылуы мүмкін дегенді білдіреді. Қайта кірісетін код бір функция бірнеше рет бір мезгілде немесе жылдамдықпен шақырылғанда қауіпсіз және болжамды жұмыс істеуі үшін жасалады. Компьютерлік бағдарлама немесе кіші бағдарлама егер бірнеше шақыруды бірнеше процессорда қауіпсіз түрде бірдей орындай алса, немесе бір процессорлы жүйеде орындалуы үзіліске ұшырап, оның жаңа орындалуы қауіпсіз түрде бастала алса (оны "қайта кіргізуге" болады) қайта кірісетін болып есептеледі. Үзіліс ішкі әрекет, мысалы, секіру немесе шақыру арқылы немесе сыртқы әрекет, мысалы, үзіліс немесе сигнал арқылы туындауы мүмкін. Рекурсиядан айырмашылығы, онда жаңа шақырулар тек ішкі шақыру арқылы ғана жасалады. Бұл анықтама көп бағдарламалық ортадан шыққан, онда бірнеше процесс бір мезгілде жұмыс істей алады және басқару ағыны үзіліске ұшырап, үзіліс қызметіне (ISR) немесе "басқарушы" кіші бағдарламасына берілуі мүмкін. Басқарушы қолданған, үзіліс туған кезде орындалуы мүмкін кез келген кіші бағдарлама қайта кірісетін болуы керек. Сол сияқты, ортақ деректерге қол жеткізетін екі процессордың ортақ коды да қайта кірісетін болуы тиіс. Көбінесе операциялық жүйе ядросы арқылы қол жетімді кіші бағдарламалар қайта кірмейді. Сондықтан үзіліс қызметтері орындай алатын әрекеттерімен шектеледі, мысалы, олар әдетте файлдық жүйеге кіруге және кейде тіпті жадты бөлуге тыйым салынған. Қайта кірісу көп өрісті ортадағы өріс қауіпсіздігі үшін қажет емес, сонымен қатар жеткілікті де емес. Яғни, қайта кірісетін кіші бағдарлама өріс қауіпсіз болуы мүмкін, бірақ керісінше, өріс қауіпсіз код қайта кірісетін болуы міндетті емес (мысалдар үшін төменде қараңыз). Қайта кірісетін бағдарламаларды сипаттау үшін "ортақ код" термині де қолданылады. Кейде қайта кірісетін кіші бағдарламалар анықтамалық материалдарда "сигнал қауіпсіз" деп белгіленеді. Қайта кірісетін бағдарламалар көбінесе "таза процедуралар" болып табылады.
Reentrancy is a programming concept where a function or subroutine can be interrupted and then resumed before it finishes executing. This means that the function can be called again before it completes its previous execution. Reentrant code is designed to be safe and predictable when multiple instances of the same function are called simultaneously or in quick succession. A computer program or subroutine is called reentrant if multiple invocations can safely run concurrently on multiple processors, or if on a single processor system its execution can be interrupted and a new execution of it can be safely started (it can be "re entered"). The interruption could be caused by an internal action such as a jump or call, or by an external action such as an interrupt or signal, unlike recursion, where new invocations can only be caused by internal call. This definition originates from multiprogramming environments, where multiple processes may be active concurrently and where the flow of control could be interrupted by an interrupt and transferred to an interrupt service routine (ISR) or "handler" subroutine. Any subroutine used by the handler that could potentially have been executing when the interrupt was triggered should be reentrant. Similarly, code shared by two processors accessing shared data should be reentrant. Often, subroutines accessible via the operating system kernel are not reentrant. Hence, interrupt service routines are limited in the actions they can perform; for instance, they are usually restricted from accessing the file system and sometimes even from allocating memory. Reentrancy is neither necessary nor sufficient for thread safety in multi threaded environments. In other words, a reentrant subroutine can be thread safe, but Conversely, thread safe code need not be reentrant (see below for examples). Other terms used for reentrant programs include "sharable code". Reentrant subroutines are sometimes marked in reference material as being "signal safe". Reentrant programs are often "pure procedures".
Өмірбаян
Қайта кірісу идемпотенциядан өзгеше, онда функция бірнеше рет шақырылуы мүмкін, бірақ тек бір рет шақырылғандай дәл сол нәтижені беруі мүмкін. Жалпы айтқанда, функция кейбір кіріс деректеріне негізделген шығыс деректерін жасайды (бірақ екеуі де, әдетте, міндетті емес). Кез келген функция кез келген уақытта ортақ деректерге қол жеткізе алады. Егер деректерді кез келген функция өзгерте алса (және ешқайсысы да осы өзгерістерді қадағаламаса), деректі пайдаланатындарға оның кез келген уақытта бұрынғыдай болады деген кепілдік жоқ. Деректердің қолданылатын аумағын сипаттайтын ауқым деп аталатын қасиеті бар. Деректер ауқымы жаһандық (ешқандай функцияның ауқымынан тыс және белгісіз мерзімді) немесе жергілікті (әр функция шақырылғанда жасалады және одан шыққанда жойылады) болуы мүмкін. Жергілікті деректер қайта кіруге қатысқан немесе қатыспаған кез келген процедурамен бөліспейді, сондықтан ол қайта кіруге әсер етпейді. Жаһандық деректер функциялардың сыртында анықталады және бірнеше функцияға қол жеткізе алады, жаһандық айнымалылар (барлық функциялар арасында ортақ деректер) немесе статикалық айнымалылар (бір функцияның барлық шақырулары үшін ортақ деректер) түрінде. Объектіге бағытталған бағдарламалауда жаһандық деректер сыныптың ауқымында анықталады және жеке болып, тек сол сыныптың функцияларына қол жеткізуге мүмкіндік береді. Сондай-ақ, сынып айнымалысы сынып мысалымен байланысқан инстанция айнымалылары деген ұғым бар. Осы себептерге байланысты, объектіге бағытталған бағдарламалауда бұл айырмашылық әдетте сыныптан тыс қол жетімді деректерге (ашық) және сынып мысалына тәуелсіз деректерге (статикалық) қатысты қолданылады. Қайта кірісу жіп қауіпсіздігінен өзгеше, бірақ оған тығыз байланысты. Функция жіп қауіпсіз болса да, қайта кіре бермейтін болуы мүмкін. Мысалы, функцияны мутекстің ішіне орауға болады (бұл көп жіпті ортадағы проблемаларды болдырмайды), бірақ егер бұл функция үзіліс қызметтік бағдарламасында қолданылса, ол мутексті босату үшін күтіп, ашарлыққа ұшырауы мүмкін. Шатасудың басты себебі - қайта кіріс тек бір жіптің орындалуына қатысты. Бұл көп тапсырмалы операциялық жүйелердің болмаған кезінен қалған ұғым.
Қайта кіру ережесі
Қайта кіріп тұратын код синхрондастырусыз статикалық немесе жаһандық тұрақты емес деректерді ұстай алмайды. Қайта кіріп тұратын функциялар жаһандық деректермен жұмыс істей алады. Мысалы, қайта кіретін үзіліс қызметтік бағдарламасы жұмыс істеу үшін аппараттық күйдің бір бөлігін (мысалы, тізбектік портты оқу буферін) алуы мүмкін, ол жаһандық ғана емес, сонымен қатар өзгергіш. Дегенмен, статикалық айнымалыларды және жаһандық деректерді пайдалану ұсынылмайды, синхрондалған код бөлімдерінен басқа, осы айнымалыларда тек атомдық оқу-жазу нұсқауларын қолдану керек (осындай нұсқау орындалу кезінде үзіліс немесе сигнал келуі мүмкін болмауы керек). C тілінде тіпті оқу немесе жазудың атомдығы кепілденбеуі мүмкін; ол бірнеше оқу немесе жазу операцияларына бөлінуі мүмкін. C стандарты және SUSv3 осы мақсатта sig_atomic_t түрін ұсынады, бірақ тек қарапайым оқу және жазу операциялары үшін кепілдіктер беріледі, арттыру немесе кеміту үшін емес. Күрделі атомдық операциялар C11 стандартында қолжетімді, ол stdatomic.h кітапханасын ұсынады. Қайта кіріп тұратын код синхрондастырусыз өзін өзгертпеуі керек. Операциялық жүйе процеске оның кодын өзгертуге рұқсат беруі мүмкін. Бұған түрлі себептер болуы мүмкін (мысалы, графикалық кескіндерді жылдам өзгерту), бірақ бұл әдетте қайта кіруге байланысты проблемаларды болдырмау үшін синхрондауды қажет етеді. Алайда, егер код өзінің жеке жадысында орналасқан болса, өзін өзгерткісіне болады. Яғни, әрбір жаңа шақыру бастапқы кодтың көшірмесі жасалған басқа физикалық машиналық код орнында болса, ол басқа шақыруларға әсер етпейді, тіпті осы нақты шақыру орындалу кезінде өзін өзгертсе де (жіп). Қайта кіріп тұратын код синхрондастырусыз қайта кіріп тұратын компьютерлік бағдарламаларды немесе процедураларды шақыра алмайды. Пайдаланушы, нысан немесе процестің басымдығының бірнеше деңгейлері немесе көп процессорлық жүйелер әдетте қайта кіруге болатын кодты басқаруды қиындатады. Қайта кіруге арналған процедураның ішінде жасалған кез келген кіріс немесе жанама әсерлерді қадағалау маңызды. Операциялық жүйе ресурстарымен немесе жергілікті емес деректермен жұмыс істейтін процедураның қайта кіруі тиісті операциялардың атомдығына байланысты. Мысалы, егер процедура 32 биттік машинада 64 биттік жаһандық айнымалыны өзгертсе, операция екі 32 биттік операцияға бөлінуі мүмкін, сондықтан егер процедура орындалу кезінде үзіліске ұшырап, үзіліс өңдеушісінен қайта шақырылса, жаһандық айнымалы тек 32 биті жаңартылған күйде болуы мүмкін. Бағдарламалау тілі секіру немесе шақыру сияқты ішкі әрекеттерден туындаған үзілістер үшін атомдық кепілдіктерді ұсынуы мүмкін. Содан кейін (global := 1) + (f) сияқты өрнекте, онда субөрнектерді бағалау тәртібі бағдарламалау тілінде кездейсоқ болуы мүмкін, жаһандық айнымалы 1-ге немесе оның бұрынғы мәніне орнатылады, бірақ тек бір бөлігі жаңартылған аралық күйде емес. (Бұл C тілінде болуы мүмкін, өйткені өрнекте реттілік нүктесі жоқ.) Операциялық жүйе сигналдар үшін атомдық кепілдіктерді ұсынуы мүмкін, мысалы, жүйелік шақыру сигналмен үзілгенде жартылай әсер етпейді. Процессордың аппараттық құралдары үзілістер үшін атомдық кепілдіктерді ұсынуы мүмкін, мысалы, үзілген процессор нұсқауларының жартылай әсері болмайды.
Reentrant code may not modify itself without synchronization. The operating system might allow a process to modify its code. There are various reasons for this (e. g., blitting graphics quickly) but this generally requires synchronization to avoid problems with reentrancy.<p>It may, however, modify itself if it resides in its own unique memory. That is, if each new invocation uses a different physical machine code location where a copy of the original code is made, it will not affect other invocations even if it modifies itself during execution of that particular invocation (thread). Reentrant code may not call non reentrant computer programs or routines without synchronization. Multiple levels of user, object, or process priority or multiprocessing usually complicate the control of reentrant code. It is important to keep track of any access or side effects that are done inside a routine designed to be reentrant. Reentrancy of a subroutine that operates on operating system resources or non local data depends on the atomicity of the respective operations. For example, if the subroutine modifies a 64 bit global variable on a 32 bit machine, the operation may be split into two 32 bit operations, and thus, if the subroutine is interrupted while executing, and called again from the interrupt handler, the global variable may be in a state where only 32 bits have been updated. The programming language might provide atomicity guarantees for interruption caused by an internal action such as a jump or call. Then the function in an expression like (global:=1) + (f ), where the order of evaluation of the subexpressions might be arbitrary in a programming language, would see the global variable either set to 1 or to its previous value, but not in an intermediate state where only part has been updated. (The latter can happen in C, because the expression has no sequence point.) The operating system might provide atomicity guarantees for signals, such as a system call interrupted by a signal not having a partial effect. The processor hardware might provide atomicity guarantees for interrupts, such as interrupted processor instructions not having partial effects.
Мысалдар
Қайта кірісуді мысалмен түсіндіру үшін, бұл мақалада екі нұсқаушыны қабылдап, олардың мәндерін ауыстыратын C тіліндегі қосымша функциясы және сол swap функциясын шақыратын үзіліс қызметтік бағдарламасы қолданылады.
Қайта кіріп-шығатын үзіліс басқарушысы
Қайта кіретін үзіліс өңдеуші – үзіліс өңдеушінің басында-ақ үзілістерді қайта қосатын өңдеуші. Бұл үзіліс жауабының уақытын қысқартуға мүмкіндік береді. Әдетте, үзіліс қызметтік процедураларын бағдарламалау кезінде, үзіліс өңдеушіде мүмкіндігінше ертерек үзілістерді қайта қосу ұсынылады. Осылай істеу үзілістерді жоғалтудан сақтайды.