Control Flow
시작부터 종료까지 CPU가 명령어의 나열을 읽고 실행하는 것.
이 명령어의 나열을 CPU의 control flow라고 함.
Control Flow 변경
change in program state
Jump, branch, call, return
change in system state
데이터 도착, divides by zero 명령, 유저의 Ctrl-C 입력, 시스템 타이머 오류 등
Low level mechanism
Exceptions
- 시스템 이벤트에 반응하는 control flow 변경
- 하드웨어와 OS 소프트웨어의 조합으로 구현
Higher level mechanism
Process context switch
- OS 소프트웨어와 하드웨어의 타이머로 구현
Signal
- OS 소프트웨어로 구현
Nonlocal jump : setjmp(), longjmp()
- C 런타임 라이브러리로 구현
Exceptions
특정 이벤트에 반응하기 위해 control을 OS kernel로 전환하는 것
(예: Divide by 0, arithmetic overflow, page fault, I/O requiest completes, typing Ctrl-C)
각 이벤트는 고유한 exception number를 가지고 이 넘버가 exception table의 인덱스가 된다.
프로세서 외적인 이벤트에 의해 발생하는 Exception.
(예: Timer interrupt, I/O interrupt from external device)
명령어 실행 결과에 의해 발생하는 Exception.
Traps
Faults
Aborts
커널의 함수를 호출한다고 생각하면 편함.
예) syscall open

e5d70 <__open> :
...
e5d79: b8 02 00 00 00 mov $0x2, %eax
e5d7e: 0f 05 syscall
e5d80: 48 3d 01 f0 ff ff cmp $0xfffff001, %rax
...
e5dfa: c3 retq
Fault 예 : Page Fault (recoverable)
유저가 할당된 메모리에 값을 적었을 때 그 페이지가 디스크에 있을 경우 디스크에서 메모리로 카피한 후 return 하고, 해당 명령줄을 다시 실행함

Fault 예 : Invalid Memory Reference (unrecoverable)
유저가 잘못된 메모리 주소를 참조하면 프로세스에 SIGSEGV신호를 보내고 프로그램을 종료함.
프로세스는 "segmentation fault"와 함께 종료됨.

프로세스는 실행중인 프로그램의 인스턴스(instance)다. 프로그램과는 다른 말이다.
프로세스는 각 프로그램을 두가지로 추상화한다.
컴퓨터는 많은 프로세스를 동시에 실행시키기 때문에 이를 처리할 방식이 필요하다.
Multiprocessing : Traditional

과거에는 하나의 프로세서가 다수의 프로세스를 실행시켰다.
virtual memory 시스템을 이용해 각 프로세스 별로 address space를 할당하고 현재 cpu가 실행 중이지 않은 프로세스의 레지스터 값은 메모리에 저장한다.
Multiprocessing : Modern
하나의 칩에 여러개의 CPU가 있다. CPU들은 메인 메모리와 일부 캐시 메모리를 공유하며 각각 다른 프로세스를 실행한다.
각 프로세스는 logical control flow이다. 두개의 프로세스의 flow가 같은 시간에 overlap 되면 이들은 concurrent하다(run concurrently)고 한다.
겹치지 않는 프로세스는 sequential하다.

이처럼 concurrent process의 control flow는 시간적으로도 물리적으로도 분리되어 있지만, 이용자는 아래와 같이 병렬적으로 실행된다고 느끼게 된다.

프로세스는 kernel이라고 불리는 메모리 청크에 의해 관리된다.
kernel은 별도의 프로세스가 아니라 기존 프로세스의 일부로 실행된다.

kernel의 context switch를 통해서 control flow가 한 프로세스에서 다른 프로세스로 패스된다.
<참고자료>
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition
안성용, "시스템소프트웨어", 부산대학교