* 커널(kernel) : 운영체제의 핵심. 시스템 전반을 관리/감독하는 역할. 하드웨어와 관련된 작업을 직접 수행한다.
유저모드 → 커널모드
이렇게 실행되다가 프로그램 실행 중에인터럽트(interrupt)가 발생하거나
시스템 콜을 호출하게 되면 커널모드로 전환된다.
커널모드
- 프로그램의 현재 CPU 상태를 저장한다.
- 커널이 인터럽트나 시스템 콜을 직접 처리한다.즉 CPU에서 커널코드가 실행된다.
커널모드 → 유저모드
- 커널 코드 처리가 완료되면 중단됐던 프로그램의 CPU 상태를 복원한다. 중단 됐던 프로그램을 이어서 시작한다.(다시 이어서 시작하려면 cpu상태를 복원해야함.)
- 다시 통제권을 프로그램에게 반환한다.
유저모드
중단됐던 프로그램이 이어서 실행한다.
시스템에서 발생한 다양한 종류의 이벤트 혹은 그런 이벤트를 알리는 메커니즘을 말한다.
인터럽트는 언제든지 발생할 수 있고 인터럽트가 발생하면 cpu에서는 즉각적으로 인터럽트 처리를 위해 커널 코드를 커널 모드에서 실행한다.
커널 모드에서 커널이 인터럽트를 처리하기 위해 주도적으로 cpu에서 실행이 된다.
인터럽트가 발생한 순간 cpu에서는 사용자의 프로그램이 실행되고 인터럽트는 실행중인 명령어들은 마무리 한뒤에 인터럽트 처리를 위해 커널이 통제권을 넘겨 받아 관련 처리를 하게 된다.
Trap 이라고한다. 유저모드
- T1 실행하다가 파일을 read 하기 위해 system call 호출을 한다.
커널모드로 전환
- T1 의 CPU 상태 저장
- 파일을 읽을 준비
* I/O 관련 작업이고 SSD로 부터 파일을 읽어오려는 작업.
파일의 위치를 찾아서 파일을 읽으려는 내용을 버퍼에서 읽을 수 있도록 준비하는 작업을 해야된다.)
파일을 읽는 read 시스템 콜은 블락시스템 콜이기 때문에 T1이 파일을 읽을 준비가 될 때까지 기다려야한다. 그래서 T1의 상태를 파일을 읽을 준비가 될 때까지 waiting 상태로 전환이 된다.- T1 waiting, T2를 running
유저 모드로 전환
- 통제권은 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)하여 제공을 하고 개발자들은 프로그래밍 언어를 통해서 간접적으로 시스템 콜을 사용할 수 있게 되는것이다.