본문 바로가기

CS 과목(CS科目)/운영체제(OS)

인터럽트(interrupt), 시스템 콜(System Call), 유저 모드(user mode), 커널 모드(kernel mode)

User mode : user mode에서 우리가 작성/개발하는 프로그램이 실행된다.

Kernel  : OS의 핵심으로서, 시스템의 전반을 관리/감독하는 역할을 하며, 하드웨어와 관련된 작업을 직접 수행. 

user mode -> kernal mode

우리가 작성/개발하는 프로그램은 일반적으로 user mode에서 실행이 된다.  

프로그램 실행 중에 인터럽트(interrupt)가 발생하거나 시스템 콜(system call)을 호출하게 되면 제어권(control)을 OS에게 주며 kernel mode로 전환.

kernel mode로 전환을 하게 되면, OS가 프로그램의 현재 CPU 상태를 저장을 한다. 

(Kernel mode : 인터럽트, 시스템 콜을 직접 처리. 즉 CPU에서 인터럽트, 시스템 콜 관련 커널 코드가 실행됨)

kernel mode -> user mode 

위 처리가 완료가 되면, 그 이전에 중단이 되었던 프로세스/스레드를 실행시키기 위해서 프로세스/스레드의 CPU 상태를

복원한다.

그 다음 다시 제어권(control)을 프로그램에게 반환하여 다시 user mode로 돌아와서 중단됐던 프로그램이 다시 실행됨.

 

Kernel mode를 만든 이유 : 시스템을 보호하기 위해서!!!!

Kernel mode를 만들지 않게 되면 실행 중인 프로그램이 하드웨어를 점유해서 사용을 해버리고, 또 그러다가 다른 프로세

스에게도 악영향을 끼치지 되며 등 전체 시스템이 붕괴될 수가 있기 때문에 

시스템 전반적인 부분 그리고 하드웨어와 관련된 부분은 Kernel이 직접 수행하도록 맡기고, 

개발자들은 프로그램이 Kernel을 통해서 실행되게 함으로써, 시스템이 안정적으로 운영될게 해야 한다. 

 

인터럽트(interrupt) : 시스템에서 발생한 다양한 종류의 이벤트 or 그런 이벤트를 알리는 메커니즘

-> 인터럽트가 발생하면 CPU에서 즉각적으로 인터럽트 처리를 위해 cpu에서 Kernel Code를 Kernel Mode에서 실행

대표적인 인터럽트의 종류 5가지

1. 전원(power)에 문제가 생겼을 때!

2. I/O 작업이 완료됐을 때

3. 시간이 다 됐을 때(TIMER 관련..)

4. 0으로 나누었을 때

5. 잘못된 메모리 공간에 접근을 시도할 때

-> 4,5는 프로그래밍 LEVEL에서 일어나는 인터럽트로서 Trap이라고 불리기도 한다. 

 

시스템 콜(System call) : 프로그램/개발자가 OS Kernel이 제공하는 서비스를 이용하고 싶을 때, 시스템 콜을 사용하여 간

접적으로 사용

1.프로세스/스레드 관련 : 프로세스/스레드 생성, 해제 등등

2. 파일 I/O 관련 : 파일을 읽고/쓰기 등등

3. 소켓 관련

4. 장치(DEVICE) 관련

5. 프로세스 통신 관련

리눅스의 시스템 콜

 

현재, t1이 running state이고, t2가 Ready Queue에 있다고 하자. 

이때 t1이 파일을 read하려고 할 때, t1의 OS level에서의 state와 mode 변화를 살펴 보자. 

 

user mode에서는 오로지 프로세스/스레드의 실행만이 일어나고,

인터럽트 or 시스템 콜 등이 발생을 하면, 제어권(control)이 OS Kernel로 넘어가서 해당 Kernel Code가 CPU에서 실행이

된다. 

즉, Kernel Mode에서는 주로 user mode에서 실행된 프로세스/스레드가 CPU에서 실행이 될 수 있게 문맥 교환을 발생시

거나, 프로세스/스레드의 State를 바꾸는 역할을 한다. 

 

CPU의 모드

User mode : 프로세스/스레드를 실행할 때의 모드

Kernel mode : Kernel Code를 실행할 때의 모드.

 

 

 

프로그래밍 언어와 시스테 콜의 관계

하드웨어 or 시스템 관련 기능은 어떤 프로그램이라도 시스템 콜로만 사용이 가능하다.

그러나 보통 우리는 개발할 떄, 직접 OS 시스템 콜을 사용한 적이 없다. 

그럼에도 우리는 지금까지 파일 I/O, 네트워크 I/O, 프로세스/스레드 관련 작업을 해왔습니다. 

과연 이것들이 어떻게 해서 가능했던 것일까??

-> 이것은 우리가 사용하는 프로그래밍 언어들이 시스테 콜을 Wrapping하여 간접적으로 사용할 수 있도록 제공했기 때문이다.

ex)

Thread thread = new Thread();

thread.start(); // 이 안에 시스템 콜(start0)이 wrapping돼 있다. 

보통 native라는 키워드는 OS를 의미한다. 

우리가 작성/개발한 프로그램은 OS Kernel을 통해서만 컴퓨터(메모리,cpu, devices)에서 실행이 된다.