🖥️ CPU 스케줄링
🔹 우선순위
- CPU 활용률: 전체 CPU 가동 시간 중에서 작업을 처리하는 시간의 비율을 의미한다.
- 대부분의 프로세스는 CPU와 입출력 장치를 모두 사용하며 실행과 대기 상태를 반복한다.
- CPU 버스트: CPU를 집중적으로 사용하는 구간.
- 입출력 버스트: 입출력을 수행하는 구간.
- 입출력 집중 프로세스: 입출력 장치를 자주 사용하는 프로세스.
- CPU 집중 프로세스: CPU 연산을 자주 수행하는 프로세스.
📌 효율적인 CPU 스케줄링
- 입출력 집중 프로세스를 최대한 빠르게 실행해 입출력 장치를 지속적으로 작동시킨다.
- 이후 CPU 집중 프로세스에 CPU를 집중적으로 할당하는 것이 효율적이다.
🔹 스케줄링 큐
📌 스케줄링 큐의 종류
- 준비 큐 (Ready Queue): CPU를 사용하려고 기다리는 프로세스의 PCB(Process Control Block)가 저장되는 큐.
- 대기 큐 (Waiting Queue): 입출력과 같은 이벤트를 기다리는 프로세스의 PCB가 저장되는 큐.

📌 프로세스의 흐름
- 새로운 프로세스 생성 → 준비 큐로 이동
- CPU 할당 → 실행 상태로 전환
- 입출력 요청 → 대기 큐로 이동 (대기 상태)
- 입출력 작업 완료 → 준비 큐로 복귀
- 프로세스 종료
🔹 선점형 스케줄링 vs 비선점형 스케줄링
📌 프로세스 상태 전환 유형
1️⃣ 실행 상태 → 대기 상태 (입출력 요청 등)
2️⃣ 실행 상태 → 준비 상태 (타이머 인터럽트 발생 등)
✅ 선점형 스케줄링 (Preemptive Scheduling)
- 1, 2번 모든 경우에서 CPU 스케줄링 가능
- 운영체제가 강제로 CPU를 회수하여 다른 프로세스에 할당할 수 있음
- 장점: CPU 자원을 독점하는 프로세스를 방지하고, 공평한 자원 배분 가능
- 단점: 문맥 교환(Context Switching)으로 인한 오버헤드 발생 가능
✅ 비선점형 스케줄링 (Non-Preemptive Scheduling)
- 1번 경우에서만 스케줄링 가능
- 프로세스가 CPU를 스스로 반납하거나 종료될 때까지 기다려야 함
- 장점: 문맥 교환 오버헤드가 적음
- 단점: 특정 프로세스가 CPU를 독점할 가능성이 있음
🔹 CPU 스케줄링 알고리즘
1️⃣ FCFS (First Come, First Served) - 선입 선처리 스케줄링
- 가장 먼저 도착한 프로세스가 먼저 CPU를 할당받아 실행된다.
- 장점: 구현이 간단하며 공정함.
- 단점: 실행 시간이 긴 프로세스가 앞에 있으면 대기 시간이 길어지는 "Convoy Effect(호위 효과)" 발생 가능.
2️⃣ SJF (Shortest Job First) - 최단 작업 우선 스케줄링
- 실행 시간이 가장 짧은 프로세스를 우선 실행.
- 장점: 평균 대기 시간을 최소화할 수 있음.
- 단점: 실행 시간을 미리 예측하기 어려움, 긴 작업이 계속해서 뒤로 밀리는 "Starvation(기아 현상)" 가능.
3️⃣ RR (Round Robin) - 라운드 로빈 스케줄링
- 일정한 Time Quantum(타임 슬라이스) 만큼 CPU를 번갈아 가며 할당.
- 장점: 모든 프로세스가 공정하게 CPU를 사용할 수 있음.
- 단점: 타임 슬라이스가 너무 짧으면 문맥 교환이 자주 발생하여 오버헤드 증가.
4️⃣ SRTF (Shortest Remaining Time First) - 최소 잔여 시간 우선 스케줄링
- SJF의 선점형 버전으로, 현재 실행 중인 프로세스보다 남은 실행 시간이 더 짧은 프로세스가 등장하면 CPU를 교체.
- 장점: 평균 대기 시간 최소화.
- 단점: 선점 과정에서 문맥 교환이 자주 발생 가능.
5️⃣ Priority Scheduling - 우선순위 스케줄링
- 프로세스마다 우선순위를 부여하고, 우선순위가 높은 순서대로 CPU 할당.
- 장점: 중요도가 높은 프로세스를 우선 실행 가능.
- 단점: 우선순위가 낮은 프로세스는 계속 실행되지 못하는 "Starvation(기아 현상)" 발생 가능.
- 해결 방법: Aging(노화) 기법을 사용하여 시간이 지날수록 우선순위를 높여주는 방식 적용.
6️⃣ Multilevel Queue Scheduling - 다단계 큐 스케줄링
- 프로세스를 여러 개의 큐로 나누고, 각 큐에 다른 스케줄링 알고리즘 적용.
- 장점: 다양한 프로세스 유형을 효율적으로 처리 가능.
- 단점: 큐 간 이동이 불가능하면 유연성이 떨어질 수 있음.
7️⃣ Multilevel Feedback Queue Scheduling - 다단계 피드백 큐 스케줄링
- 다단계 큐 스케줄링과 유사하지만, 프로세스가 큐 간 이동 가능.
- 장점: 자주 실행되는 프로세스는 우선순위를 낮추고, 긴 작업을 뒤로 미뤄 기아 현상 방지.
- 단점: 스케줄링 알고리즘이 복잡하며, 큐 이동 기준 설정이 어려움.
📌 각 스케줄링 알고리즘은 특정 환경과 요구사항에 따라 선택적으로 사용된다.
🔹 리눅스 CPU 스케줄링
리눅스는 프로세스의 특성과 우선순위에 따라 다양한 CPU 스케줄링 정책을 제공한다.
📌 리눅스 스케줄링 정책
- SCHED_FIFO: 선입 선처리 방식의 실시간(Real-Time) 스케줄러
- SCHED_RR: 라운드 로빈 방식의 실시간 스케줄러
- SCHED_NORMAL: 일반적인 프로세스 스케줄링 (CFS 사용)
- SCHED_BATCH: 배치 작업을 위한 스케줄링
- SCHED_IDLE: 우선순위가 가장 낮은 작업을 위한 스케줄링
📌 리눅스의 대표적인 스케줄러
- RT 스케줄러 (Real-Time Scheduler): 실시간 프로세스를 위해 사용.
- CFS (Completely Fair Scheduler): 일반 프로세스를 위한 공정한 CPU 스케줄링 제공.
📌 CFS의 핵심 개념: vruntime (가상 실행 시간)
- vruntime = (실행 시간 × 평균 가중치) / 프로세스의 가중치
- CPU 시간을 공정하게 나누기 위해 사용됨.
🖥️ 가상 메모리
🔹 물리 주소와 논리 주소

- 물리 주소: 하드웨어 상의 실제 메모리 주소.
- 논리 주소: 프로세스마다 부여되는 0번지부터 시작하는 주소 체계.
- MMU (Memory Management Unit): CPU와 메모리 사이에서 논리 주소를 물리 주소로 변환하는 역할을 수행.
🔹 스와핑과 연속 메모리 할당

✅ 스와핑 (Swapping)
- 스왑 영역: 보조기억장치의 일부로, 일시적으로 메모리를 비우기 위한 저장 공간.
- 스왑아웃: 실행되지 않는 프로세스를 메모리에서 스왑 영역으로 옮김.
- 스왑인: 스왑 영역에 있던 프로세스를 다시 메모리로 불러옴.
✅ 연속 메모리 할당과 외부 단편화

- 연속 메모리 할당: 프로세스에 연속적인 메모리 공간을 할당하는 방식.
- 할당 방식:
- First-Fit (최초 적합): 메모리에서 첫 번째로 적절한 공간을 찾아 할당.
- Best-Fit (최적 적합): 가장 크기가 근접한 공간을 찾아 할당.
- Worst-Fit (최악 적합): 가장 크기가 큰 공간을 찾아 할당.
- 단편화 문제:
- 외부 단편화: 사용되지 못하는 작은 공간들이 메모리에 남는 현상.
- 내부 단편화: 할당된 메모리 공간이 프로세스가 실제로 필요로 하는 크기보다 커서 낭비되는 현상.
🔹 페이징을 통한 가상 메모리 관리
-
페이징 (Paging): 프로세스의 논리 주소 공간을 고정된 크기의 페이지 단위로 나누고, 물리 주소 공간을 동일한 크기의 프레임 단위로 나눈 뒤 페이지를 프레임에 매핑하는 방식.

-
세그멘테이션 (Segmentation): 프로세스를 일정한 크기의 페이지 단위가 아닌, 의미를 가지는 가변적인 크기의 세그먼트 단위로 분할하는 방식.

- 페이지 인: 디스크에서 메모리로 페이지를 로드하는 과정.
- 페이지 아웃: 메모리에서 디스크로 페이지를 내보내는 과정.
🔹 페이지 테이블과 TLB

✅ 페이지 테이블
- 테이블 엔트리 구성:
- 페이지 번호, 프레임 번호, 유효 비트, 보호 비트, 참조 비트, 수정 비트.
- 페이지 폴트 (Page Fault):
- CPU가 참조하려는 페이지가 메모리에 없음.
- 페이지 폴트 처리 루틴 실행 → 필요한 페이지를 메모리로 적재하고 유효 비트를 1로 변경.
- 프로세스 재시작.
- 페이징의 장점: 외부 단편화 해결.
- 페이징의 단점: 내부 단편화 문제 발생 가능.
✅ TLB (Translation Lookaside Buffer) - 페이지 테이블 캐시
- TLB 히트: CPU가 참조하려는 논리 주소의 페이지 번호가 TLB에 있을 경우 빠르게 변환.
- TLB 미스: 페이지 테이블에서 변환을 수행해야 하는 경우.
- 계층적 페이징 (Hierarchical Paging): 다단계 페이지 테이블을 사용하여 메모리 사용량 절감.
🔹 페이징 주소 체계

- 페이지 번호: 페이지 테이블에서 프레임 번호를 찾는 키.
- 변위 (Offset): 페이지 내부의 특정 위치를 가리키는 값.
🔹 페이지 교체 알고리즘
✅ 요구 페이징 (Demand Paging)
- CPU가 특정 페이지에 접근하는 명령어를 실행.
- 페이지가 메모리에 있을 경우 (유효 비트가 1) → 바로 접근.
- 페이지가 메모리에 없을 경우 (유효 비트가 0) → 페이지 폴트 발생.
- 페이지 폴트 처리 루틴을 실행하여 페이지를 메모리로 로드.
- 다시 1의 과정을 반복.
✅ 페이지 교체 알고리즘
- FIFO (First-In, First-Out): 가장 먼저 메모리에 들어온 페이지를 먼저 교체.
- Optimal (OPT, 최적 페이지 교체): 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체.
- LRU (Least Recently Used): 가장 오랫동안 사용되지 않은 페이지를 교체.
🖥️ 파일 시스템
📂 파일과 디렉터리
📄 파일(File)
파일은 데이터를 저장하는 기본 단위로, 다양한 속성과 정보를 포함한다.
- 속성(Attribute): 파일 크기, 생성/수정 날짜, 접근 권한 등.
- 메타데이터(Metadata): 파일에 대한 추가적인 정보를 포함.
- 파일 디스크립터(File Descriptor, 파일 핸들):
- 운영체제가 파일을 식별하는 정수형 값(0 이상의 정수).
- 입출력 장치, 파이프, 소켓도 파일로 취급하여 파일 디스크립터를 통해 식별함.
📁 디렉터리(Directory)
디렉터리는 파일을 체계적으로 관리하기 위한 트리 구조를 가진다.
- 루트 디렉터리(Root Directory): 최상위 디렉터리.
- 경로(Path): 특정 파일 또는 디렉터리의 위치.
- 디렉터리 엔트리(Directory Entry): 디렉터리에 포함된 요소(파일, 서브디렉터리)의 정보.
📦 파일 할당

- 파일과 디렉터리는 블록 단위로 읽고 씀.
- 블록(Block): 일반적으로 4096바이트(4KB) 크기.
- 할당 방식:
- 연결 할당(Linked Allocation): 블록이 링크로 연결됨.
- 색인 블록(Index Block): 색인 테이블을 통해 블록 관리.
- 색인 할당(Index Allocation): 파일의 블록 위치를 직접 저장.
🗂️ 파일 시스템
파일 시스템은 파일을 저장하고 관리하는 방식으로, 운영체제에 따라 여러 종류가 있다.
🏗️ 주요 개념
- 파티셔닝(Partitioning)
- 보조기억장치를 논리적으로 나누어 여러 개의 파일 시스템을 사용할 수 있도록 영역을 구분하는 작업.
- 포매팅(Formatting)
- 파일 시스템을 설정하여 데이터를 저장할 준비를 하는 과정.
💻 운영체제별 파일 시스템 종류
- Windows: NTFS, ReFS
- Linux: EXT, EXT2, EXT3, EXT4, XFS, ZFS 등
- macOS: APFS
🏷️ 아이노드(Inode) 기반 파일 시스템
아이노드는 파일의 메타데이터와 데이터 블록 위치를 저장하는 구조체이다.

- 각 파일은 고유한 아이노드 번호(Inode Number)를 가짐.
- 데이터 블록을 가리키며 파일의 크기, 권한, 소유자 등의 정보 포함.
- 아이노드 공간이 가득 차면 새로운 파일을 생성할 수 없음.
EXT4 파일 시스템의 구조
- 슈퍼블록(Superblock): 파일 시스템의 전체 정보 저장.
- 그룹 식별자(Group Descriptor): 블록 그룹 정보를 저장.
- 블록 비트맵(Block Bitmap): 사용 가능한 블록을 관리.
- 아이노드 비트맵(Inode Bitmap): 사용 가능한 아이노드를 관리.
- 아이노드 테이블(Inode Table): 파일의 메타데이터 저장.
- 데이터 블록(Data Block): 실제 파일 데이터가 저장되는 공간.
🔗 하드링크 vs 심볼릭 링크

🔗 하드링크 (Hard Link)
- 원본 파일과 같은 아이노드를 공유하는 파일.
- 원본 파일이 삭제되더라도 하드링크가 남아있다면 데이터 접근 가능.
🔗 심볼릭 링크 (Symbolic Link, Soft Link)
- 원본 파일을 가리키는 경로 정보만 저장하는 파일.
- 원본 파일이 삭제되거나 이동되면 심볼릭 링크는 무효화됨.
📌 마운트(Mount)
마운트란 운영체제가 외부 저장 장치나 파일 시스템을 특정 디렉터리에 연결하는 과정.
🛠️ 마운트 명령어 (Linux)
sudo mount /dev/sdb1 /mnt
ls /mnt
🛠️ 마운트 해제
sudo umount /mnt
Ref. 📗《이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접》, 강민철