Operating Systems Three Easy Pieces
작성자: Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau · 2018 번역본을 참고하였습니다.
https://github.com/remzi-arpacidusseau/ostep-translations/tree/master/korean
이전 글에서 CPU를 가상화하는 이유는 여러 작업들이 동시에 실행되는 것처럼 보이도록 물리적인 CPU를 공유해 시분할 기법을 사용하여 각 프로세스들이 실행과 중단을 한다고 했다. 이와 같이 CPU 시간을 나누어 씀으로 가상화를 구현할 수 있다. 이를 위해 성능 저하와 제어 문제를 해결해야한다. 오버헤드를 주지 않으면서 성능 저하를 낮추고, 프로세스의 권한을 운영체제가 제어권을 가지고 있어야한다. (제어권이 없다면 데드락, 상호배제 등의 동시성, 병행성 문제를 처리하지 못할 우려)
오버헤드: 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다. 예를 들어 A라는 처리를 단순하게 실행한다면 10초 걸리는데, 안전성을 고려하고 부가적인 B라는 처리를 추가한 결과 처리시간이 15초 걸렸다면, 오버헤드는 5초가 된다.
과거에는 프로그램을 직접 실행하였다. 직접 실행의 장점은 빠르게 실행되지만, 특정명령을 중간에 내릴 수 없다. 실행되는 프로그램을 어떻게 중단할 것이며, 운영체제의 제어를 벗어난 프로세스는 어떤 일을 벌일 것인가? 입출력디스크의 모든 영역을 접근 및 조작할 수 있다.
사용자 모드(user mode): 하드웨어 자원에 대한 접근 권한이 일부 제한됨.
커널 모드(kernel mode): 컴퓨터의 모든 자원에 대한 접근 권한을 커널 모드에서 가짐.
사용자 모드에서 운영체제가 가지고 있는 명령어(파일 시스템 접근, 프로세스 생성 및 제거 등) 를 실행하기 위해서는 시스템 콜을 사용해야 한다. (사용자 -> 커널 trap, 커널 -> 사용자 return from trap)
사용자 모드에서 커널 모드로 전환시 호출한 프로세스의 필요한 정보(레지스터)를 저장해야 한다. return from trap 명령어 실행 시 사용자 모드로 제대로 리턴할 수 있어야 하기 때문이다. 프로세스의 정보를 커널 스택에 저장한다. 컴퓨터 부팅 시 커널은 트랩 테이블을 만들고 하드웨어에게 예외 사건 발생 시 트랩 핸들러의 위치를 알려준다.
커널 스택: 커널 스택의 첫번째 목적은 커널 모드에서 유저 모드로 전환하기 위해 필요한 정보를 저장하고, 프로세스의 프로그램 카운터(PC)가 커널 주소 공간의 코드를 가리키게 된다. 그리고 커널의 함수들을 호출하며 커널 스택에 관련된 정보가 쌓인다.
트랩 테이블: 인터럽트를 처리하기 위해 운영체제가 미리 정의한 함수(핸들러)의 주소를 저장하는 테이블
트랩 핸들러: 트랩 테이블에 등록된 주소로서, 트랩이 발생했을 때 실행되는 코드 루틴

프로세스는 각자의 커널 스택을 가지고 있고 커널 모드 -> 사용자 모드로 전환할 때 하드웨어에 의해 레지스터를 복원하여 호출했던 프로세스 레지스터 정보를 알 수 있고, 자신(사용자 모드)의 프로세스 상태를 커널 스택에 저장하여 이후 return-from-trap 시 다시 호출했던 프로세스 주소로 돌아갈 수 있다.
프로세스를 멈추고 다른 프로세스를 실행한다. 비협조 방식으로 운영체제가 프로세스의 전권을 가진다. 수 밀리 초마다 인터럽트를 발생시키도록 타이머 인터럽트를 사용한다. 인터럽트 발생 시 현재 수행 중인 프로세스가 중단되고 인터럽트 핸들러가 실행된다.
인터럽트 핸들러: 인터럽트가 발생하면 해당 인터럽트를 처리하는 루틴으로 제어를 넘겨 해당 핸들러를 실행하여 해당 이벤트를 처리
운영체제가 해야하는 작업은 현재 실행 중인 프로세스의 레지스터 값을 커널 스택, PCB에 저장하고 곧 실행될 프로세스의 커널 스택으로부터 레지스터 값을 복원하여 상태정보를 알아낸다. (커널 스택은 각 프로세스가 하나씩 가지고 있고 실행 중인 프로세스의 커널 스택으로 전환.) 왜 복원한다고? return-from-trap 명령어가 실행 될 때 현재 실행 중이던 프로세스로 리턴하는 것이 아니라 다른 프로세스로 리턴하여 실행을 다시 시작 가능.

proc 구조체에 저장, B 구조체로부터 B의 레지스터를 복원하고 B 커널 스택으로 전환proc struct는 프로세스와 관련된 정보를 담고 있는 자료 구조로서, 운영체제 커널 내부에서 사용된다. 프로세스의 식별자(PID), 상태 정보(실행 중, 대기 중, 종료 등), 메모리 할당 정보, 파일 디스크립터, 스케줄링 정보 등이 포함. 이 정보들은 운영체제가 프로세스를 생성, 스케줄링, 관리하고 상호작용하기 위해 필요한 정보이다.
타이머 인터럽트 발생에 실행 중인 프로세스A의 레지스터 값이 A의 커널스택에 저장됐고, A에서 B로 컨텍스트 스위칭시 프로세스A의 구조체에 커널 레지스터가 저장되어 총 2번의 저장/복원이 있었다.