Don't Panic
in CS ☕ 16분 읽기

[CS] 운영체제 핵심 — 프로세스·스케줄링·메모리 관리 완전 정리

#CS
목차

운영체제란

하드웨어를 연결하고 응용 프로그램과 하드웨어 사이에서 인터페이스 역할을 하며 시스템의 동작을 제어하는 시스템 소프트웨어. 시스템의 자원과 동작을 관리한다.

관리 영역주요 항목
프로세스 관리프로세스·스레드, 스케줄링, 동기화, IPC 통신
저장장치 관리메모리 관리, 가상 메모리, 파일 시스템
네트워킹TCP/IP, 기타 프로토콜
사용자 관리계정 관리, 접근권한 관리
디바이스 드라이버순차·임의·네트워크 접근 장치

프로세스 관리

운영체제에서 작동하는 응용 프로그램을 관리하는 기능. CPU를 점유할 프로세스를 결정하고 실제로 CPU를 할당하며, 프로세스 간 공유 자원 접근과 통신을 관리한다.

저장장치 관리

  • 1차 저장장치(Main Memory): 프로세스에 할당하는 메모리 영역의 할당·해제, 영역 간 침범 방지, 가상 메모리 기능
  • 2차 저장장치(HDD, NAND Flash 등): 파일 형식 데이터 저장, FAT·NTFS·EXT2·JFS·XFS 등 파일 시스템 관리

네트워킹

TCP/IP 기반 인터넷 연결 또는 응용 프로그램이 네트워크를 사용하려면 OS에서 네트워크 프로토콜을 지원해야 한다.

사용자 관리

한 컴퓨터를 여러 사람이 사용하는 환경을 지원한다. 계정별 파일 접근 권한을 지정·제한하는 기능을 담당한다.

디바이스 드라이버

하드웨어를 OS에서 인식하고 관리하여 응용 프로그램이 사용할 수 있게 해주는 추상화 계층.


프로세스 & 스레드

  • 프로세스: 프로그램을 메모리 상에서 실행 중인 작업
  • 스레드: 프로세스 안에서 실행되는 여러 흐름 단위. 기본적으로 프로세스마다 최소 1개의 스레드(메인 스레드)를 소유

프로세스와 스레드 메모리 구조

프로세스는 각각 별도의 주소 공간을 할당받는다(독립적).

영역내용
Code코드 자체를 구성하는 메모리 영역 (프로그램 명령)
Data전역변수, 정적변수, 배열 등 (초기화된 것은 data, 미초기화는 bss 영역)
Heap동적 할당 시 사용 (new(), malloc() 등)
Stack지역변수, 매개변수, 리턴 값 (임시 메모리 영역)

스레드는 Stack만 따로 할당받고, 나머지 영역(Code·Data·Heap)은 같은 프로세스의 스레드끼리 공유한다.

멀티프로세스

하나의 컴퓨터에 여러 CPU를 장착하여 하나 이상의 프로세스를 동시에 처리(병렬).

  • 장점: 안전성 — 메모리 침범 문제를 OS 차원에서 해결
  • 단점: 각각 독립된 메모리 영역을 가지므로 작업량이 많을수록 오버헤드 발생. Context Switching으로 인한 성능 저하

Context Switching

프로세스의 상태 정보를 저장하고 복원하는 일련의 과정. 동작 중인 프로세스가 대기 상태로 전환될 때 해당 프로세스의 상태를 보관하고, 다음 프로세스가 이전에 보관된 상태를 복구하여 실행하는 과정.

프로세스가 Ready → Running, Running → Ready, Running → Waiting 상태로 변경될 때 발생.

프로세스는 독립된 메모리 영역을 할당받으므로, 캐시 메모리 초기화 같은 무거운 작업이 진행될 때 오버헤드가 발생한다.

멀티스레드

하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것. 스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리한다.

  • 장점: 독립적인 프로세스에 비해 공유 메모리만큼 시간·자원 손실 감소. 전역 변수와 정적 변수에 대한 자료 공유 가능
  • 단점: 하나의 스레드가 데이터 공간을 망가뜨리면 모든 스레드가 작동 불능 상태가 됨 → Critical Section 기법으로 대비

프로세스 주소 공간

프로그램이 CPU에 의해 실행되면 프로세스가 생성되고 메모리에 프로세스 주소 공간이 할당된다.

세그먼트저장 내용
코드(Code)프로그램 소스 코드
데이터(Data)전역 변수
스택(Stack)함수, 지역 변수

구역을 나누는 이유: 최대한 데이터를 공유하여 메모리 사용량을 줄이기 위함.

  • Code는 같은 프로그램 내에서 모두 같은 내용이므로 따로 관리하여 공유.
  • Stack과 Data를 나누는 이유는 스택 구조의 특성(LIFO)과 전역 변수의 활용성 때문.

프로세스 주소 공간


인터럽트(Interrupt)

프로그램 실행 도중 예기치 않은 상황이 발생할 때, 현재 실행 중인 작업을 즉시 중단하고 발생된 상황에 대한 우선 처리가 필요함을 CPU에게 알리는 것.

종류설명예시
외부 인터럽트CPU 하드웨어 신호. 외부적 요인으로 발생전원 이상, 기계 착오, 외부 신호, 입출력
내부 인터럽트Trap이라 부름. 잘못된 명령이나 데이터 사용 시 발생0으로 나누기, 오버플로우, 명령어 오사용 (Exception)
소프트웨어 인터럽트명령의 요청에 의해 발생 (SVC 인터럽트)프로그램 실행 시, 다른 프로세스 실행 시 자원 할당

인터럽트 발생 처리 과정

인터럽트 발생 처리 과정

  1. 주 프로그램 실행 중 인터럽트 발생
  2. 현재 수행 중인 프로그램을 멈추고 상태 레지스터와 PC 등을 스택에 임시 저장
  3. 인터럽트 서비스 루틴(ISR) 실행
  4. ISR 완료 후 저장된 상태를 복원하여 원래 작업으로 복귀

만약 인터럽트 기능이 없다면, 컨트롤러는 특정 일을 처리할 시기를 알기 위해 계속 체크(폴링, Polling)해야 한다.

우선순위 판별 방법

방식설명속도
폴링(Polling)인터럽트 요청 플래그를 차례로 비교하여 우선순위가 높은 인터럽트를 찾는 방식느림
인터럽트 방식MCU 자체가 하드웨어적으로 변화를 체크 (Daisy Chain, 병렬 우선순위 부여)빠름

인터럽트는 발생 시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법이다.


System Call

fork(), exec(), wait()와 같은 것들은 프로세스 생성과 제어를 위한 System Call.

fork

새로운 Process를 생성할 때 사용.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    printf("pid : %d", (int) getpid()); // pid : 29146

    int rc = fork();					// 주목

    if (rc < 0) {
        exit(1);
    }									// (1) fork 실패
    else if (rc == 0) {					// (2) child 인 경우 (fork 값이 0)
        printf("child (pid : %d)", (int) getpid());
    }
    else {								// (3) parent case
        printf("parent of %d (pid : %d)", rc, (int)getpid());
    }
}

출력 예시:

pid : 29146
parent of 29147 (pid : 29146)
child (pid : 29147)

parent와 child의 순서는 non-deterministic — scheduler가 결정한다.

fork()가 실행되는 순간 프로세스가 하나 더 생기며, 생성된 Child 프로세스는 Parent와 거의 동일한 복사본을 갖는다. 단, fork() 반환값이 다르다.

프로세스fork() 반환값
Parentchild의 PID 값
Child0

wait

child 프로세스가 종료될 때까지 기다리는 작업.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
    printf("pid : %d", (int) getpid()); // pid : 29146

    int rc = fork();					// 주목

    if (rc < 0) {
        exit(1);
    }									// (1) fork 실패
    else if (rc == 0) {					// (2) child 인 경우 (fork 값이 0)
        printf("child (pid : %d)", (int) getpid());
    }
    else {								// (3) parent case
        int wc = wait(NULL)				// 추가된 부분
        printf("parent of %d (wc : %d / pid : %d)", wc, rc, (int)getpid());
    }
}

wait()는 child가 끝나기 전에는 return하지 않으므로, parent가 먼저 실행되더라도 반드시 child가 먼저 완료된다.

exec

단순 fork는 동일한 프로세스 내용을 여러 번 동작할 때 사용한다. child에서 parent와 다른 동작을 하고 싶을 때 exec를 사용한다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
    printf("pid : %d", (int) getpid()); // pid : 29146

    int rc = fork();					// 주목

    if (rc < 0) {
        exit(1);
    }									// (1) fork 실패
    else if (rc == 0) {					// (2) child 인 경우 (fork 값이 0)
        printf("child (pid : %d)", (int) getpid());
        char *myargs[3];
        myargs[0] = strdup("wc");		// 내가 실행할 파일 이름
        myargs[1] = strdup("p3.c");		// 실행할 파일에 넘겨줄 argument
        myargs[2] = NULL;				// end of array
        execvp(myarges[0], myargs);		// wc 파일 실행.
        printf("this shouldn't print out") // 실행되지 않음.
    }
    else {								// (3) parent case
        int wc = wait(NULL)				// 추가된 부분
        printf("parent of %d (wc : %d / pid : %d)", wc, rc, (int)getpid());
    }
}

execvp(실행 파일, 전달 인자) 함수는 code segment 영역에 실행 파일의 코드를 덮어 씌운다. 이후 heap·stack·다른 메모리 영역이 초기화되고 OS가 그냥 실행한다. 새로운 Process를 생성하지 않고 현재 프로그램에 wc 파일을 실행하므로, execvp() 이후 부분은 실행되지 않는다.


PCB & Context Switching

PCB (Process Control Block)

CPU가 여러 프로세스를 관리하기 위해 각 프로세스의 특징(Process Metadata)을 저장하는 자료구조.

Process Metadata 항목: Process ID, Process State, Process Priority, CPU Registers, Owner, CPU Usage, Memory Usage

PCB 구조

동작 흐름: 프로그램 실행 → 프로세스 생성 → 주소 공간(코드·데이터·스택) 생성 → 메타데이터가 PCB에 저장

PCB가 필요한 이유: CPU에서 프로세스 상태에 따라 교체 작업이 이루어질 때(interrupt 발생 → waiting 상태 → 다른 프로세스 running), 다시 수행할 대기 중인 프로세스의 저장 값을 PCB에 보관하기 위해.

PCB 관리 방식: Linked List. PCB List Head에 PCB가 생성될 때마다 추가되며, 프로세스가 완료되면 제거된다.

Context Switching

CPU가 이전 프로세스의 상태를 PCB에 보관하고, 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정.

발생 조건: 인터럽트 발생, CPU 사용 허가시간 소모, 입출력을 위한 대기

오버헤드를 감수하는 이유: 프로세스가 입출력 이벤트로 대기 상태가 될 때, CPU를 놀리지 않고 다른 프로세스를 실행시키는 것이 효율적이기 때문.


IPC (Inter Process Communication)

프로세스는 독립적으로 실행되므로 다른 프로세스에게 영향을 받지 않는다. 이런 독립적인 프로세스 간의 통신을 가능하게 해주는 것이 IPC 통신. 프로세스는 커널이 제공하는 IPC 설비를 이용한다.

IPC 개요

커널: 운영체제의 핵심 부분으로, 다른 모든 부분에 여러 기본적인 서비스를 제공해준다.

IPC 종류

종류방향특징
익명 PIPE단방향 (반이중)두 프로세스 연결. 양방향 통신 시 파이프 2개 필요. 간단하지만 관계 알고 있는 프로세스 간에만 사용
Named PIPE (FIFO)단방향 (반이중)익명 파이프 확장. 관계 없는 프로세스 간 통신 가능. 양방향 시 2개 필요
Message Queue단방향파이프와 달리 메모리 공간을 사용. 데이터에 번호를 붙여 여러 프로세스가 동시에 다룰 수 있음
공유 메모리양방향데이터 자체를 공유. 커널에 메모리 공간 할당 요청 후 모든 프로세스 접근 가능. IPC 중 가장 빠름
메모리 맵양방향열린 파일을 메모리에 매핑하여 공유. 대용량 파일 데이터 공유에 적합
소켓양방향네트워크 소켓 통신. 원격 프로세스 간 데이터 공유. 서버(bind·listen·accept), 클라이언트(connect)

IPC 통신에서 프로세스 간 데이터를 동기화하고 보호하기 위해 세마포어뮤텍스를 사용한다.


CPU 스케줄링

CPU를 잘 사용하기 위해 프로세스를 잘 배정하는 것.

  • 조건: 오버헤드 ↓ / 사용률 ↑ / 기아 현상 ↓
  • 목표: Batch System(처리량 중시), Interactive System(빠른 응답), Real-time System(기한 준수)

선점 / 비선점 스케줄링

방식설명
선점 (Preemptive)OS가 CPU 사용권을 강제 회수할 수 있음
비선점 (Nonpreemptive)프로세스 종료 또는 I/O 이벤트가 있을 때까지 실행 보장 (처리시간 예측 어려움)

프로세스 상태 전이

프로세스 상태 전이

전이설명
승인 (Admitted)프로세스 생성이 가능하여 승인
스케줄러 디스패치준비 상태 프로세스 중 하나를 선택하여 실행
인터럽트예외·입출력·이벤트 발생 → 실행 중 프로세스를 준비 상태로 전환
I/O or Event Wait실행 중 프로세스가 입출력/이벤트 처리 → 대기 상태로 전환
I/O or Event Completion입출력/이벤트 완료 → 준비 상태로 전환

CPU 스케줄링 알고리즘

비선점 스케줄링

알고리즘설명특징
FCFS (First Come First Served)큐에 도착한 순서대로 CPU 할당실행 시간 짧은 프로세스가 뒤로 가면 평균 대기 시간 길어짐
SJF (Shortest Job First)수행 시간이 가장 짧은 작업을 먼저 수행FCFS보다 평균 대기 시간 감소. 짧은 작업에 유리
HRN (Highest Response-ratio Next)우선순위 = (대기시간 + 실행시간) / 실행시간SJF의 단점(기아) 보완

선점 스케줄링

알고리즘설명특징
Priority Scheduling우선순위가 높은 순서대로 처리Starvation 발생 가능 → Aging 방법으로 해결
Round Robin각 프로세스에 동일한 Time Quantum 할당Time Quantum 크면 FCFS와 유사, 작으면 Context Switching 증가
Multilevel-Queue작업을 여러 그룹으로 나누어 여러 큐 이용큐마다 다른 Time Quantum 설정 (높은 우선순위 큐 = 작은 Time Quantum)
Multilevel-Feedback-QueueTime Quantum을 다 채운 프로세스는 하위 큐로 이동짧은 작업·입출력 위주 작업에 우선권. Turnaround 평균 시간 단축

Multilevel-Queue

Multilevel-Queue 우선순위

Multilevel-Feedback-Queue

CPU 스케줄링 척도

척도설명
Response Time작업이 처음 실행되기까지 걸린 시간
Turnaround Time실행 시간 + 대기 시간 (작업이 완료될 때까지 걸린 시간)

데드락 (DeadLock)

프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태. 교착 상태라고도 부른다. 시스템의 한정된 자원을 여러 곳에서 사용하려 할 때 발생한다.

데드락 발생 예시

프로세스1과 2가 자원1, 2를 모두 얻어야 한다고 가정:

  • t1: 프로세스1이 자원1을 얻음 / 프로세스2가 자원2를 얻음
  • t2: 프로세스1은 자원2를 기다림 / 프로세스2는 자원1을 기다림 → 서로 원하는 자원이 상대방에 할당되어 두 프로세스가 무한정 wait 상태에 빠짐

데드락 발생 조건 (4가지 모두 성립해야 발생)

조건설명
상호 배제 (Mutual Exclusion)자원은 한번에 한 프로세스만 사용 가능
점유 대기 (Hold and Wait)자원을 점유한 채 다른 자원을 추가로 점유하기 위해 대기
비선점 (No Preemption)다른 프로세스에 할당된 자원은 강제로 빼앗을 수 없음
순환 대기 (Circular Wait)프로세스들이 순환 형태로 자원을 대기

데드락 처리 방법

예방 & 회피

방법설명
예방 (Prevention)발생 조건 4가지 중 하나를 제거 (자원 낭비 심함)
회피 (Avoidance)은행원 알고리즘: 자원 할당 후에도 안정 상태가 유지되는지 사전 검사. 안정 상태면 할당, 아니면 대기

탐지 & 회복

방법설명
탐지 (Detection)자원 할당 그래프를 통해 교착 상태 탐지. 탐지 알고리즘 실행 시 오버헤드 발생
회복 (Recovery)교착 상태 일으킨 프로세스를 종료하거나 자원을 해제

프로세스 종료 방법: 교착 상태 프로세스 모두 중지 / 교착 상태 제거될 때까지 하나씩 중지

자원 선점 방법: 교착 상태 프로세스의 자원을 선점하여 다른 프로세스에 할당 (우선순위 낮은 프로세스 위주)

식사하는 철학자 문제 (기아 상태 예시) 해결책:

  1. n명이 앉을 수 있는 테이블에 철학자를 n-1명만 앉힘
  2. 젓가락 두 개를 모두 집을 수 있는 상황에서만 집도록 허용
  3. 누군가는 오른쪽 젓가락을 먼저 집도록 허용

경쟁 상태 (Race Condition)

공유 자원에 대해 여러 프로세스가 동시에 접근할 때 결과값에 영향을 줄 수 있는 상태. 동시 접근 시 자료의 일관성을 해치는 결과가 나타난다.

Race Condition 발생 경우

상황문제해결법
커널 작업 중 인터럽트 발생커널 모드에서 데이터 로드 중 인터럽트가 같은 데이터를 조작커널 모드 작업 중 인터럽트를 disable하여 CPU 제어권 차단
System Call로 커널 모드 진입 중 문맥 교환프로세스1이 커널 모드에서 데이터 조작 중 시간 초과로 프로세스2에게 CPU 제어권 이전커널 모드에서 작업 중에는 시간 초과되어도 CPU 제어권을 넘기지 않음
멀티 프로세서 환경에서 공유 메모리 커널 데이터 접근2개의 CPU가 동시에 커널 내부 공유 데이터를 조작공유 데이터 접근 시마다 lock/unlock

세마포어 (Semaphore) & 뮤텍스 (Mutex)

공유된 자원의 데이터는 한번에 하나의 프로세스만 접근할 수 있도록 제한이 필요하다.

세마포어

멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법.

임계 구역 (Critical Section): 여러 프로세스가 데이터를 공유하며 수행될 때, 각 프로세스에서 공유 데이터를 접근하는 코드 부분. 한 프로세스가 임계 구역을 수행할 때 다른 프로세스가 접근하지 못하도록 해야 한다.

세마포어 P, V 연산

연산시점동작
P임계 구역 진입 전자원의 개수(S)를 통해 진입 여부 결정
V임계 구역 退출 시자원 반납 알림, 대기 중인 프로세스를 깨우는 신호
P(S);

// --- 임계 구역 ---

V(S)
procedure P(S)   --> 최초 S값은 1임
    while S=0 do wait  --> S가 0면 1이 될때까지 기다려야 함
    S := S-1   --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함
end P

--- 임계 구역 ---

procedure V(S) --> 현재상태는 S가 0임
    S := S+1   --> S를 1로 원위치시켜 해제하는 과정
end V

P와 V를 사용하여 임계 구역에 대한 상호배제 구현이 가능하다.

뮤텍스

임계 구역을 가진 스레드들의 실행 시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술. 상호 배제(Mutual Exclusion)의 약자.

  • lock: 임계 구역에 들어갈 권한을 얻어옴 (다른 프로세스/스레드가 수행 중이면 종료까지 대기)
  • unlock: 임계 구역 사용 완료 알림 (대기 중인 다른 프로세스/스레드가 진입 가능)

뮤텍스는 상태가 0, 1로 이진 세마포어라고도 부른다.

뮤텍스 알고리즘

1. 데커(Dekker) 알고리즘

flag와 turn 변수를 통해 임계 구역에 들어갈 프로세스/스레드를 결정하는 방식.

while(true) {
    flag[i] = true; // 프로세스 i가 임계 구역 진입 시도
    while(flag[j]) { // 프로세스 j가 현재 임계 구역에 있는지 확인
        if(turn == j) { // j가 임계 구역 사용 중이면
            flag[i] = false; // 프로세스 i 진입 취소
            while(turn == j); // turn이 j에서 변경될 때까지 대기
            flag[i] = true; // j turn이 끝나면 다시 진입 시도
        }
    }
}

// ------- 임계 구역 ---------

turn = j; // 임계 구역 사용 끝나면 turn을 넘김
flag[i] = false; // flag 값을 false로 바꿔 임계 구역 사용 완료를 알림

2. 피터슨(Peterson) 알고리즘

데커와 유사하지만, 상대방 프로세스/스레드에게 진입 기회를 양보하는 것에 차이가 있다.

while(true) {
    flag[i] = true; // 프로세스 i가 임계 구역 진입 시도
    turn = j; // 다른 프로세스에게 진입 기회 양보
    while(flag[j] && turn == j) { // 다른 프로세스가 진입 시도하면 대기
    }
}

// ------- 임계 구역 ---------

flag[i] = false; // flag 값을 false로 바꿔 임계 구역 사용 완료를 알림

3. 제과점(Bakery) 알고리즘

여러 프로세스/스레드에 대한 처리가 가능한 알고리즘. 가장 작은 번호표를 가진 프로세스가 임계 구역에 진입한다.

while(true) {

    isReady[i] = true; // 번호표 받을 준비
    number[i] = max(number[0~n-1]) + 1; // 현재 실행 중인 프로세스 중에 가장 큰 번호 배정
    isReady[i] = false; // 번호표 수령 완료

    for(j = 0; j < n; j++) { // 모든 프로세스 번호표 비교
        while(isReady[j]); // 비교 프로세스가 번호표 받을 때까지 대기
        while(number[j] && number[j] < number[i] && j < i);

        // 프로세스 j가 번호표 가지고 있어야 함
        // 프로세스 j의 번호표 < 프로세스 i의 번호표
    }
}

// ------- 임계 구역 ---------

number[i] = 0; // 임계 구역 사용 종료

페이징과 세그먼테이션

다중 프로그래밍 시스템에서 여러 프로세스를 수용하기 위해 주기억장치를 동적으로 분할하는 메모리 관리 기법.

메모리 관리 기법

기법방식단편화
연속 메모리 관리 - 고정 분할주기억장치를 고정된 파티션으로 분할내부 단편화 발생
연속 메모리 관리 - 동적 분할파티션을 동적으로 생성하여 같은 크기 파티션에 적재외부 단편화 발생
불연속 - 단순 페이징프로세스를 균등 페이지로 나눔. 고정 크기외부 단편화 X, 소량의 내부 단편화 존재
불연속 - 단순 세그먼테이션프로세스를 여러 세그먼트로 나눔. 가변 크기내부 단편화 X, 외부 단편화 존재
가상 메모리 페이징필요한 페이지만 로드, 나머지는 나중에 자동 로드외부 단편화 X, 복잡한 관리로 오버헤드 발생
가상 메모리 세그먼테이션필요한 세그먼트만 로드내부 단편화 X, 복잡한 관리로 오버헤드 발생
  • 페이지: 고정 사이즈의 작은 프로세스 조각
  • 프레임: 페이지 크기와 같은 주기억장치 메모리 조각
  • 세그먼트: 서로 다른 크기를 가진 논리적 블록이 연속적 공간에 배치되는 것
  • 단편화: 기억 장치의 빈 공간 또는 자료가 여러 조각으로 나뉘는 현상

페이지 교체 알고리즘

페이지 부재 발생 → 새로운 페이지를 할당해야 함 → 현재 할당된 페이지 중 어떤 것을 교체할지 결정하는 방법

가상 메모리는 요구 페이지 기법을 통해 필요한 페이지만 메모리에 적재한다. 메모리가 가득 차면 사용하지 않는 페이지(victim page)를 out하고 현재 필요한 페이지를 in 시킨다.

수정되지 않은 페이지를 victim으로 선택하는 것이 유리하다 (수정된 페이지는 디스크에도 반영해야 하므로 시간 소요).

Page Reference String

CPU의 주소 요구에 따라 페이지 결함이 일어나지 않는 부분은 생략하여 표시하는 방법.

페이지 교체 알고리즘 종류

알고리즘설명특징
FIFO메모리에 먼저 올라온 페이지를 먼저 내보냄가장 간단. 초기화 코드에 적합
OPT (Optimal)앞으로 가장 사용하지 않을 페이지를 먼저 내보냄페이지 결함 횟수 최소화. 미래 예측 불가로 실질적 사용 어려움
LRU (Least Recently Used)최근에 사용하지 않은 페이지를 먼저 내보냄과거를 기반으로 판단. 실제 사용 가능한 알고리즘 중 가장 우수

FIFO 알고리즘

OPT 알고리즘

LRU 알고리즘

교체 방식

방식설명
Global 교체메모리 상의 모든 프로세스 페이지에 대해 교체 (더 효율적)
Local 교체자기 프로세스 페이지에서만 교체 (각각 교체해야 하므로 비효율적)

오버헤드 감소 방법

  1. 변경 비트 활용: victim 페이지의 변경 비트를 확인하여 디스크에 기록할 필요가 있는 페이지만 기록 (디스크 기록 횟수를 최대 절반 감소)
  2. 적절한 알고리즘 선택: 현재 상황에서 페이지 폴트 발생 확률을 최대한 줄여주는 교체 알고리즘 사용

메모리 (Memory)

메인 메모리 (Main Memory)

CPU가 직접 접근할 수 있는 기억 장치. 프로세스가 실행되려면 프로그램이 메모리에 올라와야 한다.

CPU는 레지스터가 지시하는 대로 메모리에 접근하여 다음 명령어를 가져온다. 명령어 수행 시 필요한 데이터가 없으면 **MMU(메모리 관리장치)**가 논리 주소를 물리 주소로 변환하여 데이터를 가져온다.

메모리 공간의 한계를 극복하기 위해 가상 주소 개념이 등장했으며, MMU가 빠른 주소 변환을 담당한다.

MMU의 메모리 보호

프로세스는 독립적인 메모리 공간을 가져야 하며, 자신의 공간에만 접근해야 한다.

MMU 메모리 보호

  • base 레지스터: 프로세스 시작 주소를 물리 주소로 저장
  • limit 레지스터: 프로세스의 크기를 저장

프로세스가 접근 가능한 합법적 메모리 영역:

base <= x < base+limit

이 영역 밖에서 접근하면 trap을 발생시킨다. base와 limit 레지스터는 커널 모드에서만 수정 가능.

메모리 과할당 (Over Allocating)

실제 메모리 크기보다 더 큰 메모리를 프로세스에 할당한 상황. 가상 메모리로 사용자에게 눈속임을 한다.

과할당 발생 시 처리:

  1. 메모리에 올라와 있는 프로세스 하나를 종료하여 빈 프레임 확보 (페이징 시스템이 사용자에게 드러날 수 있어 지양)
  2. 프로세스 하나를 swap out하여 빈 프레임으로 활용 (권장)

지역성 (Locality)

기억 장치 내의 정보를 균일하게 액세스하지 않고, 한 순간에 특정 부분을 집중적으로 참조하는 특성. 캐시 적중률 극대화에 활용된다.

종류설명
시간 지역성최근에 참조된 주소는 곧 다음에도 참조될 가능성이 높음
공간 지역성참조된 주소와 인접한 주소가 다시 참조될 가능성이 높음

캐싱 라인

캐시에 데이터를 저장할 때 자료구조를 활용해 묶어서 저장하는 방식. 데이터의 메모리 주소를 함께 저장하여 빠르게 원하는 정보를 찾을 수 있다 (set, map 등 활용).


파일 시스템 (File System)

컴퓨터에서 파일이나 자료를 쉽게 발견할 수 있도록 유지 및 관리하는 방법.

항목내용
특징커널 영역에서 동작, 계층적 디렉터리 구조, 디스크 파티션별로 하나씩
역할파일 관리, 보조 저장소 관리, 파일 무결성 메커니즘, 접근 방법 제공
개발 목적하드디스크와 메인 메모리 속도차 완화, 파일 관리, 하드디스크 용량 효율적 이용
구조메타 영역(파일 이름·위치·크기·시간정보 등) + 데이터 영역(파일 데이터)

접근 방법

1. 순차 접근 (Sequential Access)

현재 위치 포인터에서 시스템 콜 발생 시 포인터를 앞으로 이동하며 read/write. 뒤로 돌아갈 때는 지정한 offset만큼 되감기 필요 (테이프 모델 기반).

순차 접근

2. 직접 접근 (Direct Access)

특별한 순서 없이 빠르게 레코드를 read/write 가능. cp 변수로 현재 위치 유지. 무작위 파일 블록에 대한 임의 접근 허용. 데이터베이스에 활용.

직접 접근

3. 기타 접근

직접 접근 파일에 기반하여 색인을 구축. 크기가 큰 파일의 입출력 탐색을 도와줌.

기타 접근

디렉터리 구조

구조설명
1단계 디렉터리가장 간단한 구조. 모든 파일이 유일한 이름을 가져야 함. 다른 사용자도 같은 이름 사용 불가
2단계 디렉터리사용자별 개별 디렉터리(UFD) 제공. MFD로 사용자 이름·계정번호로 색인
트리 구조 디렉터리2단계 구조의 확장. 일반 파일(0)/디렉터리 파일(1)을 1비트로 구분
그래프 구조 디렉터리링크를 통해 파일 공유. 순환 방지를 위해 하위 디렉터리가 아닌 파일에만 링크 허용 또는 가비지 컬렉션으로 처리

1단계 디렉터리

2단계 디렉터리

트리 구조 디렉터리

그래프 구조 디렉터리


참조: https://gyoogle.dev/blog/computer-science/operating-system/Operation%20System.html

여길 보면서 면접 대비로 눈으로 보는것 보다 한줄 씩 다 적어보면서 베끼기만 하려는 것이 아닌 이해하려고 최대한 노력했다.