| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- 이분탐색
- 웹엑스
- MSA
- 카카오페이
- 대출대환서비스
- 카카오웹툰
- 핀테크
- LeetCode
- 삼성페이
- microservice
- FAANG
- 알고리즘
- 플랫폼수수료
- BookReview
- 하이브리드업무
- Algorithm
- 생성형AI
- 간편결제
- AI5
- cloudnative
- IT
- CSRF
- 운영체제
- binarysearch
- 은행IT
- 프로세스상태
- 최단경로문제
- 시큐어코딩가이드
- KAKAO
- 원자성
- Today
- Total
평안하자
[운영체제] 유저모드와 커널모드, 인터럽트와 시스템 콜 본문
이화여자대학교 반효경 운영체제 대학 강의와 유튜브 쉬운코드 운영체제 영상을 참고로 정리한 내용입니다.
자세한 내용은 해당 영상을 참고하시면 도움이 될 것입니다.

User mode와 Kernel mode
User mode
우리가 개발하는 프로그램은 일반적으로 유저 모드에서 실행
Kernel mode
프로그램 실행 중에 인터럽트(interrupt)가 발생하거나, 시스템 콜(system call)을 호출하게 되면 커널 모드로 전환
User mode -> Kernel mode -> User mode 과정
User mode
1. 인터럽트 혹은 시스템 콜 발생
2. 커널 모드로 전환하기 전에 프로그램의 현재 CPU의 상태(레지스터와 program counter)를 저장한다. 이는 인터럽트 서비스 루틴(인터럽트를 처리하는 함수)이 끝난 뒤 다시 상태를 확인하고 원래 작업으로 돌아와야 하기 때문이다.
Kernel mode
3. 커널이 인터럽트나 시스템 콜을 직접 처리한다. CPU 제어권은 사용자 프로그램(프로세스)가 아닌 OS에게 넘어간다. 즉, CPU에서 커널 코드가 실행된다.
4. 처리가 완료되면 중단됐던 프로그램의 CPU 상태를 복원한다. (하나의 프로세스 내의 동작 가정)
5. 다시 CPU 통제권을 프로그램에게 반환한다.
User mode
6. 중단되었던 시점부터 프로그램이 이어서 실행된다.
커널(Kernel)
WHAT?
운영체제의 핵심
시스템의 전반을 관리/감독하는 역할
하드웨어와 관련된 작업을 직접 수행
CPU 제어권이 OS에게 있다
WHY?
시스템을 보호하기 위해!
사용자 프로그램이 함부로 하드웨어를 점유하고 다른 프로세스의 작업을 침해하는 등 전체 컴퓨터 시스템과 보안에 악영향을 끼칠 수 있는 문제를 방지
따라서 시스템 전반과 자원(하드웨어, 소프트웨어) 관리 등은 커널이 담당한다.
HOW?
mode bit
CPU에서 기계어를 실행할 때 운영체제(커널모드)에서 실행하는 것인지, 사용자 프로그램(유저모드)에서 실행하는 것인지 구분하기 위해 사용
커널 모드일 경우, mode bit을 0로 하여 운영체제가 CPU를 통제하고, 특권 명령을 수행할 수 있는 권한을 준다.
유저 모드일 경우, mode bit을 1로 하여 제한된 기계어 명령을 수행할 수 있도록 제약을 준다.
커널 주소 공간

- 이후 다른 글에서 다뤄야겠지만, 프로그램이 실행될 때(프로세스) 독자적인 논리적인 메모리 주소 공간을 가지며 코드, 데이터, 스택으로 이루어져 있다. 물리적인 메모리를 효율적으로 사용하기 위해 프로세스별 논리 메모리의 일부만 실제 메모리에 적재하여 사용한다. (가상메모리 기법)
- 커널도 독자적인 주소 공간을 가지며, 인터럽트 혹은 시스템 콜이 발생할 때 커널 모드의 주소 공간의 코드 영역에 저장된 커널 코드를 호출하며 동작한다.

인터럽트(Interrupt)
- 시스템에서 발생한 다양한 종류의 이벤트 혹은 그런 이벤트를 알리는 메커니즘
- 현대의 운영체제는 인터럽트에 의해 구동됨
- 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에게 알리는 것
하드웨어 인터럽트
I/O, 타이밍, 전원 등 외부적인 요인으로 발생
전원 이상, I/O 작업 완료, 프로세스 타이머(timer) 알림 등
소프트웨어 인터럽트
Trap이라고 부르며, 프로그램 내부에서 잘못된 명령이나 데이터를 사용할 때 발생
0으로 나누기가 발생, 잘못된 메모리 공간에 접근 시도, 명령어를 잘못 사용한 경우 (Exception)
넓은 의미로 System Call도 소프트웨어 인터럽트로 보기도 한다.
인터럽트 발생
인터럽트가 발생하면 CPU에서는 '즉각적으로' 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행
실행 중이던 명령어를 마무리 한 이후 실행
참고로, CPU는 Register내의 program counter의 프로세스 메모리 주소를 증가시키며 프로세스 instruction을 수행해나간다. program counter를 증가시켜 다음 작업을 수행하기 전에 인터럽트가 발생한 것이 있는지 확인한다.
시스템 콜(System call)
프로그램이 OS 커널이 제공하는 서비스를 이용하고 싶을 때 시스템 콜을 호출한다.
시스템 콜이 발생하면 해당 커널 코드가 커널 모드에서 실행된다. (커널 주소 공간 code의 커널 함수의 호출)
프로세스/스레드 관련
파일 I/O 관련 (read, write 등)
소켓 관련
장치(device) 관련
프로세스 통신 관련 등
프로그램 실행 과정 (프로세스 상태도)


- 이처럼 프로그램은 상황에 따라 CPU의 제어권을 사용자 프로그램(유저모드)과 OS(커널모드)에게 적절히 주며 실행된다.
- 프로그램이 실행되기 위해 메모리에 적재되는 순간을 프로세스라고 하는데, 이때 프로세스는 ready 상태에 있다고 한다.
- 메모리에 적재된 프로세스(ready)가 CPU 제어권을 가질 때 실행 상태(running)에 있다고 한다.
- 프로세스가 종료되면 메모리에서 사라진다. (terminated)
- 인터럽트나 시스템 콜 등의 이벤트가 발생하게 되면 실행 중의 프로세스를 대기 상태(waiting / blocked)로 만들고 이벤트가 끝나면 다시 ready 상태로 변경한다.
프로그래밍 언어와 시스템 콜
어떤 프로그램이더라도 하드웨어 혹은 시스템 관련 기능은 반드시 시스템 콜을 통해서만 사용이 가능하다.
그런데 우리는 별도로 시스템 콜 코드를 작성한 기억이 없는데, 어떻게 지금까지 파일 I/O, 네트워크 I/O, 프로세스/스레드 관련 작업을 해왔을까?
이것은 우리가 사용하는 프로그래밍 언어들이 시스템 콜을 포장(wrapping)하여 간접적으로 사용할 수 있도록 제공했기 때문이다.


자바 언어의 Thread 클래스를 예시로 보자.
자바에서 스레드 실행하는 메서드를 살펴보면 start0()이라는 메서드를 호출하는 것을 알 수 있다.
이때 native라는 것이 적혀있는데 native는 주로 운영체제를 뜻한다고 한다.
자바 네이티브 인터페이스를 통해 OS의 시스템콜을 호출하게 된다.
따라서 High Level 프로그래밍 언어는 개발자가 OS의 권한이 필요한 작업을 수행해야 할 때 별도 코드 작성 없이도 사용 가능하게끔 Wrapping해서 제공한다.
프로그래밍 언어가 탄생될 때 그 언어의 철학에 맞게 시스템 콜이 동작되게끔 제공한다. 우리는 그것을 사용하는 것이다.
느낀점

- 나중에 별도의 주제로 다뤄야겠지만, 해당 글의 내용이 동기식/비동기식 I/O, 멀티스레딩과도 연관이 있다고 생각한다. 이는 프로그램의 성능에 큰 영향을 주므로 중요하게 다뤄야한다고 생각한다.
- 프로그래밍 언어 내에서 언어별로 I/O 작업을 포함한 시스템 콜 등을 어떻게 처리하는지를 확인할 필요가 있다고 느꼈다. 내가 개발할 프로그램이 사용 가능한 자원, 기능의 성능 효율성을 고려하여 프로그래밍 언어 내에서 어떻게 해당 작업을 처리하는지 확인해야할 것 같다. 언어와 프레임워크를 먼저 선택하고 프로젝트를 진행하기 보다는 그 이전에 운영체제와 언어의 특성을 파악하고 어떻게 개발해나갈 것인지 결정하는 것이 좋을 것 같다.
- 이래서 CS가 중요하다고 하는걸까? CS를 더 공부해야겠다는 자기 반성을 하게 된다.. 앞으로 프로젝트를 할 때 이러한 고민을 더 깊고 논리적으로 잘 할 수 있는 개발자로 성장하고 싶다!
'OS' 카테고리의 다른 글
| [운영체제] 데드락 (Deadlock) (0) | 2024.03.31 |
|---|---|
| [운영체제] 프로세스 동기화 (Process Synchronization) (0) | 2024.03.30 |
| [운영체제] CPU 스케쥴링 (0) | 2024.03.29 |
| [운영체제] 프로세스 관리 (0) | 2024.03.29 |
| [운영체제] 프로세스와 스레드, 멀티스레딩과 멀티프로세싱 (0) | 2024.03.28 |