무한 루프

Infinite loop

컴퓨터 프로그래밍에서 무한 루프(infinite loop)는 외부 개입([1][2]플러그 뽑기)이 일어나지 않는 한 기술된 대로 끝없이 계속되는 일련의 명령어입니다.의도적인 것일 수도 있어요.

개요

이것은, 다음과 다릅니다.

  • "[3]정지되거나 중단될 때까지 동일한 명령을 계속 실행하는 일종의 컴퓨터 프로그램입니다."

다음의 의사 코드에 대해 검토합니다.

방법_다수 = 0 하는 동안에 is_there_more_data() 하다     방법_다수 = 방법_다수 + 1 끝. 표시 "카운트 항목 수=" 방법_다수 

같은 명령어정지되거나 중단될 때까지 계속 실행되었습니다.이 명령어는 함수 is_there_more_data에 의해 어느 시점에서 반환된 FALSE에 의해 ...에 의해 반환되었습니다.

반면 다음 루프는 그 자체로 끝나지 않습니다.

새들 = 1 물고기. = 2 하는 동안에 새들 + 물고기. > 1 하다     새들 = 3 - 새들     물고기. = 3 - 물고기. 끝. 

새들은 번갈아 1이나 2가 되고 물고기는 번갈아 2나 1이 된다.외부 개입("플러그 뽑기")이 발생하지 않는 한 루프는 멈추지 않습니다.

세부 사항

무한 루프는 컴퓨터 프로그램에서 끝 조건이 [4]없는 루프, 충족할 수 없는 루프 또는 루프를 처음부터 다시 시작하는 루프로 인해 끝없이 루프하는 일련의 명령입니다.공동 [5]멀티태스킹을 사용하는 오래된 운영체제에서는 무한 루프에 의해 일반적으로 시스템 전체가 응답하지 않게 되었습니다.현재는 프리엠프티브멀티태스킹모델에서는 무한 루프에 의해 보통 프로그램이 사용 가능한 프로세서 시간을 모두 소비하지만 보통 사용자가 종료할 수 있습니다.비지 대기 루프는 '무한 루프'라고도 불립니다.무한 루프는 컴퓨터가 "동결"되는 원인 중 하나입니다. 외의 원인으로는 스레싱, 데드록, 액세스 위반 등이 있습니다.

의도된 루프와 의도되지 않은 루프

루핑은 특정 조건이 충족될 때까지 일련의 명령을 반복하는 것입니다.무한 루프는 루프의 고유한 특성으로 인해 조건이 충족되지 않을 때 발생합니다.

의도적인 루프

이것이 바람직한 동작인 경우는 몇 가지 있습니다.예를 들어, 카트리지 기반의 게임 콘솔의 게임에는 일반적으로 메인 루프에 종료 조건이 없습니다.이는 프로그램을 종료하는 운영 체제가 없기 때문입니다.루프는 콘솔의 전원이 꺼질 때까지 실행됩니다.

최신 인터랙티브 컴퓨터에서는 사용자의 입력이나 디바이스의 액티비티를 컴퓨터가 항상 감시할 필요가 있기 때문에 기본적으로는 디바이스가 꺼지거나 리셋될 때까지 무한 처리 아이돌 루프가 계속됩니다.예를 들어 Apollo Guidance Computer에서는 이 외부 루프가 Exec [6]프로그램에 포함되어 있어 컴퓨터가 다른 작업을 전혀 하지 않으면 단순히 "컴퓨터 활동" 표시등을 끄는 더미 작업을 실행할 수 있습니다.

또, 최신의 컴퓨터에서는, 크래쉬가 발생해도, 프로세서나 메인보드의 회로 구동 클럭을 정지하지 않습니다.대신 오퍼레이터에 대한 메시지를 표시하는 오류 상태로 돌아가 사용자가 프롬프트에 응답할 때까지 대기하거나 디바이스를 리셋할 때까지 무한 루프를 시작합니다.

멀티스레딩

멀티 스레드 프로그램에서는 일부 스레드는 전체 프로그램이 무한 루프에 갇히지 않고 무한 루프 내에서 실행될 수 있습니다.메인 스레드가 종료되면 프로세스의 모든 스레드가 강제로 중지되므로 모든 실행이 종료되고 프로세스/프로그램이 종료됩니다.무한 루프 내의 스레드는 "하우스키핑" 태스크를 수행하거나 (소켓/큐에서) 입력을 대기하고 입력을 받을 때마다 실행을 재개할 수 있습니다.

의도하지 않은 루프

대부분의 경우 이 용어는 의도한 결과가 아닌 [7]버그일 때 사용됩니다.이러한 오류는 초보 프로그래머들 사이에서 가장 흔하지만, 숙련된 프로그래머들도 발생할 수 있습니다. 그 원인은 매우 미묘할 수 있기 때문입니다.

예를 들어, 하나의 일반적인 원인은 프로그래머가 링크 리스트나 트리 데이터 구조에서 노드 시퀀스에 걸쳐 반복하여 각 노드에 대해 루프 코드를 1회 실행하는 것입니다.링크가 부적절하게 형성되면 데이터 구조에서 참조 루프가 생성될 수 있으며, 여기서 한 노드는 시퀀스 초기에 발생한 다른 노드로 링크됩니다.이것에 의해, 데이터 구조의 일부가 링으로 되어, Naigive 코드가 영원히 루프 됩니다.

대부분의 무한 루프는 코드의 면밀한 검사에서 찾을 수 있지만, 특정 프로그램이 정지할지 또는 영원히 실행될지를 결정하는 일반적인 방법은 없습니다.이것은 정지 문제[8]판별 불능입니다.

중단

시스템이 응답하고 있는 한 무한 루프는 종종 프로세스에 신호를 보내거나(Unix의 SIGINT 등), 프로세서에 신호를 보내 현재 프로세스가 중단될 수 있습니다.이는 태스크 매니저, Control-C [9]명령어를 사용한 단말기에서 또는 kill 명령 또는 시스템콜을 사용하여 실행할 수 있습니다.단, 프로세스가 신호에 응답하지 않거나 프로세서가 Cyrix 혼수 버그(명령 파이프라인의 무정전 명령 중복으로 인해 발생)와 같은 무정전 상태에 있을 수 있기 때문에 이 방법이 항상 작동하는 것은 아닙니다.SIGKILL 등의 다른 신호는 프로세스가 응답할 필요가 없기 때문에 동작할 수 있는 경우도 있고 루프를 시스템 셧다운 전에 종료할 수 없는 경우도 있습니다.

언어 지원

무한 루프는 다양한 제어 흐름 구조를 사용하여 구현할 수 있습니다.가장 일반적으로 비구조화 프로그래밍에서는 이것이 점프백업(goto)인 반면 구조화 프로그래밍에서는 조건을 생략하거나 명시적으로 true로 설정함으로써 절대 끝나지 않도록 설정된 무기한 루프(while loop)입니다.while (true) ....

일부 언어에는 무한 루프에 대한 특별한 구조가 있으며, 일반적으로 무한 루프에서 조건을 생략합니다.예를 들어 Ada (loop ... end loop포트란([10] )DO ... END DO), [Go](for { ... }루비( )loop do ... end, 및 녹( )loop { ... }).

의도적인 무한 루프의 예

간단한 예(C의 경우):

#실패하다 <stdio.h>  인트 주된() {   위해서 (;;) // 또는 동등하지만 (1)     ;     돌아가다 0; } 

for (;;)무한 루프는 표준 참조 C 프로그래밍 언어에 나타나는 전통적인 것으로 종종 "forever"[11]로 발음됩니다.

무한 루프(Infinite Loop)를 정지하지 않고 인쇄하는 루프입니다.

1980년대 BAS의 유사한 예IC:

10 인쇄하다 "무한 루프" 20 에 가다 10 

DOS 배치 파일에서도 같은 예를 다음에 나타냅니다.

: 에코 무한 루프 goto : A

여기서는 마지막 행이 무조건 첫 번째 행으로 실행을 되돌리기 때문에 루프가 매우 명백합니다.

Java의 예

하는 동안에 (진실의) {     시스템..나가..인쇄('무한 루프'); } 

Bourne Again Shell의 예

위해서 ((;;)); 하다  메아리치다 '무한 루프' 다 했어요. 

Rust의 예

고리 {     프린트!("무한 루프"); } 

의도하지 않은 무한 루프의 예

수학적 오류

다음은 Visual Basic의 무한 루프 예시입니다.

어둡다 x ~하듯이 정수 하다 하는 동안에 x < > 5   x = 1   x = x + 1 고리 

이로 인해 다음과 같은 상황이 발생합니다.x루프 코드 시작 시이므로 5를 넘지 않습니다.x값은 1이므로 루프는 항상2로 끝나 루프는 끊어지지 않습니다.이 문제는 다음 명령어를 이동함으로써 해결할 수 있습니다.x = 1루프의 외부 명령입니다.기본적으로 이 무한 루프가 하는 일은 컴퓨터가 5에 도달할 때까지 1을 계속 추가하도록 지시하는 것입니다.1+1은 항상 2이기 때문에 이런 일은 일어나지 않습니다.

일부 언어에서는 수학 기호에 대한 프로그래머의 혼란이 의도하지 않은 무한 루프를 초래할 수 있습니다.예를 들어 C의 일부를 다음에 나타냅니다.

#실패하다 <stdio.h>  인트 주된(무효) {    인트 a = 0;    하는 동안에 (a < > 10) {       인쇄물(%d\n", a);       한다면 (a = 5)          인쇄물("a는 5다!\n");       a++;    }    돌아가다 0; } 

예상되는 출력은 0 ~9 의 숫자이며, 5 ~6 사이에 "a = 5!" 가 삽입되어 있습니다.단, '라인'if (a = 5)" 위의 프로그래머는 =(수정) 연산자를 ==(수정 테스트) 연산자와 혼동했습니다.대신 5의 값이 할당됩니다.a이 시점에서요.따라서,a는 10으로 진행할 수 없습니다.또한 이 루프는 종료할 수 없습니다.

반올림 오류

AMD Turion 프로세서의 C 출력:
x = 0.140000149011611938
x = 0.200000298023223877
x = 0.300001192092895508
x = 0.400000596046447754
x = 0.500000000000000000
x = 0.600002384185791016
x = 0.700004768371582031
x = 0.800007152557373047
x = 0.900009536743164062
x = 1.000011920928955078
x = 1.10000014305114746094
x = 1.20000016689300537109
...

종료 조건을 평가할 때의 예기치 않은 동작도 이 문제의 원인이 될 수 있습니다.C의 를 다음에 나타냅니다.

흘러가다 x = 0.1; 하는 동안에 (x != 1.1) {   인쇄물("x = %22.20f\n", x);   x += 0.1; } 

일부 시스템에서는 이 루프가 예상대로 10회 실행되지만 다른 시스템에서는 종료되지 않습니다.문제는 루프가 종료되는 것입니다.(x != 1.1)두 부동소수점 값의 정확한 동일성에 대한 테스트와 많은 컴퓨터에서 부동소수점 값이 표시되는 방법은 값이 0.1을 정확하게 나타낼 수 없기 때문에 이 테스트를 실패하게 되며, 따라서 각 증분에 반올림 오류가 발생합니다(c. 상자 참조).

Python에서도 같은 현상이 발생할 수 있습니다.

x = 0.1 하는 동안에 x != 1:     인쇄물(x)     x += 0.1 

동일성 또는 동일하지 않은지에 대한 검정이 예기치 않게 실패할 가능성이 있으므로 부동 소수점 값을 처리할 때는 보다 크거나 작은 검정을 사용하는 것이 안전합니다.예를 들어 테스트하는 대신x1.1과 같기 때문에 테스트 할 수 있습니다.(x <= 1.0), 또는(x < 1.1)어느 쪽이든 한정된 횟수만 반복하면 확실하게 종료됩니다.이 특정 예를 수정하는 또 다른 방법은 루프 인덱스로 정수를 사용하여 수행된 반복 횟수를 카운트하는 것입니다.

수치 분석에서도 유사한 문제가 자주 발생합니다. 특정 결과를 계산하기 위해 오차가 선택된 허용 오차보다 작을 때까지 반복을 수행하도록 의도됩니다.그러나 반복 중 반올림 오류로 인해 지정된 공차에 도달할 수 없으므로 무한 루프가 발생합니다.

멀티 파티 루프

무한 루프는 여러 엔티티가 상호 작용하여 발생할 수 있습니다.요청을 이해하지 못할 경우 항상 오류 메시지로 응답하는 서버를 고려하십시오.서버 자체 내에서 무한 루프 가능성이 없는 경우에도 이들 중 2개(A와 B)로 구성된 시스템이 끝없이 루프될 수 있습니다.A가 B로부터 알 수 없는 유형의 메시지를 수신하면 A는 B에 오류 메시지로 응답하고, B가 오류 메시지를 이해하지 못하면 A가 A에 자신의 오류 메시지로 응답합니다.B로부터의 에러 메시지, 또 다른 에러 메세지가 송신됩니다.

이러한 상황의 일반적인 예로는 이메일 루프가 있습니다.전자 메일 루프의 예로는 무응답 수신함에서 메일을 수신했지만 자동 응답이 켜져 있는 경우를 들 수 있습니다.응답 없음 수신함에 응답하여 "이것은 응답 없음 수신함입니다" 응답을 트리거합니다.이것은 사용자에게 송신되고, 사용자는 자동 응답을 no-reply 수신 트레이에 송신하는 등 계속합니다.

의사 무한 루프

의사 무한 루프는 무한해 보이지만 실제로는 매우 긴 루프입니다.

매우 큰 수

bash의 예:

x in $(seq 1000000000), #루프 코드 완료

종료불가능조건

C루프의 예:

서명되어 있지 않다 인트 i; 위해서 (i = 1; i != 0; i++) {   /* 루프 코드 */ } 

이것은 무기한으로 계속될 것 같지만, 사실 그 가치는i저장 가능한 최대값에 도달합니다.unsigned int이 숫자에 1을 더하면 0이 되므로 루프가 끊어집니다.의 실제 제한i사용하는 시스템 및 컴파일러의 상세 내용에 따라 달라집니다.임의 정밀도 산술에서는 컴퓨터의 메모리가 더 이상 유지되지 않을 때까지 이 루프가 계속됩니다.i.한다면i부호 없는 정수가 아닌 부호 있는 정수일 경우 오버플로는 정의되지 않습니다.이 경우 컴파일러는 코드를 무한 루프에 최적화할 수 있습니다.

무한 재귀

무한 재귀는 재귀로 인해 발생하는 무한 루프의 특수한 경우입니다.

VBA의 다음 예에서는 스택오버플로우 오류를 반환합니다.

후보선수 테스트 1()     불러 테스트 1 끝. 후보선수 

Break 스테이트먼트

A "while (true)loop은 언뜻 보기에는 무한해 보이지만 break 스테이트먼트 또는 return 스테이트먼트를 통해 루프를 탈출하는 방법이 있을 수 있습니다.PHP의 예:

하는 동안에 (진실의) {     한다면 ($foo->막대기()) {         돌아가다;     } } 

앨더슨 루프

앨더슨 루프는 종료 조건을 사용할 수 있지만 일반적으로 프로그래머의 오류로 인해 코드의 현재 구현에서 액세스할 수 없는 무한 루프를 나타내는 드문 은어 또는 전문 용어입니다.이것들은, 유저 인터페이스 코드를 디버깅 할 에 가장 많이 볼 수 있습니다.

Alderson 루프의 C와 같은 유사 코드 예에서는 프로그램이 0이 될 때까지 사용자가 지정한 숫자를 합계하도록 되어 있지만 프로그래머가 잘못된 연산자를 사용한 경우:

인트  = 0; 인트 i; 하는 동안에 (진실의) {    인쇄물("합계에 추가할 숫자를 입력하거나 종료하려면 0을 입력하십시오.");    i = get User Input(사용자 입력)();    한다면 (i * 0) { // i 곱하기 0이 참이면 i를 합계에 더합니다.주의: ZERO는 FALSE, Non-Zero는 TRUE를 의미합니다. "i * 0"은 ZERO(FALSE)입니다!        += i; // (i * 0)이 모든 i에 대해 0이므로 합계가 변경되지 않습니다. *가 아닌 !=가 있는 경우 변경됩니다.    }    한다면 ( > 100) {       브레이크.;    // 루프를 종료합니다.종료 조건은 존재하지만 합계가 추가되지 않기 때문에 도달하지 않습니다.    } } 

이 용어는 1996년 Microsoft[12] Access에서 OK 버튼이나 Cancel 버튼 없이 모달 대화 상자를 코드화하여 상자가 나타날 [13]때마다 프로그램 전체를 비활성화한 프로그래머(성씨 Alderson)로부터 이름을 따온 것으로 알려졌다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Endless loop dictionary definition". Archived from the original on 2020-08-01. Retrieved 2020-01-22.
  2. ^ "What is infinite loop (endless loop)". Archived from the original on 2019-07-15. Retrieved 2020-01-22.
  3. ^ Denise Caruso (August 16, 1999). "Overload of Hangers-On Creates Bumpy Ride for Internet Stocks". The New York Times. Archived from the original on December 27, 2019. Retrieved December 27, 2019.
  4. ^ "Codes and Modes: The Character of Documentary Culture". Flow Journal. November 2014. Archived from the original on 2020-08-01. Retrieved 2020-01-23. an infinite loop is one that lacks .. an exit condition
  5. ^ non-progressive-multitasking이라고도 합니다.
  6. ^ David Hoag (September 1976). "The History of Apollo On-board Guidance, Navigation, and Control" (PDF). Charles Stark Draper Laboratory. Archived (PDF) from the original on 2016-11-05. Retrieved 2020-01-23.
  7. ^ "New York Times Crossword Answers". October 13, 2013. Archived from the original on August 2, 2020. Retrieved January 22, 2020. computing .. a defect .. which .. to loop
  8. ^ "Halting Problem in Theory of Computation". 3 October 2018. Archived from the original on 9 August 2020. Retrieved 22 January 2020.
  9. ^ "A Buffer Overflow Exploit Against the DameWare Remote Control software". December 19, 2003. Archived from the original on July 24, 2020. Retrieved January 22, 2020. As soon as the command shell is closed with a control-c combination ...
  10. ^ Ada 프로그래밍: 컨트롤: 엔드리스 루프
  11. ^ "Endless loop in C/C++". Archived from the original on 2016-08-03.
  12. ^ Lee Dohm (May 24, 2013). "Alderson loop". Archived from the original on June 19, 2020. Retrieved January 22, 2020.
  13. ^ "Alderson Loop". The Jargon File, Version 4.4.7. Archived from the original on 2006-05-15. Retrieved 2006-05-21.

외부 링크