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이 열받아서 기능 다 가져옴
    • 입출력 데이터에 이상이 있는 경우
  • 내부 인터럽트
    • 잘못된 명령이나 잘못된 데이터를 사용할 때 → Trap
    • 잘못된 메모리 공간에 접근을 시도할 때
    • 프로그램 검사 인터럽트
      • Division by zero
        • 컴퓨터는 ‘/’를 연산할 때, ‘-’를 반복하는 방식으로 동작하기 때문에 무한 루프 돌기 때문.
      • Overflow/ Underflow
      • 기타 Exception
  • 소프트웨어 인터럽트(SVC: Supervisor Call)
    • 사용자가 프로그램을 실행시키거나 감시 프로그램을 호출하는 동작을 수행하는 경우
    • 소프트웨어 이용중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 등의 동작이 수행된다.

인터럽트 동작 순서

  1. 인터럽트 요청
  2. 프로그램 실행 중단(CPU 연산 일시정지): 현재 실행중이던 Micro Operation까지 수행한다.
  3. 현재의 프로그램 상태 보존: PCB(Process Control Block), PC( Program Counter) 등
  4. ⇒ 현재 상태 백업. 인터럽트로 인한 처리 코드가 동작 (Interrupt Service Routine).
  5. 인터럽트 처리 루틴 실행: 인터럽트를 요청한 장치를 식별한다.
  6. 인터럽트 서비스 루틴 실행: 인터럽트 원인을 파악하고, 실질적인 작업을 수행한다. 처리기 레지스터 상태를 보존한다. 서비스 루틴 수행 중 우선 순위가 더 높은 인터럽트가 발생하면 또 재귀적으로 1~5를 수행한다.
  7. 상태 복구: 인터럽트 발생 시 저장해둔 PC(Program Counter)를 다시 복구한다.
  8. 중단된 프로그램 실행 재개: 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과 연결이 된다.

참고자료

'CS > 운영체제' 카테고리의 다른 글

OS_2)Process  (0) 2024.01.18

+ Recent posts