CSAPP 8장을 참고했습니다.
| 종류 | 예시 | 특징 |
|---|---|---|
| Interrupt | 키보드 입력, 타이머 | 외부 장치가 CPU에 신호 |
| Trap | int 명령, 시스템 콜 | 예외 처리 후 복귀 가능 |
| Fault | 페이지 폴트 | 수정 후 재시도 가능 |
| abort | 메모리 에러 | 복구 불가능 (프로세스 종료) |

프로세서 외부에 있는 입출력 디바이스로부터의 시그널 결과로 비동기적으로 발생한다.
적절한 인터럽트 핸들러를 호출하고, 핸들러가 리턴될 때 제어를 다음 인스트럭션으로 돌려준다.
더 세부적으로 들어가보자면,
인터럽트를 발생시킨 디바이스를 식별하는 예외번호로 그 적절한 인터럽트 핸들러를 호출할 수 있게 된다. 시스템 버스는 예외번호를 읽으며 매칭되는 인터럽트 핸들러를 호출한다.

의도적인 예외상황으로 어떤 인스트럭션을 실행한 결과로 발생한다.
사용자 프로그램과 커널 사이의 프로시저와 유사한 인터페이스, 즉 시스템 콜이 가장 대표적이다.
사용자는 커널에 직접 접근하지 못하기 때문에 이러한 커널의 서비스에 제한적으로 접근을 허용하기 위해서 프로세서는 특정 인스트럭션을 제공한다.
우리는 필요에 따라 시스템 콜을 호출하는데, 이는 일반적으로 호출하는 그 함수와는 전혀 다르다. 시스템 콜은 오직 커널 모드에서만 실행될 수 있고 우리는 그저 사용자 모드에서 이를 호출하는 것이다.

error와 다르다는 점을 짚고 가자. fault는 핸들러가 정정할 수 있을 가능성이 있는 에러 조건으로부터 발생한다.
에러 조건이 해결된다면 제어를 인스트럭션으로 돌려주고, 그렇지 않다면 abort 루틴으로 리턴한다.
대표적인 fault는 페이지 오류 예외다. 이는 인스트럭션이 가상메모리 테이블을 참조했을 때 대응되는 실제 메모리 page가 존재하지 않는 상황이며, 디스크에서 가져와야 할 때 발생한다.
페이지 오류 핸들러는 디스크에서 적절한 페이지를 로드하여 오류를 발생시킨 인스트럭션으로 제어를 넘겨준다.

DRAM이나 SRAM이 고장날 때 발생하는 치명적인 에러에서 발생한다.
중단 핸들러는 절대로 응용프로그램으로 제어를 리턴하지 않고 중단시킨다.
예외가 발생하면 컴퓨터는 이게 무슨 예외인지 알 수 있어야 한다.
중단되어야 하면 중단해야하고, Fault로 다른 작업을 기다려야 한다면 기다렸다가 재시도 해야한다. 예외의 종류에 따라 처리가 달라지기 때문에 컴퓨터는 이게 도대체 어떤 예외인지 알아야 한다.
알기 위해서 정의한 것이 예외 테이블이다.
예외 테이블은 각 예외 상황에 대한 핸들러의 주소를 가진다. 특정 예외 상황에서 예외 번호를 넘기면 해당 핸들러로 이동하여 알맞게 예외 처리할 수 있다.
참고로,
예외 번호는 CPU가 할당하는 것과 커널이 할당하는 것으로 나뉜다.
CPU는 divide by zero, 페이지 오류, 메모리 접근 위반, 산술연산 오버플로우의 예외번호를 할당한다. CPU 내에서 산술 연산을 하거나 프로그램 스택을 관리할 때 발생되는 예외를 다룬다.
커널은 시스템 콜, 외부 I/O 디바이스로부터의 시그널의 예외번호를 할당한다. 커널 모드로 전환하여 무언가의 처리를 해주어야 하기 때문에 위의 예외 상황은 커널의 영역이다.
그렇게 예외 핸들러에 의해 소프트웨어로 예외처리가 진행된다.
핸들러는 경우에 따라서 인터럽트에 의해 중단된 프로그램으로 돌아간다. 예외처리로 넘어가기 전에 스택에 푸시해뒀던 다음(혹은 현재) 인스트럭션 주소를 다시 pop 해오며 되돌려준다.
실행 프로그램의 인스턴스
메모리 공간 + 실행 상태 + 리소스 관리 정보 포함
우리의 프로그램은 프로세서와 메모리를 독점해서 사용하는 것처럼 보인다. 이는 컴퓨터의 추상화와 동시성에서 비롯된다.
프로세서는 프로그램 내의 인스트럭션들을 차례대로 중단됨 없이 실행하는 것처럼 보인다. 이런 착각은 프로그램의 추상화인 프로세스에서 나타난다.
자신의 실행시간이 다른 흐름과 겹치는 논리 흐름을 동시성 흐름이라고 한다.
엄밀히 보자면, 실제로 동시에 수행되는 것은 아니고, 제어권을 서로 돌아가며 돌려주기 때문에 서로 동시적이라고 볼 수 있는 것이다.
동시성에 대해서는 지난 포스팅에 더 자세히 기재하였으니 참고 바란다.
아 그리고 코어 수나 컴퓨터의 개수와 동시성은 무관하다. 동시성은 동시에 실행되는 “것처럼” 보이게 하는 것이고, 병렬성 흐름이 실제로 동시에 돌아가고 있는 것이다.

n비트 주소를 갖는 머신에서 주소공간은 2^n의 가능한 주소가 있다. 프로세스는 각 프로그램에 자신만의 사적 주소 공간을 제공한다.
이 공간은 다른 프로세스가 침범하지 못하는 사적인 주소 공간이다.
유념할 점은 가장 윗부분에 커널을 위해 주소공간의 일부가 예약되어 있다. 커널이 프로세스를 대신해서 인스트럭션을 실행할 때 사용하는 코드이다.
시스템 내의 각 프로그램은 어떤 프로세스의 문맥 context에서 돌아간다. 커널은 각 프로세스마다 컨텍스트를 유지한다.
현재 진행 중인 프로세스에서 다른 프로세스로 전환되는 것을 문맥 전환 context switch 라고 한다.
프로세스가 사용자 모드에서 커널 모드로 진입하는 유일한 방법은 인터럽트, 오류, 트랩 시스템 콜 같은 예외를 통해서다.
모드 비트가 설정되면 프로세스는 커널 모드로 동작한다. 커널 모드에서 돌고있는 프로세스는 인스트럭션 집합의 어떤 인스트럭션도 실행할 수 있으며, 시스템 내의 어떤 메모리 위치도 접근할 수 있다.
모드 비트가 세트되지 않을 때 프로세스는 사용자 모드에서 돌고 있다.
사용자 모든느 프로세서를 멈추거나 모드 비트를 변경하거나 입출력 연산을 초기화하는 등의 특수 인스트럭션을 실행할 수 없다.
사용자 프로그램은 시스템 콜을 통해서 커널 코드와 데이터에 간접적으로 접근해야 한다.