커널 (Kernel)
커널은 운영체제의 핵심 부분으로, 시스템 하드웨어와 사용자 응용 프로그램 간의 중개자 역할을 한다.
- 역할:
- 시스템 자원 관리: CPU 스케줄링, 메모리 관리, 파일 시스템 관리, I/O 장치 관리 등을 통해 시스템 자원을 효율적으로 관리한다.
- 보안 및 보호: 프로그램이 하드웨어 자원에 직접 접근하지 못하도록 보호하고, 시스템의 무결성을 유지한다.
- 프로세스 관리: 프로세스 생성, 스케줄링, 동기화 및 통신을 처리하며, 각 프로세스가 서로 간섭 없이 실행될 수 있도록 관리한다.
- 인터페이스 제공: 시스템 콜을 통해 응용 프로그램이 커널의 기능을 사용할 수 있는 인터페이스를 제공한다.
유저 모드 (User Mode)
유저 모드는 일반 사용자 프로그램이 실행되는 보호된 실행 모드이다. 이 모드에서는 프로그램이 시스템의 핵심 자원에 직접 접근할 수 없으며, 오류가 발생해도 시스템 전체에 영향을 미치지 않는다.
- 제한된 접근: 유저 모드에서 실행되는 프로그램은 메모리와 CPU 같은 하드웨어 자원에 제한적으로 접근한다.
- 시스템 호출 필요: 하드웨어 자원에 대한 작업을 수행하려면, 시스템 콜을 통해 커널 모드의 서비스를 요청해야 한다.
- 전환: 프로그램 실행 중 인터럽트가 발생하거나 시스템 콜이 호출되면 유저 모드에서 커널 모드로 전환된다. 전환 과정은 운영체제가 안전하게 관리하며, 커널 모드가 끝나면 다시 유저 모드로 돌아간다.
커널 모드 (Kernel Mode)
커널 모드는 운영체제가 전체 시스템을 제어하는 특권 모드이다. 이 모드에서는 CPU가 모든 명령어를 실행할 수 있고, 메모리, I/O 장치, 네트워크 인터페이스 등 모든 시스템 자원에 접근할 수 있다.
- CPU 상태 저장: 커널 모드로 전환되면, 현재 실행 중인 프로그램의 상태(CPU 레지스터 값, 프로그램 카운터 등)를 저장하여 이후 복원할 수 있도록 한다.
- 핵심 작업 처리: 인터럽트와 시스템 콜을 처리한다. 커널 모드에서 실행되는 코드는 매우 중요한 작업(예: 프로세스 관리, 메모리 관리, I/O 제어 등)을 수행하며, 시스템의 안정성과 보안을 유지한다.
- 전환 후 복원: 작업이 완료되면, 저장된 CPU 상태를 복원하고 유저 모드로 돌아가 중단된 프로그램이 계속 실행되도록 한다.
커널 모드의 필요성
- 시스템 보호: 커널 모드를 사용하여 프로그램이 하드웨어 자원에 직접 접근하는 것을 막음으로써 시스템을 보호한다. 이를 통해 시스템의 안정성과 보안을 보장한다.
- 자원 관리: 커널 모드는 모든 시스템 자원을 중앙에서 관리하므로, 자원의 충돌이나 비효율적 사용을 방지할 수 있다.
- 오류 격리: 오류가 발생했을 때, 유저 모드에서는 시스템 전체가 중단되는 것을 방지하고, 커널 모드에서만 필요한 작업을 수행할 수 있도록 한다.
인터럽트 (Interrupt)
인터럽트는 시스템에서 발생한 예외적 상황을 CPU에 알리는 메커니즘이다. 인터럽트는 하드웨어나 소프트웨어에서 발생할 수 있으며, CPU는 이를 처리하기 위해 현재 작업을 중단하고 인터럽트 핸들러로 제어를 넘긴다.
- 종류:
- 하드웨어 인터럽트: I/O 장치에서 발생하는 인터럽트로, 예를 들어 키보드 입력, 디스크 I/O 완료, 네트워크 패킷 수신 등이 있다.
- 소프트웨어 인터럽트: 프로그램 내부에서 발생하는 인터럽트로, 예를 들어 0으로 나누기 오류, 잘못된 메모리 접근, 시스템 콜 등이 있다.
- 작동 방식: 인터럽트가 발생하면 CPU는 현재 실행 중인 작업을 중단하고, 커널 모드로 전환하여 인터럽트를 처리한다. 인터럽트 처리 후, 중단된 작업이 복원되고 다시 유저 모드로 돌아간다.
시스템 콜 (System Call)
시스템 콜은 사용자 프로그램이 운영체제의 커널이 제공하는 기능을 사용할 수 있도록 하는 인터페이스이다. 시스템 콜은 사용자 모드에서 커널 모드로의 전환을 트리거하여, 커널이 해당 작업을 처리하도록 요청한다.
- 종류:
- 프로세스 관리: 프로세스 생성, 종료, 대기, 스레드 관리 등을 포함한다.
- 파일 관리: 파일 생성, 열기, 읽기, 쓰기, 닫기 등을 처리한다.
- 디바이스 관리: I/O 장치에 대한 접근과 제어를 처리한다.
- 정보 관리: 시스템 상태 정보나 설정을 가져오거나 변경한다.
- 통신: 프로세스 간의 데이터 교환을 위해 사용된다. (예: 소켓 통신, 파이프)
파일 read 예제
상세 설명 | |
시작 상태 | - 두 개의 프로세스가 존재함: t1과 t2. - t1은 running 상태에서 CPU를 점유하고 있고, t2는 ready 상태에서 대기 중이다. |
시스템 콜 발생 | - t1이 파일을 읽기 위해 read 시스템 콜을 호출함. - 이 시점에서 t1은 유저 모드에서 커널 모드로 전환된다. - t1의 현재 CPU 상태를 저장하고, 커널은 파일을 읽기 위한 준비를 시작한다. |
프로세스 상태 전환 | - t1은 I/O 작업이 완료될 때까지 waiting 상태로 전환된다. - CPU는 다른 작업을 수행할 수 있도록 t2를 running 상태로 전환하여 실행을 시작한다. |
커널 모드 복귀 | - 커널이 파일 읽기 작업을 준비한 후, 커널 모드에서 유저 모드로 전환된다. - t2가 CPU를 점유하고, 실행을 계속한다. |
I/O 완료 및 인터럽트 발생 | - SSD에서 파일을 읽는 작업이 완료되면, 인터럽트가 발생하여 CPU에 알린다. - 인터럽트를 처리하기 위해 유저 모드에서 다시 커널 모드로 전환된다. |
프로세스 전환 | - t2의 CPU 상태를 저장하고, t1을 ready 상태로 전환한다. - 이후, t2의 CPU 상태를 복원하고, 커널 모드에서 유저 모드로 전환된다. - t2는 작업을 이어서 시작한다. |
타이머 인터럽트 | - t2의 할당된 타임 퀀텀이 다 되면, 타이머 인터럽트가 발생한다. - 인터럽트에 의해 다시 유저 모드에서 커널 모드로 전환된다. - t2의 CPU 상태를 저장하고, t2를 ready 상태로 전환하며, t1을 running 상태로 전환한다. - t1의 CPU 상태를 복원한 후, 커널 모드에서 유저 모드로 전환된다. |
t1 작업 재개 | t1은 파일에서 데이터를 읽어오는 작업을 수행하며, 계속해서 실행된다. |
프로그래밍 언어와 시스템 콜
- 하드웨어와 시스템 관련 기능은 모든 프로그램이 직접적으로 접근할 수 없고, 반드시 운영 체제의 시스템 콜을 통해서만 사용 가능하다. 시스템 콜은 운영 체제의 핵심 기능을 프로그램이 사용할 수 있도록 하는 인터페이스를 제공한다.
- 프로그래밍 언어는 이러한 시스템 콜을 직접적으로 호출하는 대신, 시스템 콜을 래핑하여 간접적으로 사용할 수 있는 추상화된 API를 제공한다. 이를 통해 개발자는 복잡한 시스템 콜의 세부 사항을 신경 쓰지 않고도 필요한 기능을 구현할 수 있다.
- 예를 들어, 자바의 Thread 클래스는 스레드를 생성하고 관리하는 기능을 제공한다. 자바의 Thread 클래스의 start() 메서드는 내부적으로 private native void start0();라는 네이티브 메서드를 호출한다. 이 네이티브 메서드는 자바와 운영 체제 간의 상호작용을 위해 JNI(Java Native Interface)를 사용한다.
- JNI는 자바 코드가 네이티브 코드(즉, C 또는 C++로 작성된 코드)와 상호작용할 수 있도록 해주는 인터페이스이다. start0() 메서드는 JNI를 통해 운영 체제의 시스템 콜을 호출하여 스레드를 생성한다.
- 리눅스와 같은 운영 체제에서는, 자바의 start0() 메서드가 clone이라는 시스템 콜을 호출한다. clone 시스템 콜은 새로운 스레드를 생성하거나 프로세스를 복제하는 기능을 제공하며, 자바의 스레드 생성과 관련된 작업을 수행하는 데 사용된다.
728x90
'CS' 카테고리의 다른 글
[CS] Blocking I/O & Non-Blocking I/O (0) | 2024.08.12 |
---|---|
[CS] 스레드의 종류 (0) | 2024.08.12 |
[CS] CPU Scheduler & Dispatcher (1) | 2024.08.11 |
[CS] 프로세스/스레드 상태 변화 (0) | 2024.08.11 |
[CS] Deadlock (0) | 2024.08.11 |