Кіріспе

Бағдарламалау тілінің ерекшелігі

Компьютерлік бағдарламалауда шексіз цикл (немесе үздіксіз цикл) – сыртқы әрекеттен, мысалы, қуатты өшіру немесе ашаны суыру сияқты тоқтатылмаса, мәңгі жалғасатын нұсқаулар тізбегі. Ол қасақана жасалған болуы мүмкін. Компьютерлік бағдарламада шексіз циклдің болуын анықтауға арналған жалпы алгоритм жоқ; бұл тоқтату есебі (немесе тоқтату мәселесі).

Егжей-тегжейлер

Шексіз цикл – компьютерлік бағдарламадағы нұсқаулар тізбегі, ол циклдің тоқталу шарты болмағандықтан, орындалуы мүмкін емес шарты болғандықтан немесе циклді қайта бастауға себеп болатын жағдайға байланысты, үздіксіз қайталанады. Ескі операциялық жүйелерде, бірлескен көпміндеттілікте, шексіз циклдер әдетте бүкіл жүйенің жауапсыз болуына әкелетін. Қазіргі кезде кең таралған уақыт үлестірулі көпміндеттілік модельде, шексіз циклдер әдетте бағдарламаның барлық процессор уақытын жұмсайды, бірақ оны пайдаланушы тоқтатуға болады. «Жұмысты күту циклі» кейде «шексіз цикл» деп те аталады. Компьютердің тоқтап қалуының немесе қатып қалуының бір себебі – шексіз циклдер; басқа себептері – жад айырбастау, өзара байланыс тұйықталуы және жадқа рұқсатсыз кіру.

Қалайтатын және қаламаған цикл

Looping – белгілі бір шарт орындалғанға дейін нұсқаулар жиынтығының қайталануы. Шеңбердің өзіндік ерекшелігіне байланысты шарт ешқашан орындалмаса, шексіз цикл пайда болады.

Қасақана ілмектеу

Кейбір жағдайларда мұндай әрекет қажет болуы мүмкін. Мысалы, картридждік ойын консольдеріндегі ойындардың негізгі циклында әдетте шығу шарты болмайды, себебі бағдарламаны тоқтатуға операциялық жүйе жоқ; консоль өшірілгенше цикл жалғаса береді. Қазіргі заманғы интерактивті компьютерлер пайдаланушының енгізген мәліметтерін немесе құрылғының белсенділігін үнемі бақылап отыруын қажет етеді, сондықтан құрылғы өшірілгенге немесе қайта қосылғанға дейін жалғасатын шексіз өңдеу циклы болуы тиіс. Мысалы, Apollo Guidance Computer-дегі сыртқы цикл Exec бағдарламасында орналасқан, егер компьютерде басқа жұмыс болмаса, ол "компьютерлік белсенділік" көрсеткішінің жарығын өшіретін қара жұмыс істейтін циклге түседі. Қазіргі заманғы компьютерлер әдетте процессордың немесе аналық платаның сағаттық тізбегін тоқтатпайды, егер олар істен шықса. Оның орнына, олар операторға хабарламалар көрсетіп, қате жағдайына түседі (мысалы, өлімнің көк экраны) және пайдаланушы жалғастыру туралы сұрауға жауап бергенше немесе құрылғыны қайта қосқанша шексіз циклде күтеді.

Қалқалар

Спинлоктар – бір мезгілде бағдарламалауда ортақ ресурстарды қорғау үшін қолданылатын төмен деңгейдегі синхрондау механизмдері. Дәстүрлі құлыптардан айырмашылығы, құлыпты алу мүмкін болмаған жағдайда жіпті ұйықтатудың орнына, спинлоктар құлып босатылғанша шексіз циклмен қайта-қайта "айналып" отырады. Бұл қасақана шексіз цикл – жіптің құлып күтуге жұмсайтын уақытын азайту және мутекс сияқты жоғары деңгейдегі синхрондау механизмдерінің қосымша шығындарын болдырмау мақсатындағы әдейі жасалған таңдау.

Көптірікті

Көп тірісті бағдарламаларда кейбір тірістер шексіз цикл ішінде жұмыс істесе де, бүкіл бағдарлама шексіз циклге тоқтап қалмайды. Егер басты тіріс аяқталып кетсе, процестің барлық тірістері күшпен тоқтатылады, соның салдарынан барлық орындалу тоқтатылып, процесс/бағдарлама аяқталады. Шексіз циклдердегі тірістер "үй шаруашылығы" жұмыстарын атқаруы немесе сокет/кезектен дерек күтіп, тоқтатылған күйде болуы мүмкін, және әр дерек түскен сайын жұмысын жалғастырады.

Қасақана емес орама

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

Тоқтату

Жүйе жауап беретін болса, шексіз циклдерді процеске сигнал жіберу арқылы (мысалы, Unix-тегі SIGINT) немесе процессорға үзіліс жіберу арқылы тоқтатуға болады, бұл ағымдағы процестің тоқтатылуына әкеледі. Мұны тапсырма менеджерінде, терминалда Control+C пернелерінің комбинациясымен немесе kill командасын немесе жүйелік шақыруды пайдалану арқылы жасауға болады. Дегенмен, бұл әрқашан жұмыс істемейді, себебі процесс сигналдарға жауап бермеуі мүмкін немесе процессор үзіліссіз күйде болуы мүмкін, мысалы, Cyrix кома қатесінде (нұсқау құбырындағы үзіліссіз нұсқаулардың қабаттасуынан туындайды). Кейбір жағдайларда SIGKILL сияқты басқа сигналдар да жұмыс істей алады, өйткені олар процестің жауап беруін қажет етпейді, ал кейбір жағдайларда циклді тоқтату үшін жүйені тоқтатудан басқа амал қалмайды.

Тілдік қолдау

Шексіз циклдерді әр түрлі басқару ағыны құрылымдарын пайдаланып іске асыруға болады. Көбінесе, құрылымдалмаған бағдарламалауда бұл кері секіру (goto) болып табылады, ал құрылымдалған бағдарламалауда бұл ешқашан аяқтамайтын белгісіз цикл (while loop) болып табылады, жағдайды жою арқылы немесе оны нақты түрде `true` деп белгілеу арқылы, мысалы `while (true)`.

Кейбір тілдерде шексіз циклдер үшін арнайы құрылымдар бар, әдетте белгісіз циклдан жағдайды жою арқылы. Мысалдарға Ada (`loop end loop`), Fortran (`DO END DO`), Go (`for {}`), Ruby (`loop do end`) және Rust (`loop {}`) жатады.

Көп тарапты байланыс

Шексіз цикл бірнеше құрылымдардың өзара әрекеттесуінен туындауы мүмкін. Сұранысты түсінбесе, әрқашан қате туралы хабарламамен жауап беретін серверді қарастырайық. Сервердің өзінде шексіз цикл болуы мүмкін болмаса да, екеуден тұратын жүйе (A және B) үздіксіз циклға түсуі мүмкін: егер A B-ден белгісіз типтегі хабар алса, онда A B-ге қате хабарламасымен жауап береді; егер B қате хабарламасын түсінбесе, ол A-ға өзінің қате хабарламасымен жауап береді; егер A B-ден келген қате хабарламасын түсінбесе, ол тағы бір қате хабарламасын жібереді, және т.с.с. Мұндай жағдайдың кең таралған мысалы – электрондық пошта циклы. Электрондық пошта циклының мысалы, егер біреу жауап қайтаруға болмайтын пошта жәшігінен хат алса, ал оның автоматты жауабы қосылған болса. Ол жауап қайтаруға болмайтын пошта жәшігіне жауап береді, соның салдарынан «бұл жауап қайтаруға болмайтын жәшік» деген жауап жіберіледі. Бұл пайдаланушыға жіберіледі, ол автоматты түрде жауап қайтаруға болмайтын пошта жәшігіне жауап береді, және т.с.с.

Шексіз псевдо-бұғалар

Псевдо шексіз цикл – көрінерінде шексіз, бірақ іс жүзінде өте ұзаққа созылатын цикл.