본문 바로가기

시스템

[시스템 프로그래밍] Exceptional control flow의 종류

1. control flow

컴퓨터가 켜진 순간부터 전원이 꺼질 때까지,

컴퓨터의 뇌라 할 수 있는 CPU는 그저 instructions 을 읽고 수행할 뿐이다. 

이때 이 instructions의 배열이 바로 CPU의 control flow이다.

 

2. exceptional control flow

CPU가 항상 instructions를 나열된 순서대로 수행하는 것은 아니다.

순서가 바뀌는 것과 관련하여 두가지 개념이 있다. 바로 program state과 system state이다.

program state는 variable의 value를 뜻한다. 변수의 값에 따라 코드의 바로 밑에 line을 수행하는 것이 아니라 다른 line으로 이동하기도 하는.. 이러한 상황에서 instructions의 수행 순서가 바뀌곤 한다.

system state는 앞으로 배울 내용이다. 네크워크를 타고 data packet이 도착하거나, ctrl-C를 눌러서 프로그램을 종료시키는 등의 events에 대응하는 메커니즘이 바로 exceptional control flow가 되겠다!

 

3. exceptional control flow의 분류

exceptional control flow
(ECF)
low level
mechanism
Exceptions Interrupt
Trap
Fault
Abort
higher level mechanism Process context switch
Signals

 

4. Exceptions

Exceptions란 system state에 대한 응답으로 OS kernel에게 control을 넘겨주는 것을 말한다.

그러면 kernel은 exception handler로 exception handling을 하고 다시 control을 user에게 넘겨줄 것이다.

이때 이 exception handling code는 table로 분류되어 있고 이를 Exception tables(Interrupt table)이라 부른다.

exception number가 index로 구분되어 있어서 앞으로는 exception 7, handler 7 이런식으로 부르게 될 것이다.

또한 위의 표에서 구분되어 있는 것처럼 exception은 4가지 class로 나뉘어 또다시 분류된다.

(컴퓨터는 각종 exceptions를 exception number로 구분하고, 고유의 exception number를 가진 각각의 exception들이 어떤 건 interrupt class, 또 어떤 건 trap class 이런식으로 배정됨!!)

class 원인 Async/sync return behavior
Interrupt 외부 hardware Async next inst 으로 return
Trap 의도적으로 발생시킴 Sync
(inst 수행하다가 생긴 event에 의한 exceptions)
Fault 사고 복구가능한 curr inst 으로 return
Abort 복구불가능한 return 안함

 

5. 각종 예시 및 부연 설명

익숙하지 않은 내용은 수업 한번 듣고 복습 한번 하면 공부가 끝난게 아니다.
익숙해지고 자연스럽게 이해가 될 때까지 자주 읽고 써봐야한다. 
그래도 안되면 어떻게 하나?? 될 때까지 다시 보자!! 

▷interrupts

원인이 외부 hardware라 하는 것은 CPU 입장에서 외부 event를 의미한다. CPU의 interrupt pin을 통해 알 수 있다. 

curr inst와는 무관한 일이기 때문에 curr inst이 끝난 후 control이 kernel로 넘어가고, 당연히 return은 next inst으로 간다.

ex) external timer chip에 의한 interrupt

ex) external device 로부터 I/O interrupt (keyboard에서 ctrl-c누르기, 네트워크 packet 도착, disk에서 data 도착)

▷traps

덫에 걸렸다!! 의도적으로 발생시킨 event에 의해 시작된 exception인 trap이다. 자연스럽게 return도 next inst으로 간다.

ex) *system calls, breakpoint traps

▷faults

실수했다!! 하지만 복구가능한 사고인 fault. 실수한 curr inst으로 return 되어 다시 실행하거나 abort 해버린다.

ex) *page fault, general protection fault, *invalid memory access, floating point exception, divide error

cf) segmentation fault vs segmentation vs segment
segmentation fault : 잘못된 memory 접근으로 인한 에러
segmentation : process를 논리적 단위인 segment를 기준으로 나누어 메모리에 배치하는 것
segment : 논리적 단위

 - fault의 예시 중 page fault, general protection fault, invalid memory access가 segmentation fault에 해당함.

▷aborts

망했다. 복구불가능한 사고. return 하지 않고 current program을 멈춰버린다.

ex) parity error, machine check

 


*System call (excep. number = 128 in Linux)

: kernel에게 어떠한 서비스를 요청할 때 발생하는 intentional synchronous exception.

- syscall은 구체적으로 어떤 서비스를 요청할 것인지에 따라 syscall number를 나눈다.

ex) syscall 0은 read, syscall 1은 write, syscall 2는 open인 식이다.

- kernel에게 control을 넘겨주는데, user인 나에게 어떠한 서비스가 필요해서 의도적으로 control을 넘겨주는 상황.

 

*Page Fault

: logically valid하지만 physical memory에는 없는 address에 접근할 때 발생하는 synchronous exception.

- page fault가 발생하면 kernel이 control을 받아 disk에서 memory로 page copy를 한다. 이후 다시 user에게 control을 돌려주며 current instruction을 re-execute한다.

 

*Invalid Memory Access

: 잘못된 메모리 접근 시 발생하는 synchronous exception.

- user 입장에서는 memory에 올라오지 않은 주소니까 우선 page fault를 발생시킨다. 그러면 kernel에서 invalid addr임을 확인하여 user에게 SIGSEGV signal을 보내며 user code 실행을 중단시킨다. user process는 segmentation fault로 종료된다.