시스템 프로그래밍 9-1(Exceptional Control Flow)

TonyHan·2021년 5월 25일
0

=== Exceptional Control Flow: Exceptions and Processes ===

Today
¢ Exceptional Control Flow
¢ Exceptions
¢ Processes
¢ Process Control

=== Exceptional Control Flow ===

1. Exceptional Control Flow

프로세서 관점에서 프로그램을 볼때 어떻게 볼것이냐는 관점에서 시작하자. 우리의 프로그램은 결국 instruction들의 집합이다. CPU관점에서는 이 instruction을 fetch -> decode -> execute하면서 순차적으로 실행한다.
CPU가 명령어를 실행하는 sequence를 control flow라고 부른다.

¢ Processors do only one thing:
§ From startup to shutdown, a CPU simply reads and executes
(interprets) a sequence of instructions, one at a time
§ This sequence is the CPU’s control flow (or flow of control)

Addr Bus에 신호를 준다
-> cpu 안에 있는 PC(program counter), IP(intruction pointer)의 값을 보고 addressing을 해서 instruction 값을 fetch한다.
-> fetch된 instruction이 data bus를 통해서 cpu의 IR(insturction register)에 들어간다.
-> 그걸 cpu는 decoding한다.
-> 그리고 opcode가 무엇인지 확인하고 execution한다.

그러면 메모리에 올라가 있는 instruction은 cpu 관점에서 sequence가 있다고 할 수 있다. sequence는 cpu입장에서는 control을 sequence 순으로 한다고 생각하고 flow를 가지게 된다. 이것을 control flow라고 한다.

Altering the Control Flow

이 sequence를 변경하는 방법이 있다.

  • Up to now: two mechanisms for changing control flow:
    • Jumps and branches : 원래 pc의 그 다음 주소를 다른 곳에 저장하고 jmp의 주소로 pc를 업데이트, 실행하고 돌아온다.
    • Call and return : 서브루틴을 호출하는 경우
      React to changes in program state : 프로그램 상태의 변화에 반응하는 거라고 보면 된다.


즉 프로그래머가 의도적으로 바꾸는 것이다.

  • Insufficient for a useful system: Difficult to react to changes in system state : 하지만 실재 시스템에서는 프로그램의 상태가 바뀌는게 아니라 시스템 상태가 변경이 되어서 그것에 반응해야 하는 경우가 있다. 그것이 쉽지 않다.
    • Data arrives from a disk or a network adapter : 디스크에서 데이터가 다 온 경우, 네트워크에서 데이터 패킷이 온 경우
    • Instruction divides by zero : 0으로 나눈 경우
    • User hits Ctrl-C at the keyboard : ctrl-c를 누른 경우
    • System timer expires : system timer가 만료된 경우
      위의 것들은 프로그래머들이 의도하지 않은 경우이다.

  • data arrives form a disk라고 하면 디스크와 메인 메모리가 있고 사용자가 malloc해서 버퍼 영역을 잡았을 때 foo라는 파일을 열어 fp에 받고 read를 할때 이 내용은 ptr에 저장이 된다. foo라는 파일을 읽어서 메모리에 올리고 싶어한다.

  • 디스크(SSD)에 보면 DMA 엔진이 있다. 이것을 보고 controller라고 하는데 작은 micro processor이다. 이 프로세서가 호스트로 부터 명령어를 받아서 ptr이라는 영역으로 가져다 놓으라고 cpu가 디스크에다가 명령어를 보낸다. 이것은 os가 하는 일이다.

  • 그러면 비동기 방식으로 DMA 엔진이 데이터를 읽어서 transfer을 통해서 메모리에 올려놓는다. 이 순간 cpu는 그 다음 명령어를 따라 계속 내려간다. 메모리에 올리는 시간이 cpu에 비해서 너무 느려서 계속해서 읽어 내려가는 것이다.그러면 메모리에 데이터가 올라가면 언제가는 data arrive 상태가 된다.

  • network adapter이라고 하면 NIC가 달리어 있는데 ethernet이 있어서 서버와 연결이 되어 있다. 네트워크의 데이터가 NIC에 도착을 하면 컴퓨터 cpu가 NIC에 데이터가 왔는지 안왔는지 계속 polling을 하면서 보고 있는다 이건 비효율적이다. 그래서 NIC가 CPU에게 데이터가 왔다고 이벤트를 발생한다. 이것은 시스템이 반응하기 어렵다.

  • System needs mechanisms for “exceptional control flow” : 시스템이 반응할 수 있는 메커니즘이 필요하다.

Exceptional Control Flow

  • Exists at all levels of a computer system

  • Low level mechanisms

      1. Exceptions
      • Change in control flow in response to a system event (i.e., change in system state)
      • Implemented using combination of hardware and OS software
  • Higher level mechanisms

      1. Process context switch
      • Implemented by OS software and hardware timer
      1. Signals
      • Implemented by OS software
      1. Nonlocal jumps: setjmp() and longjmp() : C언어 라이브러리에 의해서 exception이 발생한다.
      • Implemented by C runtime library

=== Exceptions ===

1. Exceptions

OS 커널에 이벤트가 발생시 제어권을 넘기어 주는 것이다.

OS 커널은 그냥 OS에 일부분에 해당하지만 메모리에 돌고있는 프로그램이다.

그러래 exception이 발생할 수 있다.

  • An exception is a transfer of control to the OS kernel in response to some event (i.e., change in processor state)
  • Kernel is the memory-resident part of the OS
  • Examples of events: Divide by 0, arithmetic overflow, page fault, I/O request completes, typing Ctrl-C
  • User 코드가 작동하다가 Event가 발생하면 예외가 발생했으니 kernel로 제어권을 넘기어 주는 것이다. 그럼 kernel은 예외처리 handler가 작동한다.
  • 그 이후 원래 위치로 돌아오거나 그 다음 명령어로 가거나 그냥 user code를 abort할 수 있다.

Exception Tables

예외처리를 위한 Exception table이 존재한다. 예외처리 별 인덱스가 있다. 각각의 Exception 번호는 해당하는 exception handler의 주소를 가지고 있다.

  • Each type of event has a unique exception number k
  • k = index into exception table
    (a.k.a. interrupt vector)
  • Handler k is called each time exception k occurs

Classes of Exceptions

Interrupt는 비동기
Traps, Faults, and Aborts는 동기방식이다. 프로그램 실행의 결과로 발생하는 이벤트이다.

  • Interrupts, Traps, Faults, and Aborts


Interrupt는 I/O device로부터 signal이 온다. signal이 오면 현재 명령어를 끝내고 그 다음 명령어를 실행한다.

recoverable error은 segment fault, page fault가 떳을 때를 이야기 한다.

Asynchronous Exceptions (Interrupts)

외부에서 발생하는 이벤트에 의해서 야기되는 Exception이다. CPU에 보면 interrupt pin이라는 것이 있다. cpu가 instruction을 매번 읽을 때마다 interrupt pin이 셋팅되어 있는지 확인한다. 그래서 interrupt pin이 셋팅되어 있으면 하드웨어에 문제가 생긴것이다.

  • Caused by events external to the processor
    • Indicated by setting the processor’s interrupt pin
    • Handler returns to “next” instruction


  • Examples:
    • Timer interrupt : 각 프로그램이 실행될때 cpu가 프로그램을 tinn
      • Every few ms, an external timer chip triggers an interrupt
      • Used by the kernel to take back control from user programs
    • I/O interrupt from external device : 외부 디바이스에서 interrupt가 발생시
      - Hitting Ctrl-C at the keyboard
      - Arrival of a packet from a network
      - Arrival of data from a disk
      time을 cpu가 나누어 가지어서 프로그램을 번갈아서 실행된다. 그런데 이 timer가 바뀌면서 프로그램 간의 context switching이 발생하게 된다. cpu 입장에서는 A->B일때 바뀐것을 어떻게 아느냐? 그것은 cpu에 interrupt pin이 있어서 timer가 interrupt pin을 setting 해준다. 이것을 보고 cpu가 switching한다. 이것을 보고 비동기라고 한다.

Synchronous Exceptions

이벤트를 수행하고 발생하는 결과물들을 이야기 한다.

  • Caused by events that occur as a result of executing an instruction:

    • Traps
    • Intentional
    • Examples: system calls, breakpoint traps, special instructions
    • Returns control to “next” instruction
  • Faults

    • Unintentional but possibly recoverable
    • Examples: page faults (recoverable), protection faults (unrecoverable), floating point exceptions
    • Either re-executes faulting (“current”) instruction or aborts
  • Aborts

    • Unintentional and unrecoverable
    • Examples: illegal instruction, parity error, machine check
    • Aborts current program
  • 트랩(trap)은 실행 중인 프로그램 내에 테스트를 위해 특별한 조건을 걸어 놓은 것을 말한다

  • 대표적으로 app이 실행하다가 스스로 system call을 실행한다. system call은 내가 OS 서비스를 요청하는 것이다.

  • 예를 들어서 파일을 읽는다고 하면 파일은 SSD에 있다. app이 직접 ssd에 접근해서 쓰는것은 매우 어렵다. 그래서 OS에 system call을 요청한다. 그러면 OS의 system call routine이 발생한다.

    Synchronous Exceptions (Traps)


  • 폴트(fault)는 현재 명령라인이 실패하면, 폴트처리루틴(fault handler)을 수행한후 이전라인으로 복귀하는 것을 이야기 한다.

  • 프로그래머는 물리적으로 DRAM과 SSD가 어디에 있는지 알필요가 없다 왜냐하면 가상메모리 시스템이 이 모든것을 가상화해주기 때문이다. 그러면 OS에서 가상 메모리 주소중에 어떤 부분이 어떤 메모리에 있는지를 관리해준다.

  • 그런데 CPU가 DRAM에 mapping되어 있지 않은 메모리에 접근할 때 page fault가 발생하고 OS에서 디스크안의 mapping된 영역을 읽어서 DRAM으로 가지고 온다. 그리고 그 부분을 DRAM으로 가지고 와서 명령어를 처리한다.

    Synchronous Exceptions (Fault Handling)


  • 어볼트(abort)는 현재 명령라인이 실패하면 중지하는 걸 말한다.

  • Abort handling은 하드웨어 에러를 이야기 한다. DRAM에 비트들이 저장되어 있는 데 이게 bit flip이 될 수 있다. 이때 이전으로 돌릴 수 있냐 없냐로 recoverable, unrecoverable하다고 한다. 회복가능한 것은 패리티 비트를 보고 처리한다.

  • 그래서 하드웨어에서 에러가 생기면 커널로 넘기어서 커널이 지금 돌아가고 있는 프로세스를 abort시킨다.

    Synchronous Exceptions (Abort Handling)

System Calls

  • Each x86-64 system call has a unique ID number
  • Examples:

System Call Example: Opening File

  • User calls: open(filename, options)
  • Calls __open function, which invokes system call instruction syscall

Fault Example: Page Fault

  • User writes to memory location
  • That portion (page) of user’s memory is currently on disk
int a[1000];
main ()
{
	a[500] = 13;
}

넣고자 하는 주소가 실재 메모리에 할당되어 있지 않은 주소인 경우가 생긴 경우에 처리한다.

Fault Example: Invalid Memory Reference

접근 불가능한 경우 user process에 시그널을 보내준다.

profile
신촌거지출신개발자(시리즈 부분에 목차가 나옵니다.)

0개의 댓글