유저 모드와 커널 모드
프로그램이 실행되다가 유저 모드에서 커널 모드로 바뀌고 커널 모드에서 유저 모드로 바뀌기도 한다.
간단한 예를 통해서 유저 모드와 커널 모드를 살펴보자.
User mode
- 우리가 개발하는 프로그램(작성한 코드)은 일반적으로 유저 모드에서 실행된다.
- 프로그램 실행 중에 인터럽트(interrupt)가 발생하거나 시스템 콜(system call)을 호출하게 되면 커널 모드로 전환
Kernel mode
- 나중에 이어서 실행하기 위해 프로그램의 현재 CPU 상태를 저장함
- 커널이 언터럽트나 시스템 콜을 직접 처리
- 즉, CPU에서 커널 코드가 실행됨
- 모든 처리가 완료되면 중단됐던 프로그램의 CPU 상태를 복원
- CPU 상태를 복원하게 되면 다시 통제권을 프로그램에게 반환
커널(kernel)
- 운영체제의 핵심이다.
- 시스템의 전반을 관리/감독하는 역할
- 하드웨어와 관련된 작업을 직접 수행한다.
커널(kernel) 모드를 만든 이유?
시스템을 보호하기 위해서이다. 사용자가 실행하는 프로그램은 자원에 직접 접근할 수 있을까?
아니다. 응용 프로그램은 자원에 직접 접근은 위험하다.
운영체제는 응용 프로그램들이 자원에 접근하려 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호(문지기 역할)한다.
인터럽트(interrupt)
시스템에서 발생한 다양한 종류의 이벤트 혹은 그런 이벤트를 알리는 매커니즘
인터럽트 종류
- 하드웨어 인터럽트
- 소프트웨어 인터럽트
1. 하드웨어 인터럽트
외부 장치가 CPU에 인터럽트를 요청하여 발생한다.
예시: 키보드 입력, 디스크 작업 완료, 네트워크 패킷 수신 등.
하드웨어 인터럽트의 종류 | 설명 | 예시 |
I/O 인터럽트 | 입력/출력 장치가 작업 완료를 알리기 위해 발생 | 키보드 입력, 마우스 클릭 |
타이머 인터럽트 | 일정 시간 간격으로 CPU에 발생하여 프로세스 스케줄링에 사용 | CPU 타이머 |
전원 실패 인터럽트 | 전원 공급 문제를 감지하고 이를 알리기 위해 발생 | UPS 장치에서 전원 경고 발생 |
하드웨어 오류 인터럽트 | 하드웨어 장치에서 오류가 발생했을 때 발생 | 메모리 오류, 디스크 오류 |
네트워크 인터럽트 | 네트워크 장치가 데이터 패킷을 수신했을 때 발생 | 네트워크 카드에서의 데이터 수신 |
2. 소프트웨어 인터럽트
소프트웨어에 의해 명시적으로 생성된 인터럽트이다.
예시: 시스템 호출, 예외(Exception), 프로그램 오류 등.
소프트웨어 인터럽트의 종류 | 설명 | 예시 |
시스템 호출 (System Call) | 사용자 프로세스가 운영체제 기능을 요청할 때 발생 | 파일 읽기/쓰기, 프로세스 생성 |
예외(Exceptions) | 프로그램 실행 중 오류나 특별한 상황이 발생할 때 발생 | 0으로 나누기, 페이지 폴트 |
프로그램 오류 | 프로그램이 잘못된 명령어를 실행하거나 메모리 접근 위반 시 발생 | Segmentation Fault, Overflow |
Trap | 사용자 모드에서 커널 모드로 전환할 때 발생 | 시스템 호출 |
인터럽트가 발생하면?
CPU에서는 즉각적으로 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행한다.
즉, 커널 모드에서 커널이 인터럽트를 처리하기 위해 주도적으로 CPU에서 실행한다. 인터럽트가 언제든지 발생할 수 있기 때문에 인터럽트가 발생한 순간 실행 중인 사용자의 프로그램의 실행 중인 명령어까지는 마무리 한 후에 인터럽트 처리를 위해 커널이 통제권을 넘겨받아 관련 처리를 하게 된다.
시스템 콜
프로그램이 OS 커널이 제공하는 서비스를 이용하고 싶을 때 시스템 콜을 통해 실행. 일반적으로 시스템 자원에 접근하거나 하드웨어 작업을 수행할 때 사용되며, 운영체제와 사용자 프로그램 간의 인터페이스 역할을 한다. 시스템 콜이 발생하면 해당 커널 코드
(시스템 콜에 대응하는 각각의 커널 코드가 있다) 가 커널 모드에서 실행된다.
시스템 콜의 종류
- 프로세스 제어(Process Control): 프로세스의 생성, 종료, 상태 변경 등과 관련된 시스템 콜
- 파일 관리(File Management): 파일의 생성, 읽기, 쓰기, 삭제 등과 관련된 시스템 콜
- 장치 관리(Device Management): 입출력 장치의 제어와 관련된 시스템 콜
- 통신(Communication): 프로세스 간 통신(IPC)과 관련된 시스템 콜
- 메모리 관리(Memory Management): 메모리 할당, 해제와 관련된 시스템 콜
- 정보 유지 및 관리(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 |