
영상 및 사진 출처 : 🔗 https://www.youtube.com/watch?v=v30ilCpITnY&list=PLcXyemr8ZeoQOtSUjwaer0VMJSMfa-9G-&index=10
인터럽트(interrupt)가 발생하거나 시스템 콜(system call)을 호출하게 되면 커널 모드로 전환커널이 인터럽트나 시스템 콜을 직접 처리한다. 즉, CPU에서 커널 코드가 실행됨시스템을 보호하기 위해
커널 모드가 없으면 우리가 만든 프로그램이 마음대로 하드웨어를 다 점유해서 사용하고 다른 프로세스 방해하고 자칫하면 전체 컴퓨터 시스템 붕괴될 수도 있다.
그러니까 시스템 전반적인 부분 즉, 하드웨어적 부분은 커널에서 관리하고 우리가 만든 프로그램은 커널을 통해 하드웨어 기능 사용할 수 있게 시스템이 안정적으로 돌아갈 수 있게 함
시스템에서 발생한 다양한 종류의
이벤트혹은 그런 이벤트를 알리는 매커니즘이자 어떤 신호가 들어왔을 때 CPU를 잠깐정지시키는 것
키보드, 마우스 등 IO 디바이스로 인한 인터럽트, 0으로 숫자를 나누는 산술 연산에서의 인터럽트, 프로세스 오류 등으로 발생하며, 발생 시 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수 실행
그렇다면..
인터럽트 핸들러 함수란?
인터럽트가 발생했을 때, 이를 핸들링하기 위한 함수. 커널 내부의 IRQ를 통해 호출되며, request_irq( )를 통해 인터럽트 핸들러 함수 등록 가능
인터럽트가 발생하면 cpu에서는 즉각적으로 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행
즉, 커널이 인터럽트 처리를 위해 cpu에서 주도적으로 실행된다고 보면 된다.
여기서 즉각적이란 인터럽트는 명령어 실행도중 발생했을 텐데 실행중이던 명령어까지는 마무리 하고 커널모드로 전환
🥐 하드웨어 인터럽트
키보드를 연결한다거나 마우스를 연결하는 일 등의 IO 디바이스에 발생하는 인터럽트를 말한다.
🥐 소프트웨어 인터럽트
트랩이라고도 하며, 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동한다.

read라는 시스템 콜 호출시 커널 모드로 전환
read는 block 시스템 이라 파일이 읽을 상태가 될때까지 기다려야 하기 때문에 t1을 wating 상태로 변환해줘야 한다. 
running으로 바꿔준다.
뭐로 파일을 읽을 준비가 됐다고 알려줄까?
그게 바로 interrupt, 파일이 준비가 됐다는 인터럽트 발생시킴

ready 상태로 변경해 줘야 한다.
timer라는 하드웨어를 통해 알려주게 됨

하드웨어 혹은 시스템 관련 기능은 어떤 프로그램이라도 반드시 시스템 콜을 통해서만 사용 가능하다.
하지만 보통 우리는 개발 시 직접 OS 시스템 콜을 사용한 적은 없었다. 그럼에도 불구하고 우리는 지금까지 파일 I/O, 네트워크 I/O, 프로세스/스레드 작업을 해왔다.
Q. 이게 어떻게 가능했던 것일까?
A. 이것은 우리가 사용하는 프로그래밍 언어들이 시스템 콜을 포장(wrapping)하여 간접적으로 사용할 수 있도록 제공했기 때문이다.
Thread thread = new Thread();
thread.start();
native가 붙으면 운영체제를 보통 뜻한다.