인터럽트
- 어원상 끼어들기라는 의미
- 시스템 내의 어떤 장치가 인터럽트 요구신호를 CPU에게 전달하면, CPU는 현재 일을 잠시 중단하고 하던 실행을 기억하게 돼 인터럽트를 발생시킨 장치의 요구 작업을 수신 진행하는 방식임
- 중앙처리장치가 현재 실행 중인 프로그램의 처리를 잠제적으로 중단시키고, 특정 주소에 위치한 프로그램(ISR)을 수행하게 하는 것을 인터럽트라고 함
- 이 과정에서 현재 실행 중인 프로그램의 중요 데이터(PC)는 주기억장치(스택)에 저장되고, 새롭게 시작한 프로그램이 종료된 다음 실행됨
- 인터럽트를 처리하기 위해 실행되는 새로운 프로그램 루틴을 인터럽트 서비스 루틴(ISR, Interrupt Service Routine)이라고 함
인터럽트에 의한 제어이동
- 인터럽트가 발생하면 CPU는 먼저 어떤 장치가 인터럽트를 요구했는지 확인하고, PC에 저장되어 있는 다음에 실행할 명령어의 주소를 스택(stack)에 저장함
- 해당 인터럽트 서비스 루틴(ISR)을 호출하기 위하여 그 루틴의 시작 주소를 PC에 저장함
- 이때 ISR의 시작 주소는 인터럽트를 요구한 장치에서 전송되거나 미리 정해진 값으로 결정됨
- 인터럽트 서비스를 순차적으로 실행함
- ISR 독작이 완료된 후 중단되었던 기존 프로그램의 실행을 계속하도록 후 프로그램으로 복귀함
인터럽트의 발생 원인과 종류
- 기계 착오 인터럽트
- 프로그램을 실행하는 도중 갑작스런 정전이나 컴퓨터 자체 내에서 기계적인 문제가 발생한 경우 발생하는 인터럽트
- 슈퍼바이저 호출 인터럽트(소프트웨어 인터럽트)
- 사용자가 입출력과 같은 서비스를 받기 위해 운영체제에 들어간 필요가 있음
- 이때 슈퍼바이저 호출(SVC) 명령어를 사용하여 운영체제에 서비스를 요청할 때 발생하는 인터럽트
- 외부 인터럽트(External Interrupt)
- 오퍼레이터(operator)나 타이머(timer)에 의해 외도적으로 프로그램이 중단된 경우 발생하는 인터럽트
- 입출력 인터럽트(I/O Interrupt)
- 입출력의 종료나 입출력의 오류에 의해 중앙처리장치의 기능이 요청되는 경우 발생하는 인터럽트
- 프로그램 검사 인터럽트(Program Check Interrupt)
- 프로그램 실행 중 보호된 기억장치 내에 접근하거나 불법적인 명령 수행과 같은 프로그램의 문제가 발생한 경우 발생하는 인터럽트
- 재시작 인터럽트(Restart Interrupt)
- 오퍼레이터 및 다른 프로세서에 의해서 재시작 명령이 도착하였을 때 발생하는 인터럽트
인터럽트의 발생
- 프로그램이 잘못 실행되는 경우
- 오버플로우(overflow), 0에 의한 나누기(division by zero) 등이 발생하면 프로그램이 중단되는 인터럽트가 발생함
- 하드웨어 결함에 의한 발생
- 기억장치 패리티 오류(memory parity error) 발생이 있음
- 기억장치에 저장된 데이터에 오류가 발생한 것으로 CPU는 해당 데이터 읽기 동작을 중지하는 인터럽트가 발생하게 됨
- I/O 장치에 의한 발생
- I/O 제어기(I/O controller)에 의해 프린터가 출력되거나, 키보드의 입력으로 중앙처리장치의 정상처리 과정이 인터럽트 되는 경우
인터럽트의 처리 예시
- 인터럽트는 처리 효율을 향상시키는 방법이라고 할 수 있음
- 오버플로우에 의한 인터럽트처리
- 오버플로우 발생 경고 메시지와 주프로그램을 중료하는 인터럽트 서비스 루틴이 동작할 것
- 프린터 제어기에 의한 인터럽트
- 프린터의 출력을 동작하는 인터럽트 서비스 루틴이 수행됨
- 프린트 동작이 끝나면, 주 프로그램으로 되돌아감
인터럽트 사이클과 마이크로 연산
- 인터럽트 사이클(Interrupt Cycle): 인터럽트 발생을 처리하기 위한 부사이클로 중앙처리장치가 인터럽트 요구가 있는지 검사를 수행하는 과정
- 인터럽트 발생이 없다면, 다음 명령어를 인출하는 인출 부사이클이 수행됨
- 인터럽트 요구가 대기 중이라면 인터럽트 사이클에 의해서, 현재 프로그램의 실행을 중단하고 프로그램 상태를 저장함
- 그 다음 PC를 인터럽트 처리 루틴(ISR)의 시작 주소로 세트하고 인터럽트를 처리함
- 인터럽트의 동작은 인터럽트 발생이 확인되면 현재 진행 중인 주 프로그램의 복귀 정보(PC)를 주기억장치의 일부(스택)에 저장하고 인터럽트 서비스 루틴(ISR)을 수행하는 것
- 마이크로 연산 과정
- t₀ : MBR <- PC
- t₁ : MAR <- SP, PC <- ISR 시작주소
- t₂ : M[MAR] <- MBR, SP <- SP -1
인터럽트 부사이클에서 데이터 흐름
- 클록 t₀
- PC의 내용이 MBR로 전송됨
- PC 내용은 주 프로그램에서 수행할 다음 명령어의 주소
- 현 프로그램의 복귀 정보를 저장하는 과정
- 클록 t₁
- SP(스택 포인터)의 내용이 MAR로 전송되고, PC의 내용은 인터럽트 서비스 루틴의 시작 주소로 변경됨
- 스택 포인터는 MBR에 저장되어 있는 내용(PC)을 스택에 저장하기 위해서 사용될 것
- 클록 t₂
- MBR에 저장되어 있던 원래 PC의 내용이 스택에 저장됨
- 주 프로그램의 복귀 주소를 주기억장치의 스택에 저장하는 과정
다중 인터럽트
- 인터럽트 서비스 루틴(ISR)을 수행하는 동안 또 다른 인터럽트가 발생하는 것을 다중 인터럽트라고 함
- 다중 인터럽트 처리방법은 인터럽트 불가능과 우선순위 인터럽트가 있음
- 인터럽트 불가능
- 인터럽트 마스크를 설정하는 법
- CPU 내부 상태 레지스터에 인터럽트 허용핀지를 표시하는 플래그 비트가 있음
- 이 플래그를 인터럽트 불가능으로 설정하면 새로운 인터럽트 요구를 허용하지 않음
- 현재 진행중인 인터럽트 서비스를 마친 후 새로운 인터럽트 요구를 수용 가능함
- 우선순위를 정하는 방법
- 우선순위가 높은 인터럽트가 들어오면 현재 작업을 중단하고 새로운 인터럽트를 먼저 처리함
다중 인터럽트 처리 방법
- 인터럽트 불가능(Interrupt Disabled)
- 인터럽트 서비스 루틴(ISR)을 처리하고 있는 도중에는 새로운 인터럽트 처리 요구가 들어오더라도 CPU가 인터럽트 사이클을 수행하지 않도록 방지하는 기능
- 나중에 발생한 인터럽트는 대기하고 있다가 현재의 인터럽트에 대한 처리가 종료된 후에 발생한 순서대로 처리됨
- 우선순위 인터럽트(Priority Interrupt)
- 인터럽트의 우선순위를 정하고, 우선순위가 높은 인터럽트가 처리되고 있는 동안에 우선순위가 낮은 인터럽트가 들어오면, 현재의 인터럽트 서비스 루틴(ISR)의 수행을 중단하고 새로운 인터럽트를 처리하는 방법
우선순위 인터럽트 처리 과정
- 인터럽트에 의해서 인터럽트 서비스 루틴 X가 실행됨
- 우선순위가 더 높은 인터럽트 요구가 들어오면, 서비스 루틴 X의 실행은 중지되고 인터럽트 서비스 루틴 Y가 수행됨
- 서비스 루틴 Y의 실행이 끝나면, 다시 서비스 루틴 X로 복귀함
명령어 파이프라이닝
- 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 방법으로 동시에 여러 개의 명령어를 실행하는 기법
- 이전 명령어를 끝내기 전에 새로운 명령어 수행을 시작하여 명령어 사이클이 긴 시간대에 중첩되어 처리되는 구조
- 하나의 명령어를 여러 단계로 나누어서 처리할 수 있기 때문에, 한 명령어의 특정 단계를 처리하는 동안 다른 부분에서는 다른 명령어의 다른 단계를 처리할 수 있음
- 결과적으로 처리 속도를 향상시킬 수 있음
2-단계 명령어 파이프라인
- 명령어를 실행하는 하드웨어를 인출단계(fetch stage)와 실행단계(execute stage)라는 두 개의 독립적인 파이프라인 모듈로 분리하여서 수행하는 방법
- 2-단계 파이프라인을 이용하면 명령어 처리 속도가 약 두 배 향상됨
- 단계 수가 늘어날수록 그만큼 속도가 향상됨
- 두 단계의 처리 시간이 동일하지 않으면 두 배의 속도 향상을 얻지 못함
- 각 명령어의 인출단계와 실행단계의 처리 시간이 동일해야 파이프라인에 의한 효율 향상을 얻을 수 있음
- 단계의 처리 시간이 동일하지 않은 경우 속도 향상이 되지 않는 문제를 극복하기 위해서는 파이프라인의 단계 수를 증가시켜서 각 단계의 처리 시간을 같게 하는 방법이 있음
- 단계를 세분화해 여러 단계 간의 시간 차이를 거의 없게 하는 것임
- 파이프라인의 단계 수를 늘리면 전체적으로 속도가 높아지게 됨
- 문제점 극복과 속도향상을 동시에 얻을 수 있음
4-단계 명령어 파이프라인
- 명령어 인출(IF, Instruction Fetch) 단계
- 명령어를 기억장치에서 인출하는 과정임
- 프로그램 카운터에서 제시된 기억장치 주소에 근거해서 명령어를 인출하여 명령어 레지스터(IR)로 이동시키는 단계
- 명령어 해독(ID, Instruction Decode) 단계
- 명령어 해독기(decoder)를 이용해 첫 번째 단계에서 인출된 명령어를 해석함
- 오퍼랜드 인출(OF, Operand Fetch) 단계
- 기억장치에서 오퍼랜드를 인출하는 단계
- 오퍼랜드는 피연산자 부분으로 연산에 사용될 변수나 데이터가 될 것임
- 인출된 피연산자들은 마지막 실행단계의 각종 연산에서 사용될 것
- 실행(EX, Execute) 단계
- 명령어에서 지정된 연산을 수행하는 단계
6-단계 명령어 파이프라인
- FI(Fetch Instruction) 단계: 명령어 인출단계
- DI(Decode Instruction) 단계: 명령어 해독단계
- CO(Calculate Operand) 단계: 오퍼랜드를 계산하는 단계
- 오퍼랜드는 피연산자로서 일반적인 데이터 값뿐만 아니라 주소일 수도 있음
- 주소 지정방식에서 간접주소 방식이나 변위주소 지정방식에서는 유효주소를 찾는 계산이 필요함
- FO(Fetch Operand) 단계: 오퍼랜드 인출단계
- 오퍼랜드 값은 세 번째에서 계산된 값
- EI(Execute Instruction) 단계: 명령어 실행단계
- WO(Write Operand) 단계: 연산된 결과 등, 오퍼랜드를 저장하는 단계
추가 설명
- 명령어가 여섯 단계로 구분되어 전행하여 다른 명령어 단계와 동시에 수행됨
- 결과적으로 앞의 두 방법보다 처리 속도가 더 향상됨
- 첫 번째 클록 주기를 제외하고 나머지 주기들은 이전 명령어와 다음 명령어들이 단계들과 동시에 수행됨
- 최대 6개의 명령어 단계가 동시에 처리됨
파이프라이닝의 의한 속도 향상
- 파이프라인의 단계 수 k, 실행할 명령어들의 수는 N이고, 각 파이프라인 단계가 한 클록 주기씩 걸린다고 가정하면, 파이프라인에 의한 전체 명령어 실행 시간 T는 다음과 같음
- T = K + (N − 1)
- 첫 번째 명령어를 실행하는데 k주기가 걸리고, 나머지 (N-1)개의 명령어들은 각각 한 주기씩만 소요됨
- 파이프라이닝을 적용하지 않을 경우에는 N개의 명령어들을 실행하는 데에 (k×N)주기가 소요됨
파이프라이닝의 효과가 100% 만족될 수 없는 이유
- 모든 명령어가 파이프라인 단계를 거치지 않음
- 경우에 따라 어떤 명령어는 오퍼랜드를 인출할 필요가 없기 때문임
- 파이프라인 하드웨어를 단순화하려면 모든 명령어가 모든 단계를 모두 통과하도록 해야 함
- 4단계 파이프라이닝에서, IF 단계와 OF 단계가 동시에 기억장치를 참조하는 경우에는 기억장치 충돌(memory conflict)이 발생할 지연이 발생함
- 따라서 효율이 저하됨
- 조건 분기(conditional branch) 명령어가 실행되면, 미리 인출하여 처리하던 명령어들이 무효화 됨
- 조건 분기 명령어는 프로그램의 순차적으로 명령어를 실행하는 것이 아니라 순서에 맞지 않게 다른 순서에 있는 명령어를 수행하게 하는 명령어
- 잘못된 명령어의 순서가 변경되어 파이프라이닝에 의해 순차적으로 수행되었던 명령어 단계들이 무효화 됨
- 조건 분기 명령어의 실행이 끝날 때까지는 분기 발생 여부의 판단이 불가능하므로 파이프라인의 효율이 저하됨
파이프라이닝의 성능 개선 방법
- 파이프라인 구조에는 인터럽트나 분기 명령어를 만나게 되면 파이프라인에 저장되었던 명령어들이 쓸모 없어져서 버려야 하므로 시간이 생김
- 지연분기(delayed branch) 방법
- 분기 명령어 뒤에 있는 다른 명령어들의 순서를 적당히 재배치해 실행순서를 변경하는 것
- 분기 예측 기법(branch prediction)
- 명령어 분기발생을 미리 예측하여 분기하면 파이프라인에 저장된 명령들을 변화시켜 시간 지연을 막는 기술임
- 정적예측 기법: 컴파일러에서 분기를 미리 예측하는 기법
- 동적예측 기법: 실행 도중에 생성된 데이터를 활용하는 기법, 최근의 분기 명령어들의 결과를 분석해 분석에 분기가 일어날 확률을 계산해 그에 맞게 순서대로 명령어들을 인출하는 기법
분기가 존재하는 4단계 파이프라인 흐름도
- 여섯 번째 클록 주기에서 여섯 번째 명령어의 첫 번째 단계까지 수행이 되었지만, 세 번째 명령어는 실행이 완료되면서 그 내용이 12번째 명령어를 수행하라는 것으로 판명되다고 가정함
- 그러므로 수행 중인 4, 5, 6번째 명령어 단계는 무시되고, 7번째 클록 주기에서 12번째 명령어가 수행됨
- 그래서 파이프라인의 장점을 잃게 됨
분기가 존재하는 6단계 파이프라인 흐름도
- 분기 명령어 다음의 명령어들이 무시되고 다른 명령어가 처음부터 시작됨
슈퍼스칼라 프로세스
- 수의 덧셈, 제체, 저장 그리고 조건 분기 등의 보편적인 명령어를 동시에 시작시키고 독립적으로 실행하는 개념
- 한 명령어 사이를 동안 여러 개의 명령어를 동시에 처리가능한 CPU 구조
- 다수의 명령어 파이프라인을 이용, 서로 다른 명령어들을 독립적으로 실행함
- 파이프라인 수 만큼 처리 속도는 향상하나 병행처리 명령어 파이프라인을 설계하기가 복잡하다는 단점
슈퍼스칼라 구조로 설계하기 위한 장치들
- 복수의 명령어 인출 장치가 필요함
- 동시에 병렬로 동작하는 여러 개의 독립적인 명령어 실행장치들
- 동시에 실행되도 상관없는 서로 독립적인 명령어들을 선택하는 장치
슈퍼스칼라 프로세서의 조직과 구성
- 슈퍼스칼라의 기본구성은 파이프라인으로 구현된 여러 개의 기능 유닛이 명령어들의 병렬 처리를 지원함
- 두 개의 정수연산, 두 개의 부동소수점 연산, 그리고 하나의 기억장치 연산이 동시에 수행되는 개념임
- 슈퍼스칼라(superscalar)는 CPU 내에 파이프라인을 여러 개 두어 여러 명령어를 동시에 실행하는 기술
- 슈퍼스칼라는 동시에 두 명령어에 대해 같은 동작을 할 수 있음
슈퍼스칼라 프로세서의 성능
- k개의 단계로 구성된 일반적인 파이프라인 프로세서에서 N개의 명령어를 실행하는 데 걸리는 시간
- m개의 기능 유닛(동급)을 가진 단계의 슈퍼스칼라 프로세서에서 N개의 명령어를 실행하는 데 걸리는 전체 시간
- 여기서, m은 슈퍼스칼라 등급(degree of superscalar)임
- 슈퍼스칼라 프로세서에서는 등급(degree) m 만큼의 명령어를 병렬 처리하므로 N개의 명령어는 N/m만큼의 처리시간을 갖게 될 것임
- 일반적인 파이프라이닝 소요시간에서 N이 N/m으로 대체되는 것
- 파이프라인 기법에 비하여 슈퍼스칼라 프로세서로 얻을 수 있는 속도 향상 Sₚ는 다음과 같음
- 명령어의 수 N이 무한하다면 속도 향상 Sₚ는 m배가 될 것
- 명령어가 많아지면 일반적인 파이프라이닝보다 슈퍼스칼라 프로세서의 등급(m)의 배수만큼 속도가 증가하게 될 것
슈퍼 파이프라인
- 파이프라인에서 단계의 클록 주기를 절반 이하로 줄여서 명령어 실행 속도를 두 배 이상 높이는 방법
- 대부분 파이프라인 단계들이 작업을 수행하는 데 소요되는 클록 사이클이 한 이하의 시간이므로 가능한 기능임
- 슈퍼 파이프라이닝의 등급(degree)이 n이면, 기능 유닛의 클록 사이클 시간은 기본 사이클의 1/n이 됨
2 등급의 슈퍼 파이프라인에서의 명령어 실행 시간도
- 기능 유닛의 클록 사이클 시간은 기본 사이클의 1/2이 됨
- 결과적으로 5개의 명령어(N=5)가 실행되는 동안 기본 사이클은 6 클록만 사용됨
- 명령어 수행시간 T = k + (N-1)/n = 4 + (5-1)/2 = 6
- 여기서 단계 k=4, 명령어 개수 N=5, 등급 n=2)
슈퍼 파이프라인 성능
- 단계의 수가 k이고 등급이 n일 때의 슈퍼 파이프라인 구조에서 N 개의 명령어들을 실행하는 데 걸리는 시간
- 첫 번째 명령어는 파이프라이닝과 동일하게 기본 클록으로 동작함
- 그래서 k 단계만큼의 소요시간이 있음
- 나머지 명령어들은 슈퍼 파이프라이닝 등급(degree) n 만큼 클록이 감소하므로 (N-1)개의 명령어는 기본 클록이 1/n이 됨
- 소요시간은 (1/n)*(N-1)이 됨
- 파이프라인 기법에 비하여 슈퍼스칼라 프로세서로 얻을 수 있는 속도 향상 Sp는 다음과 같음
- 여기서, 명령어의 수 N이 무한하면, 속도 향상은 n배가 됨
- 즉, 명령어의 개수(N)가 증가하면, 슈퍼 파이프라인의 속도는 등급(degree) n의 배수만큼 증가함
파이프라이닝 & 슈퍼 파이프라인 & 슈퍼스칼라 프로세스 비교
- 예시) 각 등급(m과 n)은 2일 때 명령어 N=6개일 경우
- 기본적인 4단계(k=4) 파이프라이닝은 9개 클록이 필요 (k+N-1=4+6-1=9)
- 슈퍼 파이프라인의 경우에는 6.5 클록이 필요 (k+(N-1)/n=4+(6-1)/2=6.5)
- 그러나 슈퍼스칼라 프로세서는 6클록이 필요 (k+N/m-1=4+6/2-1=6)
- 기본 파이프라이닝 기법은 클록 사이클당 한 개의 명령어 실행하고, 클록 사이클 한 개당 한 개의 파이프라인 단계 수행함
- 슈퍼 파이프라인은 클록 사이클당 두 개의 파이프라인 단계를 수행하며, 각 단계에서 수행되는 기능이 두 개의 중첩되지 않는 부분들로 분리되며, 각각은 클록 사이클의 절반에 해당하는 시간 내에 수행됨
- 슈퍼 스칼라 프로세서는 각 단계에서 두 개의 기능들을 병렬로 수행함
- 슈퍼 파이프라인 프로세서의 성능이 슈퍼 스칼라 프로세서보다 떨어짐
슈퍼 파이프라인된 슈퍼스칼라 구조
- 슈퍼 파이프라인과 슈퍼스칼라 프로세서가 결합된 구조이며 고성능 중앙처리장치에서 사용되는 방법
- 슈퍼 파이프라인의 등급 n은 2이고, 슈퍼스칼라 프로세서의 등급 m은 3
- 더 많은 속도 향상을 기대할 수 있는 구조
슈퍼 파이프라인된 슈퍼스칼라의 성능
- 슈퍼 파이프라인의 등급이 n이고, 슈퍼스칼라 프로세서의 등급이 m일 때, N개의 명령어들을 실행하는 데 걸리는 시간
- 이것은 슈퍼스칼라(SS) 방식과 슈퍼 파이프라인(SP) 방식에서 소요되는 시간을 합성한 형태임
- 일반 파이프라이닝의 속도와 비교했을 때, 슈퍼 파이프라인된 슈퍼 스칼라의 속도향상은 다음과 같음
- 여기서, 명령어의 수 N이 무한하면, 속도향상은 (m x n)이 될 것
- 즉, 명령어의 개수(N)가 증가하면 슈퍼 파이프라인의 등급(n)과 슈퍼스칼라의 등급(m) 곱만큼 속도 향상이 증가함