Today
¢ Exceptional Control Flow
¢ Exceptions
¢ Processes
¢ Process Control
프로세서 관점에서 프로그램을 볼때 어떻게 볼것이냐는 관점에서 시작하자. 우리의 프로그램은 결국 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라고 한다.
이 sequence를 변경하는 방법이 있다.
즉 프로그래머가 의도적으로 바꾸는 것이다.
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” : 시스템이 반응할 수 있는 메커니즘이 필요하다.
Exists at all levels of a computer system
Low level mechanisms
Higher level mechanisms
OS 커널에 이벤트가 발생시 제어권을 넘기어 주는 것이다.
OS 커널은 그냥 OS에 일부분에 해당하지만 메모리에 돌고있는 프로그램이다.
그러래 exception이 발생할 수 있다.
예외처리를 위한 Exception table이 존재한다. 예외처리 별 인덱스가 있다. 각각의 Exception 번호는 해당하는 exception handler의 주소를 가지고 있다.
Interrupt는 비동기
Traps, Faults, and Aborts는 동기방식이다. 프로그램 실행의 결과로 발생하는 이벤트이다.
Interrupt는 I/O device로부터 signal이 온다. signal이 오면 현재 명령어를 끝내고 그 다음 명령어를 실행한다.
recoverable error은 segment fault, page fault가 떳을 때를 이야기 한다.
외부에서 발생하는 이벤트에 의해서 야기되는 Exception이다. CPU에 보면 interrupt pin이라는 것이 있다. cpu가 instruction을 매번 읽을 때마다 interrupt pin이 셋팅되어 있는지 확인한다. 그래서 interrupt pin이 셋팅되어 있으면 하드웨어에 문제가 생긴것이다.
이벤트를 수행하고 발생하는 결과물들을 이야기 한다.
Caused by events that occur as a result of executing an instruction:
Faults
Aborts
트랩(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)
__open
function, which invokes system call instruction syscallint a[1000];
main ()
{
a[500] = 13;
}
넣고자 하는 주소가 실재 메모리에 할당되어 있지 않은 주소인 경우가 생긴 경우에 처리한다.
접근 불가능한 경우 user process에 시그널을 보내준다.