시스템 자원: 프로그램 실행에 마땅히 필요한 CPU, 메모리, I/O 장치, 파일 시스템 등 다양한 요소들
운영체제 (OS; Operating System): 커널 영역에 적재되어 사용자 영역에 적재된 프로그램들에 자원을 할당하고, 이들을 올바르게 실행되도록 관리함.
메모리는 커널 영역과 사용자 영역으로 나뉘며, OS는 컴퓨터 부팅 시 메모리 내 커널 영역에 적재되어 실행됨.
사용자 영역: 사용자가 이용하는 응용 프로그램이 적재되는 메모리 영역
커널 (kernel): OS의 핵심 부분. 응용 프로그램과 HW 간의 인터페이스 제공
사용자 인터페이스 (UI): OS의 한 부분으로, 사용자가 컴퓨터와 상호작용할 수 있도록 함. 커널에 포함되지 않음.
이중 모드 (dual mode): CPU가 명령어를 실행할 때 사용자/커널 모드 2가지 모드를 제공. 사용자 프로그램이 HW를 직접 제어하지 못하게 함.
시스템 호출 (system call): OS 서비스를 제공받기 위한 요청. 사용자 모드에서 커널 모드로 전환할 수 있음.
소프트웨어 인터럽트: 시스템 호출이나 예외 상황에서 발생하며, 현재 작업을 중단하고 커널 모드로 전환됨.
시스템 호출 처리 순서:
시스템 호출 -> 사용자 작업 상태 백업 -> 커널 모드 전환 -> 커널 코드 실행 -> 시스템 호출 복귀(사용자 모드로 복귀)
프로세스: 실행 중인 프로그램
일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있으므로 여러 프로세스들을 조금씩 번갈아가면서 실행함.
파일 및 디렉토리 생성, 삭제, 읽기, 쓰기 등의 작업 관리
타이머 인터럽트: 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 HW 인터럽트
프로세스 제어 블록 (PCB; Process Control Block): 프로세스와 관련된 정보를 저장하는 자료 구조. OS는 PCB를 통해 프로세스를 관리하고 문맥 교환을 실행함.
PCB 주요 정보:
문맥 (context): 현재 프로세스의 실행 상태를 나타내는 정보
문맥 교환 (context switching): 실행 중인 프로세스의 문맥을 PCB에 백업하고, 새로 실행할 프로세스의 문맥을 PCB에서 복원하는 과정. CPU가 다른 프로세스로 전환될 때 필요함.
프로세스가 생성되면 커널 영역에 PCB가 생성되고, 사용자 영역에는 코드/데이터/힙/스택 영역에 나누어 저장됨.
정적 할당 영역:
동적 할당 영역:
힙과 스택 영역은 서로 다른 방향으로 메모리를 확장하여 충돌하지 않도록 함.
<프로세스 다이어그램>
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음.
부모 프로세스 (parent process): 새 프로세스를 생성한 프로세스
자식 프로세스 (child process): 부모 프로세스에 의해 생성된 프로세스. 일부 OS에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 저장됨.
이러한 생성 과정이 반복되어 여러 프로세스가 트리 구조로 구성되며, 이를 프로세스 계층 구조라고 함.
컴퓨터 부팅 시 최초의 프로세스가 실행되며, 이를 기준으로 모든 프로세스가 생성됨.
예를 들어, 유닉스 계열 OS에서는 init, 리눅스에서는 systemd, macOS에서는 launchd가 최초의 프로세스로 작동하며, 이들의 PID는 일반적으로 1번임.
이러한 시스템 호출을 통해 프로세스 계층 구조가 형성됨.
단일 스레드 프로세스: 한 번에 하나의 작업을 처리하는 프로세스
스레드: 프로세스를 구성하는 실행의 흐름 단위. 스레드 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었으며, 이를 멀티스레드 프로세스라고 함.
스레드는 프로세스 내에서 서로 독립된 스레드 ID, 레지스터 값, 스택을 가짐. 스레드는 프로세스 자원을 공유하므로 동일한 메모리 공간을 사용하고, 열린 파일 등도 공유함.
멀티프로세스:
멀티스레드:
CPU 스케줄링: OS가 여러 프로세스에 CPU 자원을 공정하고 효율적으로 배분하는 과정
대부분의 프로세스들은 CPU와 I/O장치를 모두 사용하며, 이를 반복적으로 수행함.
입출력 집중 프로세스 (I/O bound process): 입출력 버스트(I/O 장치를 기다리는 작업)가 많은 프로세스. ex) 비디오 재생, 디스크 백업 작업
-> 실행 상태 < 대기 상태
CPU 집중 프로세스 (CPU bound process): CPU 버스트(CPU를 이용하는 작업)기 많은 프로세스. ex) 수학 연산, 컴파일
-> 실행 상태 > 대기 상태
CPU 집중 프로세스와 입출력 집중 프로세스가 동시에 CPU 자원을 요구할 때, 입출력 집중 프로세스를 빨리 실행시켜 I/O 장치를 끊임없이 작동시키고, 그 다음 CPU 집중 프로세스에 집중적으로 CPU를 할당하는 것이 효율적임.
OS는 각 프로세스에 우선순위를 부여하여 더 중요한 작업을 먼저 처리할 수 있도록 함. 우선순위는 각 프로세스의 PCB에 기록되어 이를 기준으로 먼저 처리할 프로세스를 결정함.
OS는 프로세스가 CPU를 사용하거나, 메모리에 적재되거나, 특정 I/O 장치를 사용하기를 기다리는 상황을 스케줄링 큐로 관리함.
OS는 PCB들이 큐에 삽입된 순서대로 프로세스를 실행하되, 그중 우선순위가 높은 프로세스를 먼저 실행함.
선점형 스케줄링 (preemptive scheduling): 하나의 프로세스가 자원을 독점할 수 없는 스케줄링 방식. 프로세스마다 CPU 사용 시간 제한이 있으며, 이를 초과하면 OS가 타이머 인터럽트를 통해 CPU 점유를 종료하고 다음 프로세스에 CPU를 할당함.
비선점형 스케줄링 (non-preemptive scheduling): 하나의 프로세스가 자원을 독점할 수 있는 스케줄링 방식. 자원을 다 사용할 때까지 다른 프로세스에 자원을 빼앗기지 않음.
FCFS 스케줄링 (First Come First Served)
SJF 스케줄링 (Shortest Job First)
라운드 로빈 스케줄링 (round robin)
SRT 스케줄링 (Shortest Remaining Time)
우선순위 스케줄링 (Priority)
다단계 큐 스케줄링 (Multilevel Queue)
다단계 피드백 큐 스케줄링 (Multilevel Feedback Queue)
p.304 확인 문제 1번
1: 생성 상태, 2: 준비 상태, 3: 실행 상태, 4: 종료 상태, 5: 대기 상태
Q. 준비 큐에 A, B, C, D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당 받는가?
선입 선처리 스케줄링은 준비 큐에 삽입된 순서대로 프로세스들을 처리하므로
A - B - C - D 순으로 CPU를 할당 받는다.