User mode & Kernel mode
User mode
- 우리가 개발하는 프로그램(코드)은 일반적으로 유저 모드에서 실행
- 프로그램 실행 중에 인터럽트(interrupt)가 발생하거나 시스템 콜(system call)을 호출하게 되면 유저 모드에서 커널 모드로 전환
→ Kernel mode
- 실행중이던 프로그램의 현재 CPU 상태를 저장함.
- 커널이 인터럽트나 시스템 콜을 직접 처리. 즉, CPU에서 커널 코드가 실행됨
- 처리가 완료되면 중단됐던 프로그램의 CPU 상태를 복원.
- 다시 통제권을 프로그램에게 반환하고, User mode로 전환
→ User mode
- 중단되었던 프로그램이 이어서 실행됨
커널(kernel)
- 운영체제의 핵심
- 시스템의 전반을 관리/감독하는 역할
- 하드웨어와 관련된 작업을 직접 수행
💡 커널 모드가 존재하는 이유는? 시스템을 보호하기 위해. 우리가 작성한 코드가 커널을 통해 시스템 기능, 하드웨어를 사용할 수 있게 함으로써 시스템이 안정적으로 작동할 수 있게 보호하는 것이다.
Interrupt
- 시스템에서 발생한 다양한 종류의 이벤트 혹은 그런 이벤트를 알리는 메커니즘
- CPU와 I/O device가 통신하는 경우에도 인터럽트 발생
- 하드웨어가 interrupt를 언제든지 trigger할 수 있다.
- System bus를 통해 CPU에 시그널을 보낸다.
인터럽트의 종류
- 외부 인터럽트
- 전원에 문제가 생겼을 때: 말그대로 정전, 파워 이상 등
- 기계 착오 인터럽트: CPU의 기능적인 오류
- 외부 신호 인터럽트
- 타이머에 의한 인터럽트: Preemptive 개념. 자원에 할당된 시간이 다 끝난 경우
- 키보드로 인터럽트 키를 누른 경우: 대표적으로 control+alt+delete, 절전모드 등
- 외부장치로부터 인터럽트 요청이 있는 경우: I/O 인터럽트 아님
- 입출력 인터럽트(I/O작업)
- 입출력 장치가 데이터 전송을 요구하거나 저놋잉 끝나 다음 동작이 수행되어야 할 경우
- 컴퓨터의 핵심은 CPU. RAM과 밀접하게 연관이 되어 있다. 예전에는 cpu가 ram을 직접 통제하였으나 지금은 간접 통제(메모리 매니저 - 입출력 관리자)하는 경우가 많음
- 메모리 매니저: 브릿지 칩셋
- 메인보드의 메모리 매니저가 안좋으면 cpu랑 ram이 좋아도 느려짐. I/O management → 예전에는 North Bridge랑 South Bridge에서 나눠서 관리 → Intel이 열받아서 기능 다 가져옴
- 컴퓨터의 핵심은 CPU. RAM과 밀접하게 연관이 되어 있다. 예전에는 cpu가 ram을 직접 통제하였으나 지금은 간접 통제(메모리 매니저 - 입출력 관리자)하는 경우가 많음
- 입출력 장치가 데이터 전송을 요구하거나 저놋잉 끝나 다음 동작이 수행되어야 할 경우
- 입출력 데이터에 이상이 있는 경우
- 내부 인터럽트
- 잘못된 명령이나 잘못된 데이터를 사용할 때 → Trap
- 잘못된 메모리 공간에 접근을 시도할 때
- 프로그램 검사 인터럽트
- Division by zero
- 컴퓨터는 ‘/’를 연산할 때, ‘-’를 반복하는 방식으로 동작하기 때문에 무한 루프 돌기 때문.
- Overflow/ Underflow
- 기타 Exception
- Division by zero
- 소프트웨어 인터럽트(SVC: Supervisor Call)
- 사용자가 프로그램을 실행시키거나 감시 프로그램을 호출하는 동작을 수행하는 경우
- 소프트웨어 이용중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 등의 동작이 수행된다.
인터럽트 동작 순서
- 인터럽트 요청
- 프로그램 실행 중단(CPU 연산 일시정지): 현재 실행중이던 Micro Operation까지 수행한다.
- 현재의 프로그램 상태 보존: PCB(Process Control Block), PC( Program Counter) 등
- ⇒ 현재 상태 백업. 인터럽트로 인한 처리 코드가 동작 (Interrupt Service Routine).
- 인터럽트 처리 루틴 실행: 인터럽트를 요청한 장치를 식별한다.
- 인터럽트 서비스 루틴 실행: 인터럽트 원인을 파악하고, 실질적인 작업을 수행한다. 처리기 레지스터 상태를 보존한다. 서비스 루틴 수행 중 우선 순위가 더 높은 인터럽트가 발생하면 또 재귀적으로 1~5를 수행한다.
- 상태 복구: 인터럽트 발생 시 저장해둔 PC(Program Counter)를 다시 복구한다.
- 중단된 프로그램 실행 재개: PC값을 이용하여 이전에 수행중이던 프로그램을 재개한다.
⇒ 인터럽트가 발생하면 cpu에서는 즉각적으로 (실행중인 명령어까지는 마무리 한 후) 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행
인터럽트 우선 순위
- 여러 장치에서 인터럽트가 동시에 발생하거나 인터럽트 서비스 루틴 수행 중 인터럽트가 발생했을 경우 우선순위를 따져서 처리한다.</aside>
- <aside> 💡 전원 이상(Power fail) > 기계 착오(Machine Check) > 외부 신호(External) > 입출력(I/O) > 명령어 잘못 > 프로그램 검사(Program Check) > SVC(Supervisor Call)
- 일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선순위가 높고 내부 인터럽트보다 외부 인터럽트가 우선순위가 높다.
System call
- 시스템 콜이란 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
- 프로그램이 os 커널이 제공하는 서비스를 이용하고 싶을 때 시스템 콜을 통해 실행
- 종류
- 프로세스/스레드 관련
- 파일 I/O 관련
- 소켓 관련
- 장치(device)관련
- 프로세스 통신 관련
- 리눅스가 제공하는 시스템 콜 예시
- 시스템 콜이 발생하면 그에 해당 커널 코드가 커널 모드에서 실행
시스템 콜 & 인터럽트 예제: file read
- t1 / t2가 돌아가는 single core cpu 상황[user mode] t1이 Read(System call) 호출[kernel mode] 파일 읽는 작업(ssd) 준비[kernel mode] cpu가 스케쥴링을 통해 t2를 running상태로 변환[interrupt] 파일 읽는 작업 준비 완료 interrupt 발생[kernel mode] t1을 ready 상태로 변경[user mode] k→u로 전환. t2 중단되었던 부분부터 다시 실행[kernel mode] u→k 전환. t2의 cpu 상태 저장[kernel mode] t1의 상태가 running으로 전환됨[user mode] k→u로 전환. t1 실행 중. 파일에서 데이터를 읽어옴
- [kernel mode] t1의 cpu 상태 복원
- [kernel mode] t2의 상태가 ready로 전환됨
- [interrupt] 멀티태스킹 도중 t2에게 할당된 시간이 다 되어서, timer 하드웨어를 통해 interrupt발생
- [kernel mode] t2의 cpu 상태 복원
- [kernel mode] u→k 전환. t2의 cpu 상태 저장
- [user mode] k→u로 전환. t2 실행 중
- [kernel mode] t1의 상태가 waiting으로 전환됨
- [kernel mode] u→k 전환. t1의 cpu 상태 저장
- [user mode] t1은 running, t2는 ready상태
프로그래밍 언어와 시스템 콜의 관계
- 하드웨어 / 시스템 관련 기능은 어떤 프로그램이라도 반드시 시스템 콜을 통해서만 사용 가능
- 하지만 우리는 개발할 때 직접 OS 시스템 콜을 사용한 적이 없다.
- 그럼에도 우리는 지금가지 파일 I/O, 네트워크 I/O, 프로세스/스레드 관련 작업을 해왔다. 이것은 우리가 사용하는 프로그램이 언어들이 시스템 콜을 포장(wrapping)하여 간접적으로 사용할 수 있도록 제공했기 때문.
→ 다시 말해 개발자들은 api를 통해 system call을 호출한다.
EX) java.lang.Thread class
Thread thread = new Thread();
thread.start();
- 스레드 생성은 System call 이 필요함. java.lang.Thread 클래스를 살펴보면, start 아래에 start0라는 메서드가 있다. private native void start0. 여기서 native는 운영체제를 뜻하는 말. Java Native Interface를 통해서 OS의 System call과 연결이 된다.
참고자료
- 공룡책 p.62~74
- 인프런 공룡책 강의 02. 운영체제의 개념과 구조(https://www.inflearn.com/course/운영체제-공룡책-전공강의)
- 쉬운코드 (https://www.youtube.com/watch?v=v30ilCpITnY)
- 널널한 개발자(https://www.youtube.com/watch?v=V4lp6iGoUFY)
'CS > 운영체제' 카테고리의 다른 글
OS_2)Process (0) | 2024.01.18 |
---|