[OS] 트랩과 시스템콜

Elmo·2022년 11월 7일
1

인터럽트와 트랩

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() : 문맥교환 (준비상태, 스왑 상태)
  • 모드 전환에 비해 환경이 크게 변화하고 많은 작업을 요구함.
profile
엘모는 즐거워

0개의 댓글