· 목차
- Interrupt
- Trap(Fault와 System Call)
안녕하세요, 이번에는 Trap(System Call, Fault)와 Interrupt에 대해서 배워보도록 하겠습니다.
우선 CPU는 User Mode(사용자 모드)와 Kernel Mode(커널 모드) 두 가지 모드를 가지고 있습니다.
사용자 모드는 프로그램이 하드웨어 자원(CPU, 메모리, I/O장치 등)에 직접 접근할 수 없고,
운영체제의 도움을 받아서 간접적으로 접근할 수 있습니다.
반대로 커널모드는 운영체제의 특권모드로서 CPU가 모든 하드웨어 자원에 접근할 수 있으며,
메모리, 입출력 장치, 프로세스 관리 등의 중요한 작업이 이루어집니다.
쉽게 이야기해서, 사용자 모드는 제한된 권한으로 일반 프로그램을 실행하는 모드이고,
커널 모드는 운영체제가 실행되며, 하드웨어 자원을 완전히 제어하는 특권모드입니다.
즉, Trap 과 Interrupt는 사용자 프로그램이 운영체제의 커널에 직접 접근하여
하드웨어 자원을 사용할 수 있도록 요청하는 것 입니다.
쉽게 말해서 안정성 등 기타 문제로 인해서 사용자 모드에서 사용되는 프로그램이 직접 하드웨어 자원에 접근할 수 없고,
Trap 및 Intterupt를 이용해서 운영체제를 통해 간접적으로 하드웨어 자원에 접근하는 것을 말합니다.
커널 모드로 전환하는 과정에서 트랩(Trap)을 통해서 전환이 이루어진다고 되어 있는데,
여기에 인터럽트(Interrupt)개념이 추가적으로 존재합니다.
트랩과 인터럽트는 모두 프로세스의 흐름을 중단하고 운영체제의 개입을 요청하는 것은 같지만,
이 둘의 발생 원인과 처리 방식에는 차이가 있습니다.
특징 | 트랩(Trap) | 인터럽트(Interrupt) |
발생 원인 | 소프트웨어적으로 발생 (System Call 또는 예외 처리) |
하드웨어 장치나 외부 신호로 발생 |
예시 | System Call, 0으로 나누기, 잘못된 메모리 접근 |
키보드 입력, 네트워크 패킷 수신, 타이머 완료 |
목적 | System Call 처리 또는 예외 처리 | 외부 이벤트 처리 (입출력 장치와의 상호작용 등) |
발생 시기 | 프로그램 실행 중에 의도적 또는 비의도적으로 발생 |
외부 하드웨어가 CPU의 개입이 필요할 때 발생 |
종류 | 소프트웨어 인터럽트(예: System Call) | 하드웨어 인터럽트 (키보드, 마우스, 타이머 등) |
CPU 모드 전환 | 커널 모드로 전환하여 운영체제가 문제를 처리 |
커널 모드로 전환하여 인터럽트 핸들러 실행 |
재개 | 트랩 처리 후 다시 사용자 프로그램 실행 | 인터럽트 처리 후 중단된 프로그램이 다시 실행됨 |
위와 같은 차이가 있으며, 쉽게 설명해서 트랩(Trap)은 소프트웨어적으로 발생하며,
인터럽트(Interrupt)는 하드웨어적으로 발생합니다.
Interrupt의 실행 과정은 어떻게 진행될까요?
Interrupt
Interrupt의 경우에는 위의 그림과 같은 과정으로 실행됩니다.
왼쪽의 경우는 I/O를 하기 위한 네 가지 단계가 있습니다. 인터럽트는 CPU가 실행중인 작업을 일시 중단하고,
즉각적으로 처리해야 할 외부 하드웨어 장치에 의해 발생하는 이벤트를 처리하는 것 입니다.
인터럽트의 실행 과정은 다음과 같습니다.
1. 인터럽트 발생
하드웨어 장치(키보드 마우스 등)에서 CPU에 인터럽트 요청(Interrupt Request, IRQ) 신호를 보냅니다.
해당 신호는 인터럽트 컨트롤러(Interrupt Controller)를 통해 전달되며, 이 컨트롤러는 여러 하드웨어 장치의 인터럽트를
관리합니다.
2. 현재 실행 중인 작업 중단 및 상태 저장
인터럽트가 발생하면 CPU는 현재 실행 중인 작업을 일시 중단하고, 작업의 현재상태(프로그램 카운터, 레지스터 값 등)를
저장합니다.
상태 저장은 주로 스택에 이루어지며, 이후 인터럽트 처리가 완료된 후 다시 원래 작업으로 복귀하기 위해서 필요합니다.
3. 커널 모드로 전환
4. 인터럽트 벡터 테이블(Interrupt Vector Table)확인
CPU는 인터럽트 벡터 테이블을 참고하여 어떤 장치에서 발생한 인터럽트인지 확인합니다. 인터럽트 벡터 테이블은 각 인터럽트 요청에 대해 인터럽트 서비스 루틴(ISR)의 주소를 저장해둔 테이블로 신호에 대응하는 ISR을 찾고 실행할 준비를 합니다.
5. 인터럽트 서비스 루틴(ISR) 실행
ISR을 실행하고 하드웨어 장치에서 발생한 이벤트를 처리합니다. 예를 들어서 키보드 인터럽트의 경우, ISR은 키보드 입력값을
읽어서 해당 값을 버퍼에 저장합니다.
6. EOI(End of Interrupt)신호 전송
인터럽트 처리 작업이 끝나면, ISR은 EOI 신호를 인터럽트 컨트롤러에 보냅니다. 해당 인터럽트 처리가 완료되었다는 신호이며,
새로운 인터럽트 요청을 처리할 수 있게 됩니다.
7. 저장된 상태 복원 및 작업 재개
CPU 스택에 이전에 저장해뒀던 작업의 상태를 복원하고, 커널모드에서 사용자 모드로 전환하고 중단되었던 작업을 재개 합니다.
위의 그림에서 3번이 인터럽트 발생을 의미하고, 4번은 어떤 인터럽트인지 종류를 결정하는 것 입니다.
Trap(Fault와 System Call)
시작하기에 앞서 System Call에 대해서 정리해보자면 다음과 같습니다.
System Call을 통해서 제공하는 서비스는 무엇이 있을까요?
1. 프로세스 제어(Process Control)
프로세스를 생성하거나 종료하는 등의 작업을 처리합니다. → 예시: fork(), exec(), exit(), wait() 등
2. 파일 관리(File Management)
파일을 생성, 읽기, 쓰기, 삭제 등 파일과 관련된 작업을 처리합니다. → 예시: open(), read(), write(), close() 등
3. 장치 관리(Device Management)
시스템 내 하드웨어 장치(디스크, 프린터 등)에 접근하고 제어하는 작업을 처리합니다. → 예시: ioctl(), read(), write(), open() 등
4. 정보 유지(Information Maintenance)
시스템의 시간, 날짜, 메모리 사용량 등 운영체제 내부 정보에 접근하거나 업데이트 합니다.
→ 예시: getpid(), alarm(), sleep() 등
5. 통신(Communication)
프로세스 간 통신을 처리합니다. 로컬 프로세스 간 또는 네트워크를 통한 프로세스 간 통신에 사용됩니다.
→ 예시: pipe(), shmget(), recv(), send() 등
이제 System Call의 동작과정에 대해서 살펴보자면 아래와 같습니다.
1. 사용자 모드에서 시스템 호출 요청
응용 프로그램이 시스템 호출을 사용하여 운영체제에 요청을 보냅니다. 예를 들어 파일을 열 때 open()시스템 호출을
실행합니다.
2. 커널 모드로 전환
시스템 호출이 발생하면 CPU는 사용자 모드에 커널 모드로 전환합니다. 이때 트랩(Trap)을 통해서 전환이 이루어 집니다.
3. 운영체제의 커널 요청 처리
커널 모드로 전환된 후, 커널은 시스템 호출을 수행하고 요쳥된 작업을 처리합니다.
4. 결과 반환 및 사용자 모드로 전환
작업이 완료되면 커널은 다시 사용자 모드로 전환되고, 요청된 작업의 결과가 사용자 프로그램에 반환됩니다.
추가적으로 위에 트랩의 경우에는 목적을 보면, System Call과 예외 처리라고 되어있는 것을 보실 수 있습니다.
예외처리는 폴트(Fault)라고 불리며예외 처리를 위한 트랩의 일종입니다.
폴트는 프로그램이 잘못된 동작을 하거나, 예기치 못한 상황에 처했을 때 발생하는 예외처리 입니다.
이 경우 CPU는 폴트를 발생시키고, 운영체제의 커널이 개입해 상황을 처리합니다.
그렇다면 폴트의 종류에는 무엇이 있고 어떤 문제로 인해서 발생할까요?
페이지 폴트 (Page Fault) |
페이지 폴트는 프로그램이 요청한 메모리 페이지가 현재 메모리에 없을 때 발생합니다. 또한 페이지 폴트는 시스템이 오류를 복구할 수 있는 예외 상황입니다. |
분할 오류 (Division by Zero) |
프로그램이 0으로 나누는 계산을 시도할 때 발생하는 폴트입니다. 이 경우 운영체제가 이 상황을 처리하고, 프로그램이 종료되거나 오류 메시지를 출력하는 방식으로 대응합니다. |
잘못된 메모리 접근 (Invalid Memory Access) |
프로그램이 허용되지 않은 메모리 영역에 접근하려 할 때 발생합니다. 해당 경우에는 보통 프로그램을 종료시키거나 오류를 처리합니다. |
그러므로 폴트와 System Call의 경우 둘의 차이는, System Call은 의도적으로 운영체제의 서비스를 요청하는
과정에서 발생하는 트랩이며, 폴트는 의도되지 않은 오류나 예외 상황에서 발생하는 트랩입니다.
그렇다면 폴트의 경우에는 실행 과정이 어떻게 다를까요?
모든 실행과정이 똑같지만 발생하는 원인과 주요 목적에 대해서 다르다는 것만 파악하시면 실행과정은 크게 다를 것 없습니다.
특징 | System Call | Fault |
발생 원인 | 프로그램이 운영체제의 기능(시스템 자원) 요청 | 비의도적 발생 (예외 상황, 오류 발생 시) |
주요 목적 | 시스템 자원에 접근 (파일 I/O, 메모리 할당 등) |
프로그램의 오류 복구 또는 종료 |
실행과정은 아래와 같습니다.
1. Fault 발생
2. 현재상태 저장 및 커널 모드 전환
3. 트랩 핸들러 호출
4. Fault 핸들러 실행 및 오류 복구
여기서 페이지 폴트(Page Fault)의 경우 메모리 관리자에게 필요한 페이지를 디스크에 불러오도록 요청하고, 페이지가 메모리에
로드되면 프로그램은 오류가 발생한 위치에서 다시 실행됩니다.
하지만 만약에 잘못된 메모리 접근이나 0으로 나누기와 같은 오류가 발생했을 때, 복구가 불가능 할 수 있으며, 이러한 경우
핸들러는 해당 프로그램을 강제로 종료하고, 오류 메세지를 출력할 수 있습니다.
5. 상태 복원 또는 프로그램 종료
오류 복구 성공 시 CPU에 저장된 현재상태를 복원하여 프로그램을 재개하며 프로그램은 중단된 지점에서 계속 실행됩니다.
오류 복구 실패 시 핸들러는 프로그램을 종료하고, CPU는 더 이상 해당 프로그램을 실행하지 않고, 운영 체제는 오류 메세지를
사용자에게 출력하거나 로그를 남깁니다.
이제 아래의 System Call에 대한 자료와 함께 실행과정을 살펴보면서 마치도록 하겠습니다.
해당 그림을 통해서 트랩 중에서 System Call에서 read()함수를 예로 들어서 동작과정을 설명한 것 입니다.
위에서 간략하게 정리했던 System Call의 실행과정을 자세히 정리해보자면 다음과 같을 것 같네요.
1번에서 read()함수는 사용자 모드에서 실행되며, System Call이기 때문에 트랩을 발생시켜 커널 모드로 전환합니다.
커널 모드를 동작하기 전에는 미리 현재상태(레지스터 값, 프로그램 카운터 등)을 저장합니다. 왜냐하면 나중에 트랩을 처리한 후
다시 사용자 프로그램으로 돌아가서 실행을 재개할 수 있도록 하기 위해서 입니다.
이후에 2번의 trap handler가 실행됩니다. 트랩 벡터 테이블에서 트랩의 종류에 맞는 핸들러를 찾으면, 해당 핸들러가 실행됩니다.
트랩 핸들러가 실행된다는 것은 3번으로 가게 된 것 입니다. 트랩 벡터 테이블이 실행되면서 트랩 핸들러가 찾은 read()에 해당하는
핸들러는 커널 내부에서 실제 읽기 작업을 수행하는 코드입니다. 이 코드를 read() 커널 루틴이라고 합니다.
모든 커널 루틴 코드가 실행되고 난 이후에 1번이 실행되었을 때 저장된 현재상태를 저장해둔 레지스터를 찾아서 기존에 실행되고 있던 사용자 프로그램으로 돌아가서 실행을 재개합니다.
아래의 그림을 참고하면 어떻게 read(fd, buffer, nbytes) 시스템 호출이 실행되는지 번호를 통해서 구분하고 있으니까
아래의 그림을 통해서 자세히 이해하실 수 있으실거에요.
이제 Trap에서 System Call과 Fault에서 동작방식이 어떻게 다른지 둘의 실행과정을 비교해보면
이해하시기가 수월하실 것 같습니다.
지금까지 Trap(System Call 과 Fault) 그리고 Interrupt에 대해서 알아봤습니다.
다음에는 virtual machine에 대해서 간략하게 알아보도록 하겠습니다.
감사합니다.
'전자전기공학 > 운영체제' 카테고리의 다른 글
[Operating System/운영체제][Synchronization] (0) | 2024.10.14 |
---|---|
[Operating System/운영체제][Thread] (4) | 2024.10.08 |
[Operating System/운영체제][Process] (8) | 2024.10.07 |
[Operating System/운영체제][운영체제와 하드웨어] (0) | 2024.09.15 |
[Operating System/운영체제][운영체제란 무엇인가?] (0) | 2024.09.14 |