
1. 프로세스(Process)
정의
- 프로세스는 실행 중인 프로그램을 의미합니다.
- 프로그램이 디스크에 저장된 정적 코드 상태에서 메모리에 적재되어 CPU 등 자원을 할당받고 실행될 때 프로세스가 된다.
상태 전이
- 생성(New): 프로세스가 PCB를 가지지만 CPU 할당 전 상태
- 준비(Ready): 메모리에 적재되고 CPU를 기다리는 상태
- 실행(Running): CPU를 점유하고 명령어 수행
- 대기(Waiting/Blocked): I/O 등 자원을 기다려 CPU 반납
- 준비(Ready): 대기하던 자원이 할당되면 웨이크업되어 다시 준비 상태
- 실행(Running): CPU 할당 후 재실행
- 종료(Terminated): 실행 완료 또는 강제 종료
Tip: 인터럽트나 타임 슬라이스에 의해 Running → Ready 전이도 발생
메모리 구조
- 코드 영역(Text): 실행 코드, 읽기 전용
- 데이터 영역(Data): 전역 변수 및 정적 변수, 읽기/쓰기 가능
- 힙(Heap): 동적 메모리 할당 영역
- 스택(Stack): 함수 호출 관련 임시 데이터, 지역 변수, 매개변수 저장
2. PCB(Process Control Block)
정의
- PCB는 운영체제가 프로세스를 관리하기 위해 사용하는 메타데이터 블록
- 프로세스 생성 시 만들어지며, CPU 스케줄링, 상태 관리, 문맥 교환 등에 사용
PCB 정보
- 프로세스 식별자(PID)
- 프로세스 상태(New, Ready, Running, Waiting, Terminated)
- 프로세스 권한
- 프로그램 카운터(PC)
- CPU 레지스터
- CPU 스케줄링 정보
- 계정 정보(CPU 사용 시간, 실행 유저 등)
- I/O 상태 정보
3. 스레드(Thread)와 TCB(Thread Control Block)
정의
- 스레드는 프로세스 내에서 실제로 실행되는 흐름 단위
- 같은 프로세스 주소 공간과 자원을 공유하며 독립적 실행
TCB 정보
- 스레드 ID(TID)
- 스레드 상태(New, Ready, Running, Waiting, Terminated)
- CPU 레지스터, 프로그램 카운터
- 스택 포인터(Stack Pointer)
- 스케줄링 정보
스레드는 PCB와 달리 주소 공간을 공유하므로 메모리 복사 없이 빠른 생성과 전환 가능
4. 컨텍스트 스위칭(Context Switching)
정의
- CPU가 한 프로세스 또는 스레드에서 다른 프로세스로 전환되는 과정
- 멀티태스킹 환경에서 한 시점에 CPU는 하나의 프로세스만 실행
순서
- CPU가 P1 실행 중
- 인터럽트 발생 → 운영체제 개입
- P1 상태 PCB1에 저장 (레지스터, PC, 스택 포인터 등)
- P2 상태 PCB2에서 복원 → CPU 점유
- P2 실행 시작
- P2 실행 중 또 다른 인터럽트 발생
- P2 상태 PCB2에 저장
- P1 상태 PCB1에서 복원 → CPU 점유, 실행 재개
CPU 제어권
CPU 제어권(Control)이란 CPU가 어떤 코드(프로세스/스레드)를 실행할지 결정하는 권한을 의미합니다.
사용자 모드(User Mode) vs 커널 모드(Kernel Mode)
사용자 모드
- 우리가 작성한 일반 프로그램(예: 메모장, 웹 브라우저 등)이 실행되는 모드
- CPU 권한 제한:
- 직접 하드웨어 접근 불가
- OS 핵심 자원 접근 불가
- 목적: 안정성과 보안 확보
커널 모드
- 운영체제(OS)가 실행되는 모드
- CPU 완전 권한:
- 하드웨어 접근 가능
- 메모리, 파일 시스템, 장치 제어 가능
CPU 제어권 전환 과정
사용자 프로그램이 OS 서비스를 요청할 때 CPU 제어권이 사용자 모드에서 커널 모드로 전환됩니다.
예시: 파일 읽기
사용자 프로그램:
fd = open("file.txt") # 파일 읽기 요청 (시스템 콜)
- CPU가 커널 모드로 전환
- OS가 파일 시스템 접근 → 데이터 읽기
- 처리 완료 후 사용자 모드로 반환
- 사용자 프로그램 실행 재개
[사용자 모드: 내 코드 실행]
│
│ 시스템 콜 호출 (read, write, open 등)
▼
[커널 모드: OS 코드 실행]
│
│ 처리 완료
▼
[사용자 모드: 내 코드 실행 재개]
5. 인터럽트 (Interrupt)
정의
CPU가 현재 실행 중인 작업을 중단하고, 긴급한 사건을 먼저 처리하도록 하는 신호
즉, 예상치 못한 외부 사건이나 예외 상황이 발생했을 때 CPU에게 알리는 메커니즘입니다.
인터럽트 종류
| 구분 | 설명 | 예시 |
|---|
| 하드웨어 인터럽트 | 외부 장치가 CPU에 신호를 보냄 | 키보드 입력, 마우스 클릭, 디스크 I/O 완료 등 |
| 소프트웨어 인터럽트 | 프로그램이 명령을 통해 발생시킴 | 시스템 콜, 예외(Exception) 등 |
처리 과정
- CPU가 현재 실행 중인 명령을 잠시 중단
- 인터럽트 벡터 테이블을 통해 처리 루틴(Handler) 주소 탐색
- 해당 인터럽트 서비스 루틴(ISR, Interrupt Service Routine) 실행
- 처리 완료 후 중단된 위치로 복귀
목적
- 외부 장치나 예외 상황에 즉각 대응
- CPU 자원을 효율적으로 사용 (폴링 방식보다 효율적)
- 시스템 안정성과 응답성 향상
6. 시스템 콜 (System Call)
정의
사용자 프로그램이 운영체제의 커널 서비스를 요청하는 인터페이스
사용자 모드에서는 하드웨어나 커널 자원에 직접 접근할 수 없기 때문에,
운영체제에 공식적으로 요청하는 통로가 필요합니다.
그게 바로 시스템 콜입니다.
동작 과정
- 사용자 프로그램이
read(), write(), fork(), open() 등 시스템 콜 호출
- 내부적으로 소프트웨어 인터럽트 발생 (
int 0x80 또는 syscall 명령)
- CPU가 커널 모드로 전환
- 커널의 시스템 콜 핸들러가 요청 처리
- 처리 결과를 사용자 모드로 반환
예시
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd = open("test.txt", O_RDONLY); // 파일 열기 (시스템 콜)
char buf[100];
read(fd, buf, sizeof(buf)); // 파일 읽기 (시스템 콜)
close(fd); // 파일 닫기 (시스템 콜)
return 0;
}
위 코드의 open, read, close 모두 커널의 도움 없이 직접 수행 불가능한 작업이므로
시스템 콜을 통해 수행됩니다.
인터럽트 vs 시스템 콜 비교
| 구분 | 인터럽트 (Interrupt) | 시스템 콜 (System Call) |
|---|
| 발생 주체 | 하드웨어 또는 소프트웨어 | 사용자 프로그램 |
| 발생 원인 | 외부 이벤트나 예외 상황 | 커널 서비스 요청 |
| 트리거 | 하드웨어 신호 또는 예외 | syscall, int 0x80 명령 |
| 모드 전환 | 사용자 → 커널 | 사용자 → 커널 |
| 예시 | I/O 완료, 타이머 인터럽트, 0으로 나누기 예외 | read(), write(), open() |
| 핵심 목적 | 외부 사건 처리 및 CPU 제어권 전환 | 커널 기능(입출력, 메모리, 프로세스) 이용 |
핵심 요약
시스템 콜은 프로그램이 커널 기능을 요청하기 위해 의도적으로 발생시키는 소프트웨어 인터럽트이고,
인터럽트는 외부나 내부의 예기치 못한 사건에 CPU가 반응하기 위한 메커니즘입니다.