Control Flow
CPU에 전원이 공급된 시점부터 차단될 때까지 CPU는 sequence of instrcutons(machine code)을 한 번에 하나씩 읽고 실행한다. 명령어를 읽고 실행하는 연속된 흐름을 CPU의 Contrl Flow라고 한다.
CPU관점에서 프로그램 또는 프로세스는 여러 개의 명령어가 모여있는 집합이다.
메모리에 명령어 집합이 올라가고 어드레스 버스에 신호를 주게 되면 어떤 어드레스를 접근할 것인지 CPU안에 있는 PC/IP 레지스터 값을 보고 해당 주소에 접근하여 명령어를 가져온다. 명령어의 주소는 데이터 버스를 통해서 CPU안에 있는 Instruction Register(IR)로 저장된다. 그다음 디코딩하여 op코드가 무엇인지 보고 실행한다. PC(program counter)는 명령어를 가져오는 순간 다음 명령어를 가리키는 주소로 업데이트된다. 이러한 흐름이 반복된다.
CPU가 프로그램을 실행하면서 명령어를 제어하는 흐름을 Control Flow라고 한다.
CPU 구성 요소
- Arithmetic Logic Unit(ALU) : 연산 장치
- 산술 연산과 논리 연산을 수행
- Control Unit(CU) : 제어 장치
- 프로그램에서 주어진 명령을 해석하고 실행하기 위해 제어신호를 생성.
- 연산, 읽기, 쓰기 등의 동작신호와 각 장치를 제어하기 위한 타이밍 신호를 만듦.
- Register : 임시 기억 장치
- CPU의 임시 기억 장소로 명령, 주소, 데이터 등을 일시적으로 저장.
- 접근 속도가 가장 빠름.
- 용도 에 따라 범용 레지스터와 특수 목적 레지스터로 구분
- CPU 내부 버스
- CPU 내부 장치를 연결하는 버스
- CPU clock과 같은 속도를 가짐.
- 기타 장치
- 부동 소수점 처리장치(FPU)
- 내장 GPU
- 캐시 메모리
프로그램의 실행 과정
프로세서는 간단하게 4단계로 동작한다.
- Fetch(인출)
- 메모리 상의 프로그램 카운터(PC)가 가리키는 명령어를 CPU로 가져와서 적재. - Decode(해석)
- 명령어의 해석. 이 단계에서 명령어의 종류와 타깃 등을 판단한다. - Execute(실행)
- 해석된 명령어에 따라 연산을 수행한다. - Writeback(쓰기)
- 처리 완료된 데이터를 메모리에 기록한다.
Altering the Control Flow
Control Flow가 변경되는 경우는 크게 2가지 있다.
Program State
Jumps and Branches
C언어 같은 경우 go to문을 쓴다 하면 특정 주소로 점프하는 것이다.
점프 명령어를 만나면 PC를 kernel의 context(stack?)에 저장하고 점프하고자 하는 명령어의 주소로 PC가 업데이트된다.
해당 주소가 점프한 지점의 명령어를 수행한다.
명령어가 순차적으로 실행되다가 점프해서 실행하고 다시 돌아오는 것. 이런 것이 Control flow를 변경하는 것이다.
Call and Return
코드 안에서 서브루틴을 호출하는 경우도 Control Flow를 변경한다고 할 수 있다.
서브루틴을 호출하는 방식으로 프로그래머가 Control Flow를 의도적으로 변경할 수 있다.
System State
- Data arrives from a disk or a network adapter
- Instruction divides by zero
- User hits Ctrl-C at the keyboard
- System timer expires
위의 이벤트들은 프로그래머가 의도하지 않은 이벤트들이다.
이러한 이벤트를 예외라고 하며 시스템은 예외를 처리할 수 있는 Exceptional Control Flow가 필요하다.
Exceptional Control Flow
Exception은 모든 level의 컴퓨터에서 존재한다.
컴퓨터 시스템에서 Exceptional Control Flow를 Low level, High level 두 가지로 나눌 수 있다.
Low level mechanisms
1. Exceptions
- 시스템 이벤트에 반응하는 Control Flow의 변경
- 보통 하드웨어와 OS의 협업을 통해서 구현 가능
Higher level mechnisms
2. Process context switch
- 하드웨어 타이머와 OS 소프트웨어에 의해서 구현됨.
3. signals
- OS에 의해서 구현됨.
4. Nonlocal jumps: setjmp() and longjmp()
- C runtime library에 의해서 구현됨.