본문 바로가기

Java

사용자 모드와 커널 모드

컴퓨터의 구성

컴퓨터 시스템은 크게 하드웨어(Hardware)와 소프트웨어(Software) 두 가지로 나눌 수 있다. 하드웨어는 물리적으로 컴퓨터 시스템을 구성하고 있는 기계 장치이고 소프트웨어는 논리적으로 컴퓨터 시스템을 구성하고 하드웨어들을 관리하고 동작시키는 역할을한다. 소프트웨어는 명령어들의 집합으로 볼 수 있으며 일반적으로 그것들을 프로그램이라고 말할 수 있다.

소프트웨어는 딱 2가지로 구분할 수 있다. USER 프로그램과 OS 프로그램 두가지이다.

 

 

운영체제의 핵심 "커널"

OS 프로그램은 사용자에게 GUI 제공해서 사용자와 컴퓨터 간에 상호작용을 쉽게 처리할 수 있도록 도와주며 다양한 소프트웨어 응용프로그램 워드프로세서, 게임, 데이터베이스 관리 시스템, 파일 장치 관리 등등 많은 서비스를 지원한다. 또한 스마트폰도 사용자에게 제공하는 서비스 종류는 다양하지만, 그중에서도 전화, 문자, 인터넷 기능처럼 가장 핵심적인 서비스가 있다. 마찬가지로 운영체제가 제공하는 서비스 종류는 다양하지만, 그중에서도 가장 핵심적인 서비스들이 있다.

 

자원에 접근하고 조작하는 기능 즉, 프로세스 관리, 메모리 관리, 디바이스 관리나 응용 프로그램이 올바르고 안전하게 실행되게 하는 기능 등이 운영체제의 핵심 서비스에 속한다. 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널kernel이라고 한다.

 

이중 모드란?

운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 만약 응용 프로그램이 CPU, 메모리, 하드 디스크 등에 마음대로 접근하고 조작할 수 있다면 자원이 무질서하게 관리될 것이고, 응용 프로그램이 조금만 실수해도 컴퓨터 전체에 큰 악영향을 끼칠 수 있다.

그래서 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호하고 이를 이중모드라고 한다.

CPU 에서는 커널모드와 사용자 모드를 구분해서 동작을 수행한다.

사용자 모드(User 프로그램)로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공 받기 위한 요청을 시스템 호출system call(시스템 콜)이라고 한다. 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공 받을 수 있다.

즉, 응용 프로그램이 하드 디스크에 데이터를 저장하려 한다면 응용 프로그램은 하드 디스크에 접근해야 한다. 하지만 사용자 모드로 실행되는 동안에는 자원(하드 디스크)에 접근할 수 없기에 커널 모드로 전환해야 한다. 이때 운영체제 서비스를 제공 받기 위한 요청을 시스템 콜을 통해서 사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공 받을 수 있다.

 

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 이용한다. 그 과정에서 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다.

 

 

💡 시스템 호출
시스템 호출은 사용자 모드에서 실행 중인 프로그램이 커널 모드의 운영체제 서비스를 요청할 때 사용하는 메커니즘이다. 예를 들어, 파일을 읽거나 쓰고, 네트워크 통신을 수행하고, 프로세스를 생성하거나 종료하는 등의 작업을 수행하기 위해 필요하다. 이는 프로그램이 운영체제에게 특정 작업을 대신 처리해달라고 요청하는 방식이다. 시스템 호출은 소프트웨어 인터럽트의 한 형태로 구현될 수 있으며, 사용자 모드에서 커널 모드로 컨텍스트를 전환한다.

💡 인터럽트 (Interrupt)는 신호
인터럽트는 하드웨어 또는 소프트웨어에 의해 발생할 수 있는 신호로, 현재 프로세서가 수행 중인 작업을 잠시 중지하고, 긴급하게 처리해야 할 작업을 처리하기 위해 발생한다.

인터럽트는 컴퓨터 시스템에서 매우 중요한 개념으로, 실행 중인 프로그램의 일반적인 흐름을 일시적으로 중지시켜 특정 작업(주로 입출력 작업)을 처리한 뒤 다시 원래의 프로그램 실행으로 돌아가게 하는 메커니즘을 말한다.


💡차이점
발생 원인: 시스템 호출은 프로그램이 명시적으로 운영체제의 서비스를 요청할 때 발생한다. 반면, 인터럽트는 예측 가능하거나 예측 불가능한 다양한 이유로 발생할 수 있으며, 항상 명시적인 요청에 의한 것은 아니다.

처리 방식: 시스템 호출은 사용자 프로그램과 운영체제 간의 인터페이스로 사용되며, 주로 보안이나 자원 접근 제어를 위해 커널 모드로의 전환을 포함한다. 인터럽트는 프로세서가 즉시 현재 작업을 중지하고 인터럽트 처리 루틴을 실행하도록 한다.

 


 

	try {
		Thread.sleep(10);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}

InterruptedException은 자바에서 스레드가 대기 상태(예: sleep, wait 등)에 있을 때 다른 스레드가 현재 스레드를 인터럽트하면 발생하는 예외이다. 즉 하나의 스레드가 잠들어 있다가 의도치 않게 다른 스레드가 인터럽트를 발생시켜서 계속 대기 상태가 되어야 하는 스레드가 깨어나게 되다면 적절한 예외처리를 통해서 스레드 자원을 종료 시킨다든지 다른 작업을 수행 시킬 수 있다.

728x90