인터럽스와 시스템 콜

효딩딩·2023년 6월 13일
0

User mode

  • 우리가 개발하는 프로그램은 일반적으로 유저모드에서 실행된다.

Kernel mode 를 만든 이유

  • 시스템을 보호하기 위해서
  • 커널모드가 없으면 우리가 개발한 프로그램이 함부로 하드웨어를 다 점유해서 사용하고 다른 프로세스가 영향을 받게 되기 때문이다.
  • 시스템 전반적인 부분과 하드웨어 관련 부분은 커널이 담당하고 개발자가 작성한 프로그램은 커널을 통해 시스템의 기능이나 하드웨어를 사용할 수 있도록 함으로써 시스템이 안정적으로 동작할 수 있도록 보호하기 위해 커널모드를 만들어 놓은 것이다.

* 커널(kernel) : 운영체제의 핵심. 시스템 전반을 관리/감독하는 역할. 하드웨어와 관련된 작업을 직접 수행한다.

유저모드와 커널모드는 어떻게 동작하나?

  • 프로그램이 실행되다가 유저모드에서 커널모드로 바뀌고 반대가 되기도 한다.

유저모드 → 커널모드
이렇게 실행되다가 프로그램 실행 중에 인터럽트(interrupt)가 발생하거나
시스템 콜을 호출하게 되면 커널모드로 전환된다.

커널모드

  • 프로그램의 현재 CPU 상태를 저장한다.
  • 커널이 인터럽트나 시스템 콜을 직접 처리한다.즉 CPU에서 커널코드가 실행된다.

커널모드 → 유저모드

  • 커널 코드 처리가 완료되면 중단됐던 프로그램의 CPU 상태를 복원한다. 중단 됐던 프로그램을 이어서 시작한다.(다시 이어서 시작하려면 cpu상태를 복원해야함.)
  • 다시 통제권을 프로그램에게 반환한다.

유저모드
중단됐던 프로그램이 이어서 실행한다.

인터럽트(interrupt) ?

  • 시스템에서 발생한 다양한 종류의 이벤트 혹은 그런 이벤트를 알리는 메커니즘을 말한다.

  • 인터럽트는 언제든지 발생할 수 있고 인터럽트가 발생하면 cpu에서는 즉각적으로 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행한다.

  • 커널 모드에서 커널이 인터럽트를 처리하기 위해 주도적으로 cpu에서 실행이 된다.

  • 인터럽트가 발생한 순간 cpu에서는 사용자의 프로그램이 실행되고 인터럽트는 실행중인 명령어들은 마무리 한뒤에 인터럽트 처리를 위해 커널이 통제권을 넘겨 받아 관련 처리를 하게 된다.

    인터럽트 종류

  1. 전원에 문제가 생겼을 때
  2. I/O 작업이 완료됐을 때
  3. 시간이 다 됐을 때(timer라는 하드웨어가 있어 시간이 다 됐음을 알려주는 기능이 있다.)
    * 프로그램상에서 발생하는 인터럽트라고 해서 Trap 이라고한다.
  4. 0으로 나눴을 때(프로그램 상에서)
  5. 잘못된 메모리 공간에 접근을 시도할 때(프로그램 상에서)

시스템 콜(system call)

  • 프로그램이 OS커널이 제공하는 서비스를 이용하고 싶을 때 시스템 콜을 통해 실행한다.

시스템 콜의 종류

  1. 프로세스/스레드 관련(생성/삭제)
  2. 파일 I/O 관련(읽고, 쓰고 등등)
  3. 소켓 관련(네트워크 관련 작업)
  4. 장치(device) 관련(키보드에서 입력을 받거나..)
  5. 프로세스 통신 관련(프로세스끼리 통신하기 위해 여러 장치가 필요하다.)

파일 read 시 어떻게 일어날까?

  • 시스템 콜과 인터럽트가 어떻게 사용되는지 그때마다 유저모드에서 커널모드로 어떻게 전달되는지 알아보자.

T1 runnin 상태 T2 read 상태

유저모드

  • T1 실행하다가 파일을 read 하기 위해 system call 호출을 한다.

커널모드로 전환

  • T1 의 CPU 상태 저장
  • 파일을 읽을 준비
    * I/O 관련 작업이고 SSD로 부터 파일을 읽어오려는 작업.
    파일의 위치를 찾아서 파일을 읽으려는 내용을 버퍼에서 읽을 수 있도록 준비하는 작업을 해야된다.)
    파일을 읽는 read 시스템 콜은 블락시스템 콜이기 때문에 T1이 파일을 읽을 준비가 될 때까지 기다려야한다. 그래서 T1의 상태를 파일을 읽을 준비가 될 때까지 waiting 상태로 전환이 된다.
  • T1 waiting, T2를 running

T1 running 상태 → waiting 상태

  • CPU에서는 동작하는게 없기 때문에 스케줄링을 해서 CPU가 일할 수 있게 해줘야하는데

T2 read 상태 → running 상태 (cpu에서 실행할 수 있게 준비한다.)

유저 모드로 전환

  • 통제권은 T2에 있다.
  • T2 실행하던 중에 인터럽트를 통해 SSD 쪽에서 T1이 파일을 읽을 준비가 됐다고 알려주면 이것을 처리하기 위해 커널모드로 전환이 된다.

커널모드로 전환

  • T2의 CPU 상태 저장
  • T1 waiting 상태 → read 상태로 변경(파일이 준비되서 다음 스케줄링에서 선택받아 실행된다.)
  • T2의 CPU 상태 복원

유저 모드로 전환

  • T2는 중단됬던 부분 부터 다시 시작함.
  • 멀티태스킹 방식이다 보니 T2는 자신에게 주어진 타임 슬라이드를 다 사용했다.
  • 타이머라는 하드웨어를 통해서 "너 시간 다됐어" 라고 알려주는데 방식이 인터럽트이다.
  • 타이머에 관련된 인터럽트가 발생하고 나면 다시 커널모드로 전환이 된다.

커널 모드로 전환

  • T2의 CPU 상태 저장
  • T2 read 상태
  • T1 runing 상태로 되고 T1의 CPU 상태가 복원된다.

유저모드로 전환

  • T1이 실행하고 파일에서 데이터를 읽어오는 작업을 수행한다.

이렇게 시스템 콜과 인터럽트가 실행된다.

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

  • 하드웨어 혹은 시스템 관련 기능은 어떤 프로그램이라도 반드시 시스템 콜을 통해서만 사용 가능하다. 그러나 보통 개발할 때 직접 OS 시스템 콜을 사용한적이 없다. 그럼에도 지금까지 파일I/O, 네트워크I/O, 프로세스/스레드 관련 작업을 해왔다.

  • 우리가 사용하는 프로그래밍 언어들이 시스템 콜을 호출할 수 있도록 포장(wapping)하여 제공을 하고 개발자들은 프로그래밍 언어를 통해서 간접적으로 시스템 콜을 사용할 수 있게 되는것이다.

profile
어제보다 나은 나의 코딩지식

0개의 댓글