출처: https://3months.tistory.com/307 [Deep Play]

4-1/시스템프로그래밍

Exceptional Control Flow, Exception

코딩하는 랄뚜기 2022. 3. 9. 14:13

Control Flow

 

Processor는 한 번에 한 가지 일만 처리할 수 있다.

실행되었을 때부터 종료될 때까지 CPU는 그저 instruction들을 순서대로 읽을 뿐인데 이 순서를 Control Flow라고 한다.

항상 instruction을 순서대로 읽으면 좋겠지만 당연하게도 정해진 순서를 바꿔야 하는 경우가 발생하게 된다.

 

Program state에서 Jumps, branches, call, return 등을 사용하여 프로그래머가 의도적으로 이 control flow를 바꿀 수 있다.

 

하지만 data가 disk나 network adapter에서 오는 경우, divides by zero가 발생하는 경우, 사용자가 Ctrl-C를 누르는 경우, System에 할당된 시간이 다 된 경우 등 System state에서 control flow를 바꿔야 줘야 하는 상황들이 있다이럴 때는 OS에게 제어권을 넘겨줘야 하고 이런 예외적인 control flowExceptional Control Flow(ECF)라고 한다.

 

Exceptional Control Flow Low level mechanismsHigher level mechanisms로 나뉜다.

 

Low level mechanisms (OS+Hardware)

  • Exceptions

High level mechanisms (OS)

  • Process context switch
  • Signals
  • Nonlocal jumps

 

Exception

 

 

 

Exception이란 divide by zero, page fault 등과 같은 에러 상황이 발생하였을 때 OS kernel에게 제어권을 넘기는 것이다. 제어권을 넘겨받은 OS는 에러가 나지 않도록 처리를 해주고 제어권을 다시 User에게 넘겨준다.

 

 

Exception table

각각의 상황에는 고유한 exception number가 부여되고 이를 정리하여 Exception table에 정리해 놓는다.

 

Exception Interrupt, Trap, Fault, Abort 4가지 class로 나뉜다.

 

 

 여기서 주목해야 할 것은 AsynchronousSynchronous이다. 

 


 

Asynchronous Exception(Interrupts)

 

 

Asynchronous ExceptionCPU말고 다른 외부 장치에 의해 발생하는 Exception이다. 따라서 CPU가 해당 Exception언제 발생할지 알 수 없다.( Asynchronous는 비동기화라는 의미인데 예측할 수 없다로 의역을 해야 하는 건지 잘 모르겠다..)

 

Interrupts의 예시로는 I/O가 발생할 때가 있다.

 

 

Instruction에 read()가 있어 읽고 싶은 파일을 주소를 SSD에서 가져와야한다고 가정하자.

 

 

 

SSD에 접근하는 시간은 오래 걸리기 때문에 CPU는 DMA에 명령을 내리고 주소를 가져올 때까지 다른 instruction을 처리한다.

 

DMA가 주소를 가져오면 interrupt가 발생하는데 DMA가 언제 주소를 가져올지 모르므로 CPU 입장에서는 언제 interrupt가 발생할지 알 수 없다.

 

Interrupt가 발생하면 반드시 현재 실행하고 있는 instruction을 끝내고 (다음 instruction을 fetch하기 전) interrupt를 처리해주기 때문에 OS가 제어권을 user에게 넘겨줄 때는 다음 instruction을 실행해야 한다.

 

Interrupt가 발생하는 경우는 예시 외에도 사용자가 Ctrl-C를 누르는 경우, network에서 packet이 도착하는 경우, Timer가 interrupt하는 경우가 있다.

 


 

Synchronous Exceptions

 

 

Synchronous Exception은 instruction을 실행하는 도중 발생하는 exception으로 CPU가 주체가 되어 발생한다.

 

Trap은 의도적인 성격을 띄고있는 Synchronous exception이다. System calls, breakpoint traps, special instructions이 있다.

 

 

Trap이 발생한 다음에는 다음 instruction이 실행된다.

 

System call은 정확히 무엇인가?

 

 

Application에서 Hardware에 접근하고 싶을 때 OS에 제어권을 넘겨줘야 하는데 이 때 발생시키는 것이 System call이다.

System call에는 여러가지 종류가 있고 OSSystem call 종류에 맞게 일을 수행한다.

 

System call 종류


 

Faults는 비의도적이지만 거의 고칠 수 있는 성격을 띄고 있는 Synchronous exception이다. Pagefaults (recoverable), protection faults (unrecoverable), floating point exception이 있다. 현재 instruction을 다시 실행시키는 특징이 있다.

 

Abort는 비의도적이고 고칠 수 없는 성격을 띄고 있는 Synchronous exception이다. illegal instruction, parity error, machine check가 있다. 아예 현재 프로그램을 종료시킨다.

 

 

int a[1000];
main(){
    a[500]=13;
}

 

위는 page fault의 예시이다. int a[1000]는 용량이 4KB나 되기 때문에 RAM보다는 disk에 있을 것이다.

따라서 처음 instruction을 실행 할 때 RAM에 있지 않기 때문에 page fault가 발생하고 제어권을 넘겨받은 OS는 disk에 있는 주소를 RAM에 올리고 제어권을 넘겨 줄 것이다. 다시 해당 instruction을 실행하면 exception없이 실행되게 된다.

 

int a[1000];
main(){
    a[5000]=13;
}

 

 

위 코드에서 a[5000]은 존재하지 않으므로 아래와 같은 flow가 발생하게 된다.

 

 

'4-1 > 시스템프로그래밍' 카테고리의 다른 글

Unix I/O, RIO package  (0) 2022.04.04
Signal  (0) 2022.03.28
Shell  (0) 2022.03.22
Process Control  (0) 2022.03.15
Processes  (4) 2022.03.10