인터럽트와 트랩
OS의 듀얼 모드(Dual-mode)
OS는 User모드와 Kernel 모드로 나뉜다
- 유저모드
권한을 덜 가진 사용자 모드, 응용 프로그램은 하드웨어 리소스에 완전히 접근 가능
- 커널모드
더 많은 권한을 가진 시스템 모드, OS는 시스템의 모든 리소스에 접근 가능함. 커널 모드에서 수행되는 소프트웨어는 처리기와 모든 명령들, 레지스터들, 그리고 메모리 제어 가능
- 하드웨어의 도움을 받아 cpu 내 레지스터의 한 비트를 가지고 모드 변경함
- 유저 모드에서 시스템 콜을 호출하면 트랩 명령어를 실행하여 커널 모드로 바뀜
- 프로그램 상태 워드(PSW)의 한 비트를 사용하여 수행 모드를 나타냄
인터럽트와 트랩의 차이
- 인터럽트(하드웨어 인터럽트)
현재 수행 중인 프로세스와는 독립적으로 외부에서 유발되는 여로 종류의 사건에 의해 발생함. CPU가 특정 기능을 수행하는 도중에 급하게 다른 일을 처리하고자 할 때 사용할 수 있는 기능이다. 일반적으로 인터럽트는 하드웨어 인터럽트를 말함.
인터럽트의 예시
클럭 인터럽트
입출력 인터럽트
메모리 폴트
- 트랩(소프트웨어 인터럽트)
불법적인 파일 접근 시도처럼, 혀냊 수행되고 있는 프로세스 에서 생성되는 오류나 예외 조건 때문에 발생함. 기본적으로 인터럽트의 한 종류로써 다른 일을 처리하고자 할 때 사용하는 기능인 것은 마찬가지이다.
하지만 하드웨어 인터럽트와 달리 외부가 아닌 내부에서 유발되는 사건에 의해 발생하는 것으로 소프트웨어 인터럽트라고 부른다.
트랩에서 유저모드로 돌아가기 위해서는 리턴을 발행하는데 올바르게 리턴할 수 있도록 호출자의 등록 상태를 저장함.
내가 정리한 인터럽트와 트랩의 개념은 위 그림과 같당..
- 병행성 문제
기본적으로 OS는 인터럽트의 중첩을 금지한다. 중첩 인터럽트는 인터럽트를 처리하는 중에 다른 인터럽트가 발생하는 것이다.
시스템 콜
운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스(API)이다.
대표적인 종류
- fork() : 자식 프로세스 생성
- wait()
- exec() : 프로세스 실행
- pipe()
- open()
- close()
- fork()와 exec()이 분리된 이유
새 프로그램을 실행하기 전에 다양한 설정과 IO redirection, pipe가 가능하기 때문이다.
시스템 콜 호출 과정
- 프로그램 내에서 시스템 콜을 호출
- 레지스터에 시스템 콜 번호를 저장하고 트랩을 건다.
- IDT 테이블을 찾아서 트랩 발생 원인인 시스템 콜 주소로 가서 인터럽트 핸들러로 감
- 시스템 콜 테이블을 찾아서 호출한 시스템 콜에 해당하는 번호를 찾음
- 시스템 콜 핸들러로 넘어가서 시스템 콜 수행
더 자세한 사항은 참고 링크
모드의 전환과 프로세스 교환
모드의 전환
- 모드 전환은 현재 수행 상태에 있는 프로세스의 상태를 바꾸지 않고 수행 가능
- 오버헤드가 거의 없음
- 커널 모드, 유저 모드간의 전환
프로세스 교환
- exit() -> schedule() -> switch() : 문맥 교환(좀비 상태)
- I/O -> schedule() -> switch() : 문맥 교환 (블럭 상태)
- TQ(time quantum) -> schedule() -> switch() : 문맥교환 (준비상태, 스왑 상태)
- 모드 전환에 비해 환경이 크게 변화하고 많은 작업을 요구함.