Computer Science
[이것이 컴퓨터 과학이다] 2. 운영체제
yjhan1999
2025. 7. 3. 22:25
운영체제
운영체제는 프로그램들 간의 올바른 실행을 돕고, 앞서 컴퓨터 구조에서 학습했던 다양한 HW 자원을 프로그램에 배분하는 프로그램이다. 사실상 HW를 작동시키는 프로그램으로, 컴퓨터 전체에서 가장 중요한 프로그램이라고 봐도 과언이 아니다.
프로세스와 스레드
- 메모리에는 컴퓨터가 실행되는 순간부터 다양한 프로세스들이 적재되어 실행된다.
- 프로세스의 유형 : 포그라운드 프로세스(사용자가 보는 공간에서 사용자와 상호작용하며 실행됨), 백그라운드 프로세스(사용자가 보지 못하는 곳에서 실행됨), 데몬
- 프로세스의 유형을 막론하고 하나의 프로세스를 구성하는 메모리 내의 정보는 크게 다르지 않다.
- 프로세스 정보가 저장되는 메모리 영역 중 사용자 영역에 배치되는 영역
- 코드 영역 : 실행 가능한 명령어가 저장되는 공간, 텍스트 영역이라고도 부름, 읽기 전용
- 데이터 영역 : 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간(Ex : 정적 변수나 전역 변수)
- 힙 영역 : 개발자가 직접 할당 가능한 저장 공간(메모리 누수 방지 위해 가비지 컬렉션 기능)
- 스택 영역 : 데이터 영역에 담기는 값과는 달리 일시적으로 사용할 값들이 저장되는 공간(Ex : 매개변수, 지역변수, 함수 복귀 주소 등)
- PCB와 문맥 교환
- PCB : 프로세스를 식별할 수 있는 커널 영역 내의 정보 -> 운영체제가 메모리에 적재된 다수의 프로세스를 관리하기 위해 필요
- 프로세스 ID(PID), 프로세스가 실행 과정에서 사용한 레지스터 값, 프로세스 상태, CPU 스케줄링(우선순위) 정보, 메모리 관련 정보(프로세스의 메모리 상 적재 위치를 알 수 있는), 파일 입출력장치 관련 정보
- 프로세스가 실행된다 = 운영체제에 의해 CPU의 자원을 할당받았다
- 프로세스의 CPU 사용 시간은 타이머 인터럽트(타임아웃 인터럽트)에 의해 제한된다
- 따라서 각 프로세스는 프로그램 카운터를 비롯한 각종 레지스터 값과 메모리 정보, 실행을 위해 열었던 파일 등 중간 정보를 백업해야 한다. 그래야 다시 실행할 차례가 되었을 때 이전에 실행했던 수행을 재개할 수 있기 때문이다
- 프로세스의 수행을 재개하기 위해 기억해야 할 정보 : 문맥(PCB에 명시됨)
- 문맥 교환(Context Switching) : 기존 프로세스의 문맥을 PCB에 백업하고, PCB에서 문맥을 복구하여 새로운 프로세스를 실행하는 것
- 프로세스 간 문맥 교환 자주 발생 : 캐시 미스 발생할 가능성 높음 -> 메모리로부터 실행할 프로세스 내용을 가져오는 작업 빈번해짐 -> 큰 오버헤드로 이어질 수 있음
- PCB : 프로세스를 식별할 수 있는 커널 영역 내의 정보 -> 운영체제가 메모리에 적재된 다수의 프로세스를 관리하기 위해 필요
- 프로세스의 상태
- 생성(new) : 프로세스를 생서 중인 상태로, 메모리에 적재되어 PCB를 할당받은 상태
- 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비 상태가 되어 CPU 할당을 기다림
- 준비(ready) : 당장이라도 CPU를 할당받아 실행 가능하지만, 자신의 차례가 아니기 때문에 기다리고 있는 상태
- 준비 상태인 프로세스가 CPU를 할당받으면 실행 상태가 되며, 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch)라 함
- 실행(running) : CPU를 할당받아 실행 중인 상태로, 일정 시간 동안만 CPU를 사용할 수 있다.
- 타이머 인터럽트가 발생하여 프로세스가 할당된 시간을 모두 사용하면 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 하면 대기 상태가 된다
- 대기(blocked) : 프로세스가 입출력 작업을 요청하거나 바로 확보할 수 없는 자원을 요청하는 등 곧장 실행이 불가능한 조건에 놓이는 경우 대기 상태가 된다
- 대기 상태로 전환되는 상황은 다양하지만, 입출력 작업을 요청하는 경우가 대표적이다. 대기 상태였던 해당 프로세스는 입출력 작업이 완료되는 등 실행 가능한 상태가 되면 다시 준비 상태가 되어 CPU 할당을 기다린다
- 종료(terminated) : 프로세스가 종료된 상태를 뜻함. 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다
- 생성(new) : 프로세스를 생서 중인 상태로, 메모리에 적재되어 PCB를 할당받은 상태

- 멀티프로세스와 멀티스레드 : 한 프로세스를 구성하는 코드를 동시에 실행하는 방법
- 멀티프로세스 : 동시에 여러 프로세스가 실행되는 것
- 각기 다른 프로세스들이 기본적으로 자원을 공유하지 않고, 독립적으로 실행된다
- 한 프로세스의 실행 과정에서 문제가 발생하더라도 다른 프로세스에 직접적인 영향을 끼치지 않는 경우가 많다
- 멀티스레드 : 프로세스를 동시에 실행하는 여러 스레드
- 하나의 스레드는 스레드를 식별할 수 있는 고유 정보인 스레드 ID와 프로그램 카운터, 레지스터 값, 스택 등으로 구성됨
- 멀티프로세스와 멀티스레드의 차이점 : 자원의 공유 여부
- 서로 다른 프로세스들은 기본적으로 자원을 공유하지 않음 -> 독립적인 실행
- 같은 프로세스를 실행하는 여러 스레드들은 프로세스의 자원을 공유함 -> 멀티스레드 환경에서 한 스레드에 생긴 문제가 프로세스 전체의 문제가 될 수 있다
- 멀티프로세스 : 동시에 여러 프로세스가 실행되는 것
- 프로세스 간 통신 : 프로세스는 기본적으로 자원을 공유하지 않지만, 프로세스 간에도 자원을 공유하고 데이터를 주고 받는 방법 있다
- 공유 메모리 : 프로세스 간에 공유하는 메모리 영역을 토대로 데이터를 주고 받는 통신 방식
- 공유 메모리 기반 IPC : 각 프로세스가 마치 자신의 메모리 영역을 읽고 쓰는 것처럼 통신한다는 점이 제일 중요
- 메시지 전달 : 프로세스 간에 주고받을 데이터가 커널을 거쳐 송수신되는 통신 방식
- 메시지를 보내는 수단과 받는 수단이 명확하게 구분되어 있다
- 메시지 전달 기반 IPC를 위한 대표적인 수단
- 파이프 : 단방향 프로세스 간의 통신 도구
- 시그널 : 프로세스에게 특정 이벤트가 발생했음을 알리는 비동기적인 신호
- 공유 메모리 : 프로세스 간에 공유하는 메모리 영역을 토대로 데이터를 주고 받는 통신 방식
동기화와 교착 상태
- 공유 자원 : 프로세스 혹은 스레드가 공유하는 자원(메모리, 파일, 전역 변수, 입출력장치)
- 임계 구역 : 공유 자원에 접근하는 코드 중 동시에 실행했을 때 문제가 발생할 수 있는 코드
- 레이스 컨디션 : 프로세스 혹은 스레드가 동시에 임계 구역의 코드를 실행하여 문제가 발생하는 상황
레이스 컨디션이 발생한다면?
- 자원의 일관성이 손상될 수 있음
- 따라서 2개 이상의 프로세스 혹은 스레드가 임계 영역에 진입하고자 한다면 둘 중 하나는 작업 끝날 때까지 대기
- 동기화 기법
- 레이스 컨디션을 방지하면서 임계 구역을 관리하기 위해 필요
- 조건 : 실행 순서 제어(프로세서 및 스레드 올바른 순서로 실행), 상호 배제(동시 접근 안되는 자원에 하나의 프로세스 및 스레드만 접근하기)
- 뮤텍스 락
- 동시에 접근해서는 안 되는 자원에 동시 접근이 불가능하도록 상호 배제를 보장하는 동기화 도구
- 임계구역에 접근하고자 한다면 반드시 락을 획득해야 하고, 임계 구역에서 작업이 끝났다면 락을 해제해야 한다
- lock.aquire(), lock.release()
- 세마포
- 뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식의 동기화 도구
- 세마포를 이용하면 공유 자원이 여러 개 있는 상황에서도 동기화 가능
- wait(), signal(), S
- 변수 S : 사용 가능한 공유 자원의 개수를 나타내는 변수
- 조건 변수와 모니터
- 조건 변수 : 실행 순서 제어를 위한 동기화 도구
- wait() 함수 : 호출한 프로세스 및 스레드의 상태를 대기 상태로 전환하는 함수
- signal() 함수 : wait()로 일시 중지된 프로세스 및 스레드의 실행을 재개하는 함수
- 모니터 : 공유 자원과 그 공유 자원을 다루는 함수(인터페이스)로 구성된 동기화 도구
- 자바의 synchronized 키워드 : 모니터를 사용하는 대표적 예시 -> 하나의 프로세스 및 스레드만 실행 가능
- 조건 변수 : 실행 순서 제어를 위한 동기화 도구
- 스레드 안전
- 멀티스레드 환겨에서 어떤 변수나 함수, 객체에 동시 접근이 이루어져도 실행에 문제가 없는 상태를 의미
- 교착 상태
- 일어나지 않을 사건을 기다리며 프로세스의 진행이 멈춰 버리는 현상
- 발생 조건 : 4개의 조건이 모두 충족될 때 교착 상태가 발생할 가능성이 생김
- 상호 배제
- 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상호 배제의 상황에서 교착 상태 발생 가능
- 점유와 대기
- 한 프로세스가 어떤 자원을 할당받은 상태(점유)에서 다른 자원을 할당받기를 기다린다면(대기) 교착 상태 발생 가능
- 비선점
- 자원이 비선점되었다는 말은 해당 자원을 이용하는 프로세스의 작업이 끝나야만 비로서 자원을 이용할 수 있다는 것을 의미
- 원형 대기
- 프로세스와 프로세스가 요청한 자원이 원의 형태를 이루는 경우
- 상호 배제
- 해결 방법 : 예방, 회피, 검출 후 회복
- 교착 상태 예방
- 교착 상태를 발생시키는 4가지 필요 조건 중 하나를 충족하지 못하게 하는 방법
- 교착 상태 회피
- 교착 상태가 발생하지 않을 정도로만 조심하면서 자원을 할당하는 방법
- 기본적으로 교착 상태를 한정된 자원의 무분별한 할당으로 인해 발생하는 문제로 간주
- 교착 상태 검출 후 회복
- OS는 프로세스가 자원을 요구할 때마다 자원을 할당하고 주기적으로 교착 상태의 발생 여부를 검사
- 그러다 교착 상태가 검출되면 프로세스를 자원 선점을 통해 회복시키거나, 교착 상태에 놓인 프로세스를 강제 종료함으로써 회복시킬 수 있음
- 교착 상태 예방
CPU 스케줄링
- 우선순위
- 운영체제는 프로세스별 우선순위를 판단하여 PCB에 명시하고, 우선순위가 높은 프로세스에는 CPU 자원을 더 빨리, 많이 할당한다
- 우선순위 할당 고려 기준?
- CPU 활용률 : 전체 CPU의 가동 시간 중 작업을 처리하는 시간의 비율을 의미
- OS는 기본적으로 높은 CPU 활용률을 유지하기 위해 기본적으로 입출력 작업이 많은 프로세스의 우선순위를 높게 유지
- CPU 활용률 : 전체 CPU의 가동 시간 중 작업을 처리하는 시간의 비율을 의미
- 대부분의 프로세스들은 CPU와 입출력장치를 모두 사용해 실행과 대기 상태를 왔다갔다하며 실행됨
- CPU 버스트 : 프로세스가 CPU를 이용하는 작업
- 입출력 버스트 : 입출력장치를 기다리는 작업
CPU 활용률 높이기 위해?
- (입출력 집중 프로세스와 CPU 집중 프로세스가 동시에 CPU 자원을 요구할 때) 입출력 집중 프로세스를 가능한 빨리 실행시켜 끊임없이 입출력장치를 작동시킨 다음, CPU 집중 프로세스에 집중적으로 CPU를 할당하면 됨
- 스케줄링 큐 : CPU를 이용하기 위해, 메모리에 적재되기 위해, 대기 상태로 특정 입출력장치를 이용하기 위해 프로세스가 기다리는 '줄'
- 준비 큐 : CPU를 이용하고 싶은 프로세스의 PCB가 서는 줄
- 대기 큐 : 대기 상태에 접어든 프로세스의 PCB가 서는 줄
- 선점형 스케줄링과 비선점형 스케줄링
- 선점형 스케줄링 : 현재 어떤 프로세스가 CPU를 할당받아 사용하고 있더라도 운영체제가 프로세스로부터 CPU 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링
- 타이머 인터럽트 기반 스케줄링 -> 선점형 스케줄링의 일종
- 장점 : 한 프로세스의 CPU 독점 방지, 여러 프로세스에 골고루 CPU 자원 배분 가능
- 단점 : 문맥 교환(Context Switching) 과정에서 오버헤드가 발생 가능
- 비선점형 스케줄링 : 어떤 프로세스가 CPU를 사용하고 있을 때 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까지는 다른 프로세스가 끼어들 수 없는 스케줄링 방식
- 장점 : 문맥 교환 횟수가 적어 상대적으로 오버헤드 발생이 적다
- 단점 : 어떤 프로세스가 CPU를 사용 중이라면 당장 CPU를 사용해야 하는 상황에도 무작정 기다려야 함
- 선점형 스케줄링 : 현재 어떤 프로세스가 CPU를 할당받아 사용하고 있더라도 운영체제가 프로세스로부터 CPU 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링
- CPU 스케줄링 알고리즘
- 선입 선처리 스케줄링
- 준비 큐에 삽입된 순서대로 먼저 CPU를 요청한 프로세스부터 CPU를 할당하는 스케줄링 방식
- 가끔 프로세스들이 기다리는 시간이 매우 길어질 수 있고, 호위 효과 발생 가능(호위효과 : 먼저 삽입된 프로세스의 오랜 실행 시간으로 인해 나중에 삽입된 프로세스의 실행이 지연되는 문제)
- 최단 작업 우선 스케줄링
- 준비 큐에 삽입된 프로세스 중 CPU를 이용하는 시간의 길이가 가장 짧은 프로세스부터 먼저 실행하는 스케줄링 방식
- 기본적으로 비선점형 스케줄링 알고리즘으로 분류됨
- 라운드 로빈 스케줄링
- 선입 선처리 스케줄링 + 타임 슬라이스 개념
- 타임 슬라이스 : 프로세스가 CPU를 사용하도록 정해진 시간
- 큐에 삽입된 프로세스들이 순서대로 CPU를 이용하되, 정해진 타임 슬라이스만큼만 CPU를 이용하는 선점형 스케줄링 방식
- 최소 잔여 시간 우선 스케줄링
- 최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링
- 정해진 타임 슬라이스만큼 CPU를 이용하되, 남아 있는 작업 시간이 가장 적은 프로세스를 다음으로 CPU를 이용할 프로세스로 선택
- 우선순위 스케줄링
- 프로세스에 우선순위 부여, 가장 높은 우선순위 프로세스부터 실행하는 방식
- 근본적인 문제 : 우선순위가 낮은 프로세스는 준비 큐에 먼저 삽입되었더라도 계속해서 실행이 연기될 수 있음
- 에이징 : 위에 언급한 문제를 방지하기 위해 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식임
- 다단계 큐 스케줄링
- 우선순위 스케줄링의 발전된 형태로, 우선순위별로 여러 개의 준비 큐를 사용하는 스케줄링 방식
- 다단계 피드백 큐 스케줄링
- 다단계 큐 스케줄링 + 프로세스들이 큐 사이를 이동함
- 선입 선처리 스케줄링
- 리눅스 CPU 스케줄링
- 리눅스에서는 상황에 따라 다양한 스케줄링 알고리즘이 사용될 수 있음
| 스케줄링 정책 | 적용 상황 |
| SCHED_FIFO | 실시간성 프로세스에 적용되는 정책(매우 높은 우선순위를 할당함) |
| SCHED_RR | |
| SCHED_NORMAL | 일반적인 프로세스에 적용되는 정책 |
| SCHED_BATCH | 일반적인 프로세스만큼 자주 선점하지 않는 배치 작업에 적용되는 정책 |
| SCHED_IDLE | 우선순위가 매우 낮은 프로세스에 적용되는 정책(매우 낮은 우선순위를 할당함) |
가상 메모리
물리 주소와 논리 주소
- 논리 주소 : 프로세스마다 부여되는 0번지부터 시작하는 주소 체계
- CPU와 프로세스가 사용하는 주소는 논리 주소이기 때문에 중복되는 물리 주소의 번지 수는 존재하지 않지만, 중복되는 논리 주소의 번지 수는 충분히 존재 가능 + 논리 주소라 할지라도 실제로 정보가 저장되어 있는 하드웨어 상의 메모리와 상호작용하기 위해서는 반드시 논리와 물리 주소간의 변환 이루어져야 함 -> MMU 존재 이유
- 메모리 관리 장치(MMU) : CPU와 메모리 사이에 위치하며, CPU가 이해하는 논리 주소를 메모리가 이해하는 물리 주소로 변환하는 역할
스와핑과 연속 메모리 할당
- 스와핑
- 메모리에 적재된 프로세스들 중 현재 실행되고 있지 않은 프로세스 존재할 수 있음
- ex) 입출력 작업을 요구하며 대기 상태가 된 것, 오랫동안 사용되지 않은 프로세스 등
- 이러한 프로세스들을 임시로 스왑 영역이라는보조기억장치의 일부인 영역으로 보냄
- 위 과정으로 인해 생긴 메모리 상 빈 공간에 다른 프로세스를 적재하여 실행하는 메모리 관리 방식 => "스와핑"
- 스왑 아웃 : 현재 실행되지 않는 프로세스가 다시 메모리로 옮겨오는 과정
- 스왑 인 : 스왑 영역에 있는 프로세스가 다시 메모리로 옮겨오는 것
- 메모리에 적재된 프로세스들 중 현재 실행되고 있지 않은 프로세스 존재할 수 있음
- 연속 메모리 할당과 외부 단편화
- 연속 메모리 할당 : 프로세스에 연속적인 메모리 공간을 할당하는 방식 -> 메모리를 효율적으로 사용하는 방법은 아님
- 프로세스들이 메모리에 연속적으로 할당되는 환경에서는 프로세스의 실행과 종료를 반복하며 메모리 사이 사이에 빈 공간이 생긴다. 따라서 이 빈 공간이 애매한 크기로 남아있어버리면 애매한 크기보다 큰 용량의 프로세스를 적재하기 어려워지며, 메모리 낭비로 이어진다. 이것이 바로 "외부 단편화"이다.
- 연속 메모리 할당 : 프로세스에 연속적인 메모리 공간을 할당하는 방식 -> 메모리를 효율적으로 사용하는 방법은 아님
페이징을 통한 가상 메모리 관리
스와핑과 연속 메모리 할당의 2가지 문제
1. 적재와 삭제를 반복하며 프로세스들 사이에 발생하는 외부 단편화
2. 물리 메모리보다 큰 프로세스를 실행할 수 없다는 점
- 가상 메모리 : 위 문제를 해결하는 운영체제의 메모리 관리 기술
- 실행하고자 하는 프로그램의 '일부'만 메모리에 적재해, 실제 메모리보다 더 큰 프로세스를 실행할 수 있도록 만드는 메모리 관리 기법(보조기억장치의 일부를 메모리처럼 사용 or 프로세스의 일부만 메모리에 적재하면서 메모리를 실제 크기보다 더 크게 보이게 하는 기술)
- 페이징 : 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 나누고, 물리 주소 공간을 페이지와 동일한 크기의 프레임이라는 일정한 단위로 나눈 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법 -> 외부 단편화 발생 X
- 페이지 아웃 = 스왑 아웃, 페이지 인 = 스왑 인
- 페이지 테이블 : 물리 메모리 내 페이지가 불연속적으로 배치되어 있을 때 발생하는 CPU의 다음 실행할 페이지 찾기에 대한 어려움을 해결하기 위해 프로세스의 페이지와 적재된 프레임을 짝지어주는 정보
- 테이블 엔트리 : 페이지 테이블을 구성하고 있는 각각의 행들
- 페이지 번호와 프레임 번호
- 유효 비트 : 해당 페이지 접근이 가능한지 여부를 알려주는 중요한 정보
- 유효비트 0(메모리에 적재되지 않은 페이지)인 페이지에 CPU가 접근하려고 하면 '페이지 폴트' 발생
- 보호 비트 : 페이지의 보호 기능을 위해 존재(rwx 조합으로 페이지에 접근 권한 제어)
- 참조 비트 : CPU가 해당 페이지에 접근한 적이 있는지 여부 나타내는 비트
- 수정 비트(더티 비트) : 해당 페이지에 데이터를 쓴 적이 있는지 여부를 알려주는 비트
- 장점 : 외부 단편화 해결 가능
- 단점 : 내부 단편화 발생 가능 Why? 모든 프로세스가 페이지의 크기에 딱 맞게 잘리는 것이 아님.
- -> 모든 프로세스의 크기가 페이지의 배수가 아님(페이지 크기가 5KB인데 프로세스 크기가 8KB라면 마지막 페이지는 2KB가 남으면서 메모리 낭비 발생)
- 테이블 엔트리 : 페이지 테이블을 구성하고 있는 각각의 행들
- 페이지 테이블 베이스 레지스터(PTBR) : 페이지 테이블은 메모리에 적재 가능. 그래서 어떤 프로세스 실행하려면 페이지 테이블이 메모리 어디에 위치해있는지 알아야됨. 페이지 테이블 베이스 레지스터가 페이지 테이블이 메모리 상 위치를 가리킴!
- PTBR은 프로세스마다 가지는 정보이므로 각 PCB에 기록되고, 다른 프로세스로 문맥 교환이 발생할 때 변경됨

- 페이징 주소 체계
- 하나의 페이지 내에 여러 주소가 포함되어 있기 때문에 페이징 시스템의 논리 주소는 기본적으로 <페이지 번호, 변위> 같은 형태로 이루어져 있다.
- 페이지 번호 : 몇 번째 페이지 번호에 접근할지 나타내는 정보(물리 메모리 내 어떤 프레임에 접근할지 알 수 있음)
- 변위 : 접근하려는 주소가 페이지(프레임) 시작 번지로부터 얼만큼 떨어져 있는지 나타내는 정보
- <페이지 번호, 변위> -- 페이지 테이블 --> <프레임 번호, 변위>
- 하나의 페이지 내에 여러 주소가 포함되어 있기 때문에 페이징 시스템의 논리 주소는 기본적으로 <페이지 번호, 변위> 같은 형태로 이루어져 있다.
페이지 교체 알고리즘
- 요구 페이징 : 메모리에 프로세스를 적재할 때 처음부터 모든 페이지를 적재하지 않고, 메모리에 필요한 페이지만 적재하는 기법
-순서
1. CPU가 특정 페이지에 접근하는 명령어를 실행
2.해당 페이지가 현재 메모리에 있을 경우(유효 비트 1) CPU는 페이지가 적재된 프레임에 접근
3. 해당 페이지가 현재 메모리에 없을 경우(유효 비트 0) 페이지 폴트가 발생
4. 페이지 폴트가 발생하면 페이지 폴트 처리 루틴을 통해 해당 페이지를 메모리로 적재하고, 유효 비트를 1로 수정
- 순수 요구 페이징 : 아무런 페이지도 메모리에 적재하지 않은 채 무작정 프로세스를 실행
- 요구 페이징을 통해 페이지들이 점차 메모리에 적재하다가 보면 메모리가 가득 찰 것 -> 이 상황에 페이지를 추가 적재해야 한다면 메모리에 적재된 일부 페이지를 스왑 아웃 해야됨 -> 페이지 교체 알고리즘 필요
- 페이지 교체 알고리즘 : 전체 성능과 직결(페이지 폴트 발생 빈도 수)
- FIFO 페이지 교체 알고리즘 : 메모리에 가장 먼저 적재된 페이지부터 스왑 아웃
- 최적 페이지 교체 알고리즘 : 앞으로 사용 빈도가 가장 낮은 페이지를 교체
- LRU 페이지 교체 알고리즘 : 가장 적게 사용한 페이지를 교체
- 페이지 교체 알고리즘 : 전체 성능과 직결(페이지 폴트 발생 빈도 수)
파일 시스템
파일과 디렉터리
- 파일 : 파일의 이름, 파일을 실행하기 위한 정보, 파일과 관련한 부가 정보(속성 or 메타데이터)
- 파일을 다루는 모든 작업이 OS에 의해 이루어짐
- 파일 디스크립터 : 저수준에서 파일을 식별하는 정보로, 0 이상의 정수 형태를 띄고 있다
- OS는 프로세스가 새로운 파일을 열거나 생성할 때 해당 파일에 대한 파일 디스크립터를 프로세스에 할당함
- 디렉터리
- OS는 여러 파일들을 일목요연하게 관리하기 위해 디렉터리 이용
- 트리 구조 디렉터리 : 루트 디렉터리(최상위 디렉터리), 서브 디렉터리
- 대부분의 OS는 디렉터리를 조금 특별한 '파일'로 간주, 정확히는 '디렉터리에 속한 요소의 관련 정보가 포함된 파일'로 간주
- 디렉터리에 속한 요소의 관련 정보는 디렉터리 엔트리 형태로 표현
- 파일 할당
- OS는 파일과 디렉터리를 블록이라는 단위로 읽고 쓴다
- 하나의 파일이 보조기억장치에 저장될 때 하나 이상의 블록을 할당받아 저장됨
- 연결 할당 : 어떤 파일 시스템에서는 각 블록의 일부에 다음 블록의 주소를 저장하여 각각의 블록이 다음 블록을 가리키는 형태로 할당
- 색인 할당 : 어떤 파일 시스템에서는 파일을 이루는 모든 블록의 주소를 색인 블록이라는 특별한 블록에 모아 관리하는 방식으로 할당
- OS는 파일과 디렉터리를 블록이라는 단위로 읽고 쓴다