개발일지
혼공컴운 9장~15장 요약 정리 (운영체제 파트) 본문
9장. 운영체제 시작하기
9-1. 운영체제
운영체제란?
- 실행할 프로그램에 필요한 자원을 할당하고 올바르게 실행되도록 도와주는 프로그램
- 관리할 자원별로 기능이 나누어져 있음 (CPU 배분, 메모리 적재 등)
운영체제도 프로그램이다. 즉 메모리에 할당되어야 함!
- 커널 영역: 운영체제가 사용하는 메모리 영역
- 사용자 영역: 응용프로그램이 사용하는 메모리 영역
9-2. 커널
커널(Kernel)?
- 운영체제가 제공하는 기능 중 핵심 서비스를 담당하는 영역
- 운영체제마다 제공하는 서비스가 다를 수 있지만, 공통적으로 필요한 필수적인 기능을 담당
- 예시로 사용자 인터페이스는 운영체제 기능이긴 하지만 커널 기능은 아니다.
이중모드
- CPU가 명령어를 실행할 때 두 가지 모드로 구분하는 방식
- 커널 모드: 운영체제 서비스를 제공 받을 수 있는 실행 모드 (커널 영역 코드 실행 가능)
- 사용자 모드: 운영체제 서비스를 제공 받을 수 없는 실행 모드 (커널 열역 코드 실행 불가)
- 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하기 위함
시스템 호출 (System call)
- 응용 프로그램이 운영체제 서비스를 제공받기 위해 “사용자 모드 → 커널 모드로 전환”하기를 요청하는 것
- 시스템 호출 과정
- 응용 프로그램이 시스템 콜
- 사용자 모드 → 커널 모드 전환
- 운영체제 코드 실행
- 커널 모드 → 사용자 모드로 복귀
운영체제 핵심 서비스
- 프로세스 관리
- 여러 프로세스를 어떻게 관리하고 실행할 지, 어떤 자원에 어떤 프로세스가 접근할 지 등을 관리
- 자원 접근 및 할당
- 프로세스는 CPU, 메모리, 입출력 장치 등 다양한 자원을 필요로 함 → 어떻게 분배하고 할당할 지
- 파일 시스템 관리
- 보조기억장치에 있는 파일, 디렉터리에 접근하고 사용하기 위한 서비스
10장. 프로세스와 스레드
10-1. 프로세스
프로세스(Process)란?
- 실행 중인 프로그램 → 보조 기억 장치에 저장되어있던 프로그램이 메모리에 적재되면 프로세스
- 유형
- 포그라운드(foreground) 프로세스: 사용자 눈 앞에서 실행 중인 프로세스
- 백그라운드(background) 프로세스: 사용자 눈에 보이지 않는 프로세스
- 데몬(or 서비스): 백그라운드 프로세스 중, 사용자와 상호작용할 수 없는 프로세스
프로세스 제어 블록 (Process Control Block, PCB)
- 프로세스를 식별하고 관리하기 위한 정보를 저장하는 자료구조
- 커널 영역에 생성 → 프로세스 자체는 사용자 영역, PCB는 커널 영역에 적재 됨
문맥 교환 (Context switching)
- 문맥 (context)?
- 프로세스를 전환 시 이전 프로세스를 재개하기 위해 기억하고 있어야할 정보
- PCB에 기록되는 정보라고 보면 됨
⇒ 이 문맥을 전환하는 과정을 “문맥교환”이라고 함
- A → B 프로세스 변환 과정 예시
- A 프로세스 실행 중
- A 프로세스 문맥 → PCB에 백업
- 재개할 B 프로세스 문맥 → PCB로부터 복구
- B 프로세스 실행
- 이 문맥교환이 매우 빠르게 일어나기 때문에 여러 프로세스가 마치 동시에 실행되는 것처럼 보이는 것. 그러나 너무 빈번한 문맥교환은 오버헤드 야기할 수 있다.
프로세스의 메모리 영역
- 커널 영역: PCB
- 사용자 영역
- 코드 영역(or 텍스트 영역): CPU가 실행할 명령어(기계어), read-only
- 데이터 영역: 프로세스가 종료될 때까지 유지되는 데이터 (ex. 전역 변수)
- 스택 영역: 데이터가 일시적으로 저장되는 영역 (ex. 지역 변수, 매개 변수)
- 힙 영역: 개발자가 직접 메모리 공간에 할당할 수 있는 영역 (ex. 객체, 포인터)
- 사용 후 반환하지 않으면 메모리 누수(memory leak) 발생
10-2. 프로세스 상태와 계층 구조
프로세스 상태 (PCB에 기록 됨!)
- 생성(new): 프로그램이 메모리에 막 적재되어 PCB를 할당받은 상태
- 준비(ready): CPU 할당 받기를 기다리는 상태
- 실행(running): CPU 할당되어 실행 중인 상태
- 할당된 시간이 끝나면(타이머 인터럽트) → ready
- 입출력 장치 사용을 원하면 → blocked로 변환
- 대기(blocked): 입출력 장치 사용을 기다리는 상태
- 입출력 작업 완료 후 → ready로 변환
- 종료(terminated): 운영체제는 종료된 프로세스, PCB가 사용한 메모리를 제거 함
프로세스 계층 구조
- 프로세스는 실행 도중 시스템 콜을 통해 다른 프로세스를 생성할 수 있다.
- 시스템 콜한 프로세스 → “부모 프로세스”
- 시스템 콜로 생성된 프로세스 → “자식 프로세스”
- 부모 프로세스가 자식 프로세스를 생성하고, 그 프로세스가 또 다른 자식 프로세스를 생성하고 … → 트리 형태를 띄게 됨 (프로세스 계층 구조)
프로세스 생성 기법
- fork()와 exec() 시스템 콜의 반복이라고 할 수 있다.
- fork(): 자신 프로세스의 복사본을 만드는 시스템 콜
- exec(): 메모리 공간을 새로운 프로세스로 덮어쓰는 시스템 콜 → 코드, 데이터 영역은 실행할 프로그램 내용으로 바뀌고 스택, 힙 영역은 초기화 됨
⇒ 즉 프로세스가 계층 구조를 갖는 과정은 “fork와 exec의 반복 과정”이라고 할 수 있다.
10-3. 스레드
스레드(Thread)
- 프로세스를 구성하는 실행 단위
- 실행에 필요한 최소한의 정보를 제외하고는 프로세스 자원을 공유한다.
- 공유X: 레지스터, 스택, 프로그램 카운터
- 공유 자원: 코드, 데이터, 힙, 파일
- 최근 많은 운영체제가 CPU 작업 할당 시 스레드 단위로 전달한다.
멀티 프로세스 vs. 멀티 스레드 → “자원 공유” 유무의 차이!
- 멀티프로세스
- 서로 자원 공유X, 독립적인 흐름
- 비효율적인 메모리 사용
- 멀티스레드
- 최소한의 정보 제외하고 프로세스 자원을 공유 함
- 스레드 간 통신 및 협력에 유리하고 메모리 공간을 효율적으로 사용할 수 있지만, 한 스레드에 문제 발생 시 모든 스레드에 영향 줄 수 있음
- 경쟁조건(race condition), 데드락(deadlock) 등을 방지하기 위한 동기화 기법 필요
프로세스 간 통신(Inter Process Communication, IPC)
- 프로세스는 “기본적으로” 자원을 공유하지 않지만 자원 공유가 불가능한 것은 아니다.
- 파일을 통한 프로세스 간 통신, 공유 메모리(shared memory) 등..
11장. CPU 스케줄링
11-1. CPU 스케줄링
CPU 스케줄링?
- CPU는 한 번에 한 프로세스만이 할당 가능하지만 CPU 자원을 원하는 프로세스는 여러 개 → 효율적으로 할당할 방법이 필요
⇒ CPU 스케줄링: 운영체제가 여러 프로세스에게 공정하고 합리적으로 CPU 자원을 배분하는 것
우선순위(prioirty)
- 프로세스마다 우선순위가 다르다. → PCB에 명시 됨
- 우선순위는 입출력 집중 프로세스 > CPU 집중 프로세스
- 입출력 작업에 들어간 프로세스는 “대기” 상태에 머물게 된다. 따라서 입출력 작업이 필요한 프로세스 먼저 실행시킨 뒤, 해당 프로세스가 “대기”에 머무는 동안 다른 프로세스의 CPU 작업을 진행하면 효율적인 스케줄링이 가능하다.
스케줄링 큐
- PCB에 우선순위가 기록되긴 하지만 운영체제가 매번 모든 PCB를 확인하는 것은 매우 비효율적이다. 대신 운영체제는 프로세스의 상태나 필요로하는 자원에 따라 줄을 세우는데 이 줄이 “스케줄링 큐”
⇒ 운영체제가 프로세스의 스케줄링을 효율적으로 관리하기 위해 사용하는 대기열
스케줄링 큐 종류
- 준비 큐(ready queue): CPU 할당 되기를 기다리는, 즉 “준비” 상태인 프로세스의 대기열
- 대기 큐(waiting queue): 입출력 작업을 원하는, 즉 “대기” 상태인 프로세스의 대기열
선점형 vs. 비선점형 스케줄링
- 선점형 스케줄링
- CPU 자원 독점 불가, 다른 프로세스가 뺏을 수 있는 스케줄링
- 자원 배분 가능, 문맥교환 과정에서의 오버헤드 가능성
- 비선점형 스케줄링
- CPU 자원 독점, 다른 프로세스가 뺏을 수 없는 스케줄링 (먼저 선점한 프로세스가 종료될 때까지 기다려야 함)
- 자원 배분 불가, 오버헤드 가능성 감소
11-2. CPU 스케줄링 알고리즘
선입 선처리 스케줄링 (First Come First Served scheduling, FCFS)
- 준비 큐에 삽입된 순서대로 프로세스 처리 / 비선점
- “호위 효과(convoy effect)” 발생
- (먼저 들어온) 긴 CPU 작업이 실행되는 동안 짧은 CPU 작업 실행이 지연되는 현상
최단 작업 우선 스케줄링 (Shortest Job First scheduling, SJF)
- 작업시간이 짧은 프로세스 순서대로 처리 / 기본적으로 비선점
- 호위효과 방지
라운드 로빈 스케줄링 (Round Robin scheduling, RR)
- FCFS + 타임 슬라이스 적용한 스케줄링 방식 / 선점
- 타임 슬라이스: 프로세스가 CPU를 사용할 수 있는 정해진 시간
최소 잔여 시간 우선 스케줄링 (Shortest Remaining Time scheduling, SRT)
- RR + SJF 스케줄링 / 선점
- 타임 슬라이스 만큼씩만 CPU를 사용 + 다음 프로세스 선택 시 남아있는 작업 시간이 가장 짧은 프로세스 선택
우선순위 스케줄링 (priority scheduling)
- 우선순위에 따라 실행하는 스케줄링 방식
- “기아(starvation) 현상” 발생
- 우선순위가 낮은 프로세스가 계속해서 연기되는 현상
- 에이징(aging)
- 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 방식
- 기아현상 방지하는 대표적인 기법
다단계 큐 스케줄링 (multilevel queue scheduling)
- 우선순위 별 준비 큐를 여러 개 사용하는 스케줄링 방식 / 선점
- 큐 별로 다른 스케줄링 방식, 타임 슬라이스 등 설정 가능하다.
- 큐 사이 프로세스 이동 불가 → “기아 현상” 발생
다단계 피드백 큐 스케줄링 (multilevel feedback queue scheduling)
- 큐 사이 이동 가능 + 에이징 → 기아 현상 개선한 다단계 큐 스케줄링
- CPU 사용 시간이 길어질수록 우선순위 낮아짐
- 구현은 복잡하지만 가장 일반적인 CPU 스케줄링 알고리즘
12장. 프로세스 동기화
12-1. 동기화?
동기화 (synchronization)
- 멀티프로세스/멀티스레드 등 여러 작업이 협력하는 환경에서 프로세스들이 마구잡이로 실행된다면 문제가 발생할 수 있다. 따라서 프로세스 실행 순서와 자원의 일관성을 보장하기 위해 “동기화”는 필수이다.
- 프로세스 동기화란 “프로세스의 수행 시기를 맞추는 것”
- 실행 순서 제어: 프로세스를 올바른 순서대로 실행시키는 것
- 상호 배제: 동시에 사용 되면 안되는 자원에 하나의 프로세스만 접근 가능하게 하는 것
⇒ 동기화: 특정 자원에 한 프로세스만 접근하게 하거나 프로세스를 올바른 순서대로 실행하는 것
상호 배제 (mutual exclusion)
- 공유 불가한 자원을 여러 프로세스가 동시에 사용하는 것을 피하기 위한 알고리즘
공유 자원 (shared resource)
- 여러 프로세스가 공동으로 사용하는 자원
- ex) 전역변수, 파일, 입출력장치 등
임계 구역 (critical section)
- 공유자원 중 동시에 접근하면 문제 발생하는 자원에 접근하는 코드 영역
- → 두 프로세스가 접근하면 한 프로세스는 대기해야 함
경쟁 조건 (race condition)
- 여러 프로세스가 동시다발적으로 임계구역 코드를 실행하여 문제가 발생하는 경우 (데이터 일관성 X)
상호배제를 위한 동기화 세 가지 원칙
- 상호배제(mutual exclusion): 임계구역에는 한 번에 하나의 프로세스만 접근할 수 있어야 한다.
- 진행(progress): 임계구역에 아무도 없다면 진입을 원하는 프로세스 중 하나가 임계구역에 진입할 수 있어야 한다.
- 유한대기(bounded waiting): 임계구역에 진입 하기를 원하는 프로세스는 무한정 대기해서는 안된다.
12-2. 동기화 기법
뮤텍스 락 (Mutex lock)
- 상호배제를 보장하기 위한 락 메커니즘으로 한 번에 하나의 프로세스만 임계구역에 접근하도록 제어한다. (주로 단일 자원 동기화에 사용)
- 프로세스가 임계구역에 진입하면 락(lock)을 획득하고 작업이 끝나면 락을 해제해 다른 프로세스가 접근할 수 있도록 한다.
- 바쁜 대기(busy wait)
- 임계구역이 잠겨있을 경우 락이 해제될 때까지 지속적으로 확인하며 기다리는 것 → CPU 자원 낭비 됨
세마포어 (Semaphore)
- 카운터 값을 통해 여러 프로세스의 접근을 제어한다. (공유자원이 여러개일 때도 적용 가능)
- 마찬가지로 바쁜 대기 발생 → “대기 큐” 사용하여 해결
- 사용 가능한 공유자원이 없을 경우 대기 상태로 전환 된다. 이후 자원이 반환되면 대기 큐에 있던 프로세스가 임계구역에 진입할 수 있게 된다.
모니터 (Moniter)
- 뮤텍스나 세마포어 사용 시 발생할 수 있는 오류를 방지하기 위해 설계된 고수준의 동기화 도구
13장. 교착 상태
13-1. 교착 상태
교착 상태 (Deadlock)
- 두 개 이상의 프로세스가 서로의 자원을 얻기 위해 무한정 대기하는 현상
교착상태 발생 조건 → 모두 만족해야 발생 함
- 상호배제: 이미 사용중인 자원을 다른 프로세스가 사용할 수 없음
- 점유와 대기: 어떠한 자원을 사용중인 상태에서 다른 자원을 기다리는 상태
- 비선점: 이미 사용중인 자원을 빼앗을 수 없음
- 원형 대기: 원의 형태로 자원을 기다리는 상태 (=자원 할당 그래프가 원형일 때)
13-2. 교착 상태 해결 방법
예방
- 교착상태 발생 조건 중 하나라도 충족하지 못하게 미리 방지하는 방법
- 여러 부작용이 따르기 때문에 현실적으로 어려움
회피
- 교착상태가 일어나지 않도록 조심해서 자원을 할당하는 방식
⇒ 즉, “안전 상태”를 유지하도록 자원을 할당하는 방식
- 안전 상태(safe state)
- 교착 상태 없이 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태
- 안전 순서열이 존재하는 상태
- 불안전 상태(unsafe state)
- 교착 상태가 발생할 수도 있는 상태
- 안전 순서열이 존재하지 않는 상태
- 안전 순서열(safe sequence)
- 교착 상태 없이 안전하게 자원 할당 할 수 있는 프로세스 할당 순서
검출 후 회복
- 주기적으로 검사 하다가 교착 상태가 검출 되면 사후 조치하는 방법
- 회복 방식
- 선점을 통한 회복
- 프로세스 강제종료를 통한 회복
14장. 가상 메모리
14-1. 연속 메모리 할당
연속 메모 할당?
- 프로세스를 메모리에 연속적으로 할당하는 방식
스와핑 (Swapping)
- 현재 실행 중이 아닌 프로세스를 임시로 보조기억장치 일부 영역으로 보내고, 실행할 다른 프로세스를적재하는 방식
- 이때 보조기억장치의 일부 영역이 “스왑 영역(swap space)”
- 스왑인(swap-in): 실행 중이 아닌 프로세스를 스왑 영역 → 메모리로 옮기는 과정
- 스왑 아웃(swap-out): 실행 중인 프로세스를 메모리 → 스왑 영역으로 옮기는 과정
- 스와핑을 이용하면 실제 메모리 크기보다 큰 프로세스들을 동시에 실행시킬 수 있다.
메모리 할당 방식
- 최초 적합(first fit): 빈 공간을 순차적으로 탐색하다가 가장 먼저 발견한 빈 공간에 할당하는 방식
- 최적 적합(best fit): 빈 공간을 모두 탐색한 뒤 가장 크기가 작은 공간에 할당하는 방식
- 최악 적합(worst fit): 빈 공간을 모두 탐색한 뒤 가장 크기가 큰 공간에 할당하는 방식
외부 단편화(External fragmentation) → 연속 메모리 할당의 문제점!
- 프로세스들의 반복적인 실행 및 종료 과정에서 사이사이 빈 공간이 발생 → 프로세스를 할당하기 힘든 만큼의 작은 메모리 공간들로 인해 메모리가 낭비되는 현상
- ex) 50MB, 30MB, 20MB 세 개의 빈 공간이 있을 때, 전체 메모리로 보면 총 100MB 만큼의 빈 공간이 남아있음에도 100MB 프로세스를 적재할 수 없음
- 해결 방법
- 압축(compaction): 메모리 내 프로세스들을 주기적으로 재배치하여 흩어져있던 여러 빈 공간을 하나의 큰 빈 공간으로 만드는 방법
- 재배치하는 동안 하던 작업을 중단해야 함
- 재배치 과정에서 오버헤드 야기
- 페이징(paging)
- 오늘 날 흔히 사용 되는 가상 메모리 기법!
- 압축(compaction): 메모리 내 프로세스들을 주기적으로 재배치하여 흩어져있던 여러 빈 공간을 하나의 큰 빈 공간으로 만드는 방법
14-2. 페이징을 통한 가상 메모리 관리
가상메모리
- 실행할 프로그램 일부만 메모리에 적재해 실제 물리적인 메모리 공간보다 크기가 큰 프로세스를 실행할 수 있도록 하는 기법
- ex) 페이징, 세그멘테이션 등
페이징(Paging)
- 메모리와 프로세스를 일정한 단위로 자른 뒤 이를 메모리에 불연속적으로 할당하는 방식 → 외부 단편화 해결!
- 페이지(page): 프로세스의 논리 주소 공간 단위
- 프레임(frame): 메모리의 물리 주소 공간 단위
⇒ 프로세스는 페이지, 메모리는 프레임 단위로 나눈 뒤 각 페이지를 프레임에 할당하는 가상 메모리 관리 기법
- 페이징에서도 스와핑이 일어난다.
- 프로세스 단위가 아닌 페이지 단위 → 페이지 인/페이지 아웃
페이지 테이블
- 프로세스는 메모리에 불연속적으로 할당 되기 때문에 CPU는 프로세스 실행 순서를 알기 어렵다.
- → 논리 주소가 연속적으로 배치되는 “페이지 테이블”을 이용해서 해결 가능
- → CPU는 물리 주소를 모르더라도 페이지 테이블의 논리 주소만 순차적으로 실행하면 된다.
⇒ 페이지 테이블: 페이지 번호-프레임 번호를 매칭하여 관리하는 공간
- 메모리 내부에서 관리
- 총 두 번의 메모리 접근을 필요로 하여 메모리 접근 시간이 증가 한다. (1. 페이지 테이블 접근, 2. 프레임 접근)
- → TLB로 해결 가능
페이지 테이블 베이스 레지스터(Page Table Base Register, PRBR)
- CPU 내부에 저장 되며, 각 프로세스의 페이지 테이블이 적재된 주소를 가리킨다. (프로세스마다 각자의 페이지 테이블이 존재)
TLB (Translation Lookaside Buffer)
- CPU가 사용하는 페이지 테이블 캐시 메모리
- 참조 지역성에 근거하여 페이지를 저장한다.
- TLB 히트: 접근하려는 페이지 번호가 TLB에 존재할 경우 → 페이지 테이블에 접근하기 위한 메모리 접근 필요X → 메모리 접근 시간 감소
- TLB 미스: 접근하려는 페이지 번호가 TLB에 존재하지 않을 경우
페이징에서의 주소 변환
- 페이지 = <페이지 번호, 변위>
- 페이지 번호(page number): 접근하려는 페이지 번호
- 변위(offset): 프레임 시작 번지로부터 얼만큼 떨어져 있는지
- 논리 주소 <페이지 번호, 변위> → 물리 주소 <프레임 번호, 변위> 로 변환된다.
페이지 테이블 엔트리(Page Table Entry, PTE) 요소
- 페이지 번호
- 프레임 번호
- 유효비트(valid bit): 해당 페이지에 접근 가능한가? (=현재 메모리에 프로세스가 적재되어 있는가?)
- 비트가 0, 즉 메모리에 적재되지 않았을 경우 “페이지 폴트(page fault)” 예외 발생
- 보호비트(protection bit): 해당 페이지에 쓰기 가능한가? (페이지 접근 권한)
- 참조비트(reference bit): CPU가 해당 페이지에 접근한 적 있는가?
- 수정비트(modified bit): 해당 페이지에 데이터를 쓴 적이 있는가?
- 페이지 아웃될 때 보조기억장치에 쓰기 작업을 해야하는지 판단하기 위해 존재한다.
- 비트가 0, 즉 데이터가 한번도 수정되지 않은 경우 수정된 내용을 보조기억장치에 기록하는 과정을 건너뛰어도 된다.
+) 더 알아보기
내부 단편화 (Internal framentation)
- 할당된 메모리 블록 내에서 사용 되지 않고 낭비되는 메모리 공간
- ex) 페이지 크기를 10KB 단위로 나눴다고 가정하고 28KB 프로세스를 할당하려면 10KB, 10KB, 8KB 총 세 개의 블록이 사용된다. → 마지막 블록에 2KB의 빈 공간이 낭비 됨
쓰기 시 복사(copy on write) - 페이징의 두번째 이점
- fork 시스템 호출로 새로운 프로세스를 생성 했을 때, 이 자식 프로세스는 부모 프로세스와 동일한 프레임 주소를 갖게 된다.
- “쓰기”가 발생하는 순간 해당 페이지가 별도의 공간으로 복제 된다.
⇒ 프로세스 생성 시간 감소, 메모리 공간 절약 가능
계층적 페이징 (다단계 페이지 테이블)
- 모든 PTE를 메모리에 두는 것은 메모리 낭비이다.
⇒ 페이지 테이블을 여러 단계로 나누어 계층 구조로 관리하는 방식 도입 (계층적 페이징)
- Outer 페이지 테이블
- 페이지 테이블을 여러 개로 나누고 각 페이지 테이블 위치를 가리키고 있는 상위 레벨의 페이지 테이블
- 메모리 내부에서 관리 되며 CPU 가장 가까이 위치 함
- 논리 주소 구조
- <outer 페이지 번호, 페이지 번호, 변위>
14-3. 페이지 교체와 프레임 할당
운영체제는 한정된 물리 메모리 공간을 효율적으로 사용하기 위한 여러 기능을 수행한다.
요구 페이징(Demand paging)
- 프로세스를 메모리에 적재할 때 전체 프로세스가 아닌 필요한 일부만 적재하는 기법
- 과정
- CPU가 특정 메모리에 접근하기 위한 명령어를 실행한다.
- 페이지 테이블 참조하여
- 해당 페이지가 현재 메모리에 있는 경우(=유효 비트 1) → 해당 페이지에 접근
- 메모리에 없는 경우(=유효 비트 0) → 페이지 폴트 발생
- 페이지 폴트가 발생한 경우, 처리 과정을 거쳐 해당 페이지를 메모리에 적재하고 유효 비트를 1로 변경한다.
- 다시 1번 과정부터 반복
- 순수 요구 페이징 (Pure dmand paging)
- 아무 페이지도 메모리에 적재되지 않은 상태에서 무작정 실행부터 하는 기법
- 시작하자마자 페이지 폴트가 반복되고, 페이지가 어느정도 적재되고나면 그 빈도가 줄어듦
- 페이지 폴트가 자주 발생하는 이유
- 나쁜 페이지 교체 알고리즘
- 프로세스가 사용할 수 있는 프레임 수가 부족할 경우
페이지 교체 알고리즘
- 물리 메모리 공간이 가득 찬 상태에서 페이지 폴트가 발생하면 적재된 페이지 중 하나를 보조기억장치로 내보내야한다. ⇒ 페이지 폴트 발생 시 페이지 아웃 할 페이지를 결정하는 방법이 "페이지 교체 알고리즘"
- 좋은 페이지 교체 알고리즘이란 “페이지 폴트를 적게 일으키는” 알고리즘 → 페이지 폴트 횟수가 알고리즘 성능의 지표가 됨
페이지 교체 알고리즘 종류
- FIFO(First In First Out): 선입선출, 구현이 간단하지만 비효율적이다.
- 최적 페이지 교체 알고리즘(optimal page replacement): 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체하는 방법
- 이론적으로 가장 낮은 페이지 폴트율을 갖는, 가장 효율적인 알고리즘
- 실제 구현이 어려워 실사용보다는 다른 알고리즘의 성능을 평가하기 위한 용도로 사용.
- LRU(Least Recently Used): 가장 오랫동안 사용되지 않은 페이지를 교체하는 방법
스래싱(thrashing)
- 프로세스 실행보다 페이징에 더 많은 시간을 소요해 시스템 성능이 저해되는 현상
- 프레임이 부족하면 → 페이지 폴트 빈도수가 증가하고 → CPU 이용률이 저하 됨
- 즉 멀티프로그래밍 정도가 늘어난다고 해서 무조건 CPU 이용률이 증가하는 것은 아니다. (CPU 성능이 좋아도 메모리 성능이 받쳐주지 않으면 전체 컴퓨터 성능은 저하 됨)
- 스래싱의 근본적인 원인은 “각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기” 때문이다. → 적절한 프레임 할당 방식 필요!
프레임 할당 방식
- 정적 할당 방식
- 균등 할당(equal allocation): 모든 프로세스에 동일한 수의 프레임을 할당하는 방식
- 비례 할당(proportional allocation): 프로세스 크기에 비례하여 프레임을 할당 하는 방식
- 동적 할당 방식
- 작업 집합 모델 기반(working set model)
- 작업 집합: 프로세스가 일정기간동안 참조한 페이지 집합 → 작업 집합 크기에 따라 동적으로 할당
- 각 프로세스가 실행되는 동안 필요한 페이지 수만큼만 프레임을 할당 받는다.
- 페이지 폴트 빈도율 기반(Page Fault Frequency, PFF)
- 페이지 폴트율의 상한선과 하한선을 정한 뒤 이 범위 내에서 프레임 수를 동적으로 조정 하는 방식
- 작업 집합 모델 기반(working set model)
15장. 파일 시스템
15-1. 파일과 디렉터리
- 파일과 디렉터리는 운영체제 내부의 파일 시스템이 관리하는 존재이다.
파일
- 보조기억장치에 저장된 관련 정보의 집합 → 의미있고 관련 있는 정보를 모은 논리적 단위
- 응용 프로그램이 파일에 바로 접근할 수 없으며 “시스템 호출”이 필요하다.
디렉터리 (=폴더)
- 마찬가지로 디렉터리에 접근하기 위한 시스템 호출을 제공한다.
- 디렉터리 엔트리
- 운영체제는 디렉터리를 파일의 일종으로 취급한다.
- 해당 디렉터리에 담겨 있는 대상(파일 또는 디렉터리)과 관련된 정보를 테이블 형태로 저장하여 관리한다.
- 각 엔트리에는 대상의 이름과 보조기억장치 내 저장된 위치 정보가 담겨있다.
15-2. 파일 시스템
파일시스템?
- 파일과 디렉터리를 보조기억장치에 저장하고 접근할 수 있게 하는 운영체제 내부 프로그램
파티셔닝과 포매팅
보조기억창치를 사용하기 위해선 파티셔닝과 포매팅 과정을 거쳐야한다.
- 파티셔닝(partitioning)
- 저장 장치의 논리적인 영역을 구분짓는 작업
- 파티션(partition): 파티셔닝으로 나뉘어진 각각의 영역
- 포매팅(formatting)
- 어떤 방식으로 파일을 저장하고 관리할 지 결정하는 작업
- ⇒ 즉 사용할 “파일 시스템”을 결정하는 작업
파일 할당 방법
- 운영체제는 파일을 블록(block) 단위로 관리한다.
- 하드디스크의 저장 단위는 “섹션” → 섹션을 묶은 게 “블록”
- 하나 이상의 블록에 파일을 할당한다.
- 연속 할당: 말그대로 연속적인 블록에 할당하는 방식
- 구현이 간단하지만 외부 단편화 야기
- 불연속 할당
- 연결 할당: 각 블록마다 다음 블록 주소를 기입 → 연결리스트 구조
- 외부 단편화 해결
- 반드시 첫번째 블록부터 차례대로 접근해야 한다.→ 오류 발생 시 해당 블록 이후로는 접근 불가
- → 임의 접근 속도 저하
- 색인 할당: 파일의 모든 블록 주소를 “색인 블록(index block)”에 모아 관리하는 방식
- 비교적 임의 접근이 쉽다.
- 색인 할당 방식의 파일 시스템은 디렉터리 엔트리에 색인 블록 주소를 함께 명시한다.
- 연결 할당: 각 블록마다 다음 블록 주소를 기입 → 연결리스트 구조
파일 시스템
- FAT파일 시스템
- FAT를 사용하여 연결 할당의 단점을 보완한 파일 시스템
- 파일 할당 테이블(File Allocation Table, FAT)
- 각 블록의 다음 블록 주소를 한데 모아 관리하는 테이블
- 디렉터리 엔트리에 첫번째 블록 주소가 함께 명시된다.
- 파티션 앞부분에 생성 되며 실행 도중 캐시될 수도 있다. → 임의 접근 성능 개선
- 유닉스 파일 시스템
- 색인 할당 기반의 파일 시스템
- i-node: 유닉스 파일 시스템의 색인 블록
- 파일 속성 정보가 디렉터리 엔트리가 아닌 i-node에 저장 됨 (디렉터리에는 <i-node 번호, 파일 이름> 저장)
- 최대 15개의 블록 주소까지 저장 가능
- 파일 크기가 클 경우 12개의 “직접 블록”과 3개의 “간접 블록” 사용
책 정보
혼자 공부하는 컴퓨터 구조+운영체제 : 네이버 도서
네이버 도서 상세정보를 제공합니다.
search.shopping.naver.com
'기록' 카테고리의 다른 글
혼공네트 4~7장 요약 정리 (0) | 2024.09.21 |
---|---|
혼공네트 1~3장 요약 정리 (0) | 2024.09.15 |
[도서] 객체지향의 사실과 오해 후기 (0) | 2024.03.06 |
[도서] 코어 자바스크립트 후기 (0) | 2024.02.14 |
51회 SQLD 합격 후기 및 회고 (0) | 2023.12.12 |