Exceptional Control Flow
youngwiki
개요

프로세서는 한번에 하나씩 instruction을 읽고 실행한다. 이때 프로세서가 실행하는 instruction의 순서를 control flow라고 한다.
Altering the Control Flow
Control FLow를 수정하는 메커니즘은 두가지가 존재한다.
- Jumps and Branches
- Jump: unconditional branch (ex: goto)
- Branches: 조건문, 반복문
- Call and Return: program state[1]에서의 변화에 반응한다.
- Call: Call 명령은 함수나 서브루틴을 호출할 때 사용되며 호출된 함수로 Control Flow가 이동한다.
- Call 명령어는 호출위치를 기억하기 위해 스택에 저장한 반환 주소(return address)를 저장한다. 호출된 함수가 끝나면 Return 명령을 통해서 호출한 위치로 돌아온다.
- Return: 함수가 종료되면 Return 명령이 실행되어 제어 흐름이 호출 지점으로 돌아간다.
- Return은 스택에 저장된 반환 주소를 참조하여 정확한 위치로 제어 흐름을 되돌린다.
- Call: Call 명령은 함수나 서브루틴을 호출할 때 사용되며 호출된 함수로 Control Flow가 이동한다.
- Jumps/Branches와 Call/Return의 차이점
- Call/Return은 함수 호출 및 반환에 특화된 흐름 변경으로, 흐름을 함수 레벨에서 관리한다. 즉 함수 호출 시, 호출 위치를 기억하고 결과가 반환되면 그 지점으로 돌아오는 방식이다. 이를 통해서 control flow를 구조적으로 변화시킬 수 있다.
- Jumps/Branches 방식은 프로그램 내에서 흐름을 일시적으로 변경, 호출/반환과 같은 기능은 없다.
하지만 위의 두 메커니즘은 system state[2]에서의 모든 변화에 대응하기에는 불충분하다. 아래는 그 예시이다.
- disk, network adapter 등으로부터 Data를 받을 때[3]
- 0 나누기를 시도할 때
- Ctrl - C 를 시도할 때
- System Timer가 만료되었을 때(expire)[4]
- 오버플로우(언더플로우)가 발생할 때[5]
각주
- ↑ 프로그램이 실행 중일 때의 상태를 의미한다. 주로 프로그램 내의 변수 값, 레지스터 값, 프로그램 카운터(PC), 스택 포인터 등과 관련이 있다. 즉, 프로그램이 현재 어떤 명령어를 실행하고 있고, 실행 중인 함수나 연산의 중간 결과 등이 프로그램 상태에 포함된다.
- ↑ 운영체제와 하드웨어의 상태를 의미한다. 이는 CPU, 메모리, 디스크, 네트워크, 장치 드라이버 상태, 그리고 시스템이 외부 이벤트에 어떻게 반응하고 있는지 등과 관련이 있다. 예를 들어, 네트워크에서 데이터가 수신되는 상태, 디스크 읽기/쓰기 상태, 시스템 시간 등이 시스템 상태에 포함된다.
- ↑ CPU가 disk보다 100만배는 빠르므로 disk에 작업을 요청한 후 다른 작업을 실행함
- ↑ S.T 만료 -> 인터럽트 발생 -> 현재 프로그램 중단 후 스케줄링 처리 -> 다음 프로그램 실행
- ↑ Exceptional Control Flow가 필요함