1. 시스템 콜(System Call)과 트랩(Trap)
1) 시스템 콜: 은행 창구와 직원
- 개념: 사용자 프로세스(User Mode)가 커널(Kernel Mode)에게 "파일 읽기, 쓰기" 같은 특권 작업을 요청하는 인터페이스
- 비유: 은행 금고(하드웨어)에 직접 들어갈 수 없으니, 창구 직원(커널)에게 신청서를 내는 것과 같다.
- 실제 동작: 우리는 open() 함수를 호출한다고 생각하지만, 실제로는 C 라이브러리(glibc)의 래퍼 함수가 실행되며 내부적으로 시스템 콜 번호를 레지스터에 적는다.
2) 트랩(Trap): 실행의 벨을 누르다
시스템 콜이 '요청 내용(무엇을)'이라면, 트랩은 그 요청을 전달하는 '수단(어떻게)'.
- 역할: 사용자 모드에서 커널 모드로 진입하기 위해 발생시키는 소프트웨어 인터럽트.
- 동작: TRAP 명령어가 실행되면 CPU의 권한 레벨이 격상(User → Kernel)되고, 미리 정해진 핸들러 주소로 점프한다.
- 보안: 사용자는 핸들러의 주소를 알더라도 직접 점프할 수 없다(하드웨어 차단). 오직 트랩이라는 정해진 문을 통해서만 진입 가능.
2. 프로세스와 스레드, 그리고 CPU
"프로그램이 실행된다"는 말의 진짜 의미.
1) 프로세스 vs 스레드
- 프로세스 (Process): 운영체제로부터 자원(메모리, 파일 등)을 할당받는 단위
- 스레드 (Thread): 프로세스 내에서 실행되는 흐름의 단위이자, CPU가 스케줄링하는(선택하는) 단위
- 핵심: 현대 운영체제에서 CPU 스케줄러가 작업을 할당하는 최소 단위는 '스레드'다.
2) 하드웨어 스레드 vs 소프트웨어 스레드
- 하드웨어 스레드 (Logical Processor): CPU가 동시에 처리할 수 있는 물리적인 슬롯(Slot)의 개수. (예: 4코어 8스레드)
- 소프트웨어 스레드: 우리가 코드로 생성하는 작업의 흐름. (예: Tomcat의 max-threads: 200)
- 관계: 운영체제는 수많은 소프트웨어 스레드를 적절히 골라 한정된 하드웨어 스레드 위에서 번갈아 실행시킨다.
3. 제어권 강탈: 인터럽트와 문맥 교환
한 프로세스가 CPU를 독점하지 못하도록 운영체제는 어떻게 개입할까?
1) 타이머 인터럽트 (Timer Interrupt)
- 하드웨어(타이머 장치)가 주기적으로 CPU에게 신호를 보낸다.
- 이 신호가 오면 하드웨어는 강제로 실행 흐름을 끊고 운영체제에게 제어권을 넘깁니다. 이를 선점(Preemption)이라고 한다.
2) 언제 뺏는가? (명령어 사이클의 비밀)
하드웨어는 무식하게 뺏지 않습니다. 명령어의 원자성(Atomicity)을 보장한다.
- 인출 (Fetch): 메모리에서 명령어 하나를 가져옵니다.
- 해석 (Decode): 이게 덧셈인지 뺄셈인지 해석합니다.
- 실행 (Execute): 실제로 계산을 합니다.
- 인터럽트 체크 (Interrupt Check): CPU는 다음 명령어를 가져오기(Fetch) 직전에, 반드시 인터럽트 컨트롤러를 확인
- 실행 중(Execute): 명령어 하나가 실행되는 도중에는 절대 건드리지 않습니다.
- 체크 시점: 명령어 하나가 완전히 끝난 직후, 다음 명령어를 가져오기(Fetch) 직전에 하드웨어적으로 인터럽트를 체크한다.
3) 문맥 교환 (Context Switching)의 디테일
스레드 A에서 B로 넘어갈 때, 기존 정보는 어디에 저장될까요?
- 모든 스레드는 자신만의 고유한 커널 스택(Kernel Stack)을 가집니다.
- 메인 스레드의 스택을 공유하는 것이 아닙니다. 각자의 라커룸(커널 스택)에 현재 레지스터 값(Context)을 저장하고 대기합니다.