본문 바로가기

CS

[CS] 인터럽트와 시스템 콜

유저 모드와 커널 모드

프로그램이 실행되다가 유저 모드에서 커널 모드로 바뀌고 커널 모드에서 유저 모드로 바뀌기도 한다.

간단한 예를 통해서 유저 모드와 커널 모드를 살펴보자.

 

User mode

  • 우리가 개발하는 프로그램(작성한 코드)은 일반적으로 유저 모드에서 실행된다.
  • 프로그램 실행 중에 인터럽트(interrupt)가 발생하거나 시스템 콜(system call)을 호출하게 되면 커널 모드로 전환

Kernel mode

  • 나중에 이어서 실행하기 위해 프로그램의 현재 CPU 상태를 저장함
  • 커널이 언터럽트나 시스템 콜을 직접 처리
  • 즉, CPU에서 커널 코드가 실행됨
  • 모든 처리가 완료되면 중단됐던 프로그램의 CPU 상태를 복원
  • CPU 상태를 복원하게 되면 다시 통제권을 프로그램에게 반환

커널(kernel)

  • 운영체제의 핵심이다.
  • 시스템의 전반을 관리/감독하는 역할
  • 하드웨어와 관련된 작업을 직접 수행한다.

 

커널(kernel) 모드를 만든 이유?

시스템을 보호하기 위해서이다. 사용자가 실행하는 프로그램은 자원에 직접 접근할 수 있을까?

아니다. 응용 프로그램은 자원에 직접 접근은 위험하다.

운영체제는 응용 프로그램들이 자원에 접근하려 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호(문지기 역할)한다.


인터럽트(interrupt)

시스템에서 발생한 다양한 종류의 이벤트 혹은 그런 이벤트를 알리는 매커니즘

 

인터럽트 종류

  1. 하드웨어 인터럽트
  2. 소프트웨어 인터럽트

1. 하드웨어 인터럽트

외부 장치가 CPU에 인터럽트를 요청하여 발생한다.

예시: 키보드 입력, 디스크 작업 완료, 네트워크 패킷 수신 등.

하드웨어 인터럽트의 종류 설명 예시
I/O 인터럽트 입력/출력 장치가 작업 완료를 알리기 위해 발생 키보드 입력, 마우스 클릭
타이머 인터럽트 일정 시간 간격으로 CPU에 발생하여 프로세스 스케줄링에 사용 CPU 타이머
전원 실패 인터럽트 전원 공급 문제를 감지하고 이를 알리기 위해 발생 UPS 장치에서 전원 경고 발생
하드웨어 오류 인터럽트 하드웨어 장치에서 오류가 발생했을 때 발생 메모리 오류, 디스크 오류
네트워크 인터럽트 네트워크 장치가 데이터 패킷을 수신했을 때 발생 네트워크 카드에서의 데이터 수신

 

2. 소프트웨어 인터럽트

소프트웨어에 의해 명시적으로 생성된 인터럽트이다.
예시: 시스템 호출, 예외(Exception), 프로그램 오류 등.

소프트웨어 인터럽트의 종류 설명 예시
시스템 호출 (System Call) 사용자 프로세스가 운영체제 기능을 요청할 때 발생 파일 읽기/쓰기, 프로세스 생성
예외(Exceptions) 프로그램 실행 중 오류나 특별한 상황이 발생할 때 발생 0으로 나누기, 페이지 폴트
프로그램 오류 프로그램이 잘못된 명령어를 실행하거나 메모리 접근 위반 시 발생 Segmentation Fault, Overflow
Trap 사용자 모드에서 커널 모드로 전환할 때 발생 시스템 호출

 

 

인터럽트가 발생하면?

CPU에서는 즉각적으로 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행한다.

즉, 커널 모드에서 커널이 인터럽트를 처리하기 위해 주도적으로 CPU에서 실행한다. 인터럽트가 언제든지 발생할 수 있기 때문에 인터럽트가 발생한 순간 실행 중인 사용자의 프로그램의 실행 중인 명령어까지는 마무리 한 후에 인터럽트 처리를 위해 커널이 통제권을 넘겨받아 관련 처리를 하게 된다.


시스템 콜

프로그램이 OS 커널이 제공하는 서비스를 이용하고 싶을 때 시스템 콜을 통해 실행. 일반적으로 시스템 자원에 접근하거나 하드웨어 작업을 수행할 때 사용되며, 운영체제와 사용자 프로그램 간의 인터페이스 역할을 한다. 시스템 콜이 발생하면 해당 커널 코드

(시스템 콜에 대응하는 각각의 커널 코드가 있다) 가 커널 모드에서 실행된다. 

 

시스템 콜의 종류

  1. 프로세스 제어(Process Control): 프로세스의 생성, 종료, 상태 변경 등과 관련된 시스템 콜
  2. 파일 관리(File Management): 파일의 생성, 읽기, 쓰기, 삭제 등과 관련된 시스템 콜
  3. 장치 관리(Device Management): 입출력 장치의 제어와 관련된 시스템 콜
  4. 통신(Communication): 프로세스 간 통신(IPC)과 관련된 시스템 콜
  5. 메모리 관리(Memory Management): 메모리 할당, 해제와 관련된 시스템 콜
  6. 정보 유지 및 관리(Information Maintenance): 시스템이나 프로세스 정보를 얻기 위한 시스템 콜
분류 설명 예시
프로세스 제어 프로세스 생성, 종료, 대기, 신호 처리 fork(), exec(), exit()
파일 관리 파일의 생성, 읽기, 쓰기, 삭제 open(), read(), write()
장치 관리 I/O 장치의 제어 및 데이터 전송 ioctl(), read(), write()
통신 프로세스 간 데이터 교환 및 네트워크 통신 pipe(), socket(), send()
메모리 관리 메모리 할당, 해제, 매핑 mmap(), brk(), sbrk()
정보 유지 및 관리 시스템 및 프로세스 정보 조회 time(), uname(), getuid() 

 

 

프로그래밍 언어와 시스템 콜

하드웨어 혹은 시스템 관련 기능은 어떤 프로그램이라도 반드시 시스템 콜을 통해서만 사용 가능하다.

그런데 보통은 개발을할 때 직접 OS 시스템 콜을 사용한 적이 없을 것이다.

그럼에도 불구하고 지금까지 파일 I/O, 네트워크 I/O, 프로세스/ 스레드 관련 작업을 해온 경험이 있을 것이다.

이게 어떻게 가능한 것일까? 이것은 우리가 사용하는 프로그래밍 언어들이 시스템 콜을 포장(wrapping) 하여 간접적으로

사용할 수 있도록 제공했기 때문이다.


 

'CS' 카테고리의 다른 글

[CS] 스레드의 종류  (0) 2024.12.10
[CS] 동기와 비동기  (0) 2024.12.05
[CS] CPU bound, IO bound  (1) 2024.12.03
[CS] 동기화 기법  (1) 2024.11.28
[CS] 병행성과 병렬성  (0) 2024.11.06