1. 가상 메모리
1.1. 연속 메모리 할당
- 연속 메모리 할당 : 프로세스A가 메모리를 차지하면, 프로세스B가 A의 메모리 다음 자리를 차지하듯, 프로세스에게 순차적으로 메모리의 공간을 할당하는 방식
1.1.1. 스와핑
- 현재 실행되지 않는 프로세스의 일부를 메모리에서 보조기억장치로 보내고 빈 메모리 공간을 다른 프로세스로 적재하여 실행하는 방식
- 스왑 영역 : 쫓겨난 프로세스가 가는 보조기억장치의 일부 영역
- 스왑 아웃 : 실행되지 않은 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것
- 스왑 인 : 스왑 영역에서 프로세스가 메모리로 돌아오는 것
- 프로세스가 스왑 아웃되기 전의 메모리 주소와 달라질 수 있다.
- 스와핑을 통해 프로세스들이 요구하는 메모리 주소 공간의 크기가 실제 메모리 ㅡ기보다 큰 경우에도 프로세스들을 동시 실행 가능
1.1.2. 메모리 할당
- 최초 적합 : 운영체제가 메모리 내의 빈 공간을 순서대로 검색하다가 가장 먼저 발견한 적재 가능 공간에 프로세스를 배치 -> 빈 공간 검색을 최소화
- 최적 적합 : 운영체제가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 가장 작은 공간에 배치
- 최악 적합 : 빈 공간을 모두 검색한 다음 가장 큰 메모리 공간에 배치
1.1.3. 외부 단편화
- 메모리에 프로세스들이 순차적으로 적재되어 실행되면, 먼저 작업이 끝난 프로세스가 메모리에서 이탈하며 메모리의 빈 공간이 듬성듬성 생기게 된다. 각각의 빈 공간에는 수용 가능한 프로세스만 담을 수 있어서 큰 메모리를 요구하는 프로세스는 메모리에 빈 공간에 접근할 수 없어 비효율적이다.
1.1.3.1. 외부 단편화 해결 방안
- 압축 : 메모리 조각 모음
- 단점 : 메모리 조각을 모으는 동안 시스템이 하던 일을 중지 및 오버헤드 야기
- 가상 메모리 기법
1.1.4. 확인 문제
- 최초 적합 : 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식
- 최악 적합 : 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식
- 최적 적합 : 프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식
1.2. 가상 메모리 기법
- 가상 메모리 : 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행
1.2.1. 페이징 기법
- 프로세스들을 일정 단위로 쪼개어 조각 난 프로세스 조각을 메모리에 불연속적으로 적재하여 실행
- 페이지 : 프로세스의 논리 주소 공간을 일정 단위로 자름
- 프레임 : 메모리 물리 주소 공간
- 페이지와 프레임을 일정하고 동일한 크기로 자른 뒤, 페이지를 프레임에 할당
- 페이지 아웃 : 페이징 시스템에서의 스왑 아웃
- 페이지 인 : 페이징 시스템에서의 스왑 인
1.2.1.1. 페이징 기법 단점
- 프로세스가 불연속적으로 적재되어 있기에 CPU가 각 프레임에 적재된 페이지 정보를 알 수 없음, 다음 실행할 명령어 위치 파악 난감
- 내부 단편화 문제 : 페이지로 프로세스를 잘랐으나 딱 맞게 나누어 떨어지지 않는 프로세스 파편으로 인해 발생하는 메모리 낭비
1.2.1.2. 페이징 기법 단점의 해결 - 페이지 테이블
- 물리주소에는 불연속적으로 배치되어도 논리 주소에는 연속적으로 배치되도록 함
- 페이지 테이블 : 페이지 번호와 프레임 번호가 매칭되도록 하는 곳
- 페이지 테이블 베이스 레지스터(PTBR - Page Table Base Register) : 각 프로세스의 페이지 테이블이 적재된 주소, CPU 내에 존재
- CPU는 페이지 테이블을 통해 각 프로세스 조각이 적재된 프레임 주소를 파악
- 페이지 테이블의 정보는 프로세스의 PCB에 기록됨
1.2.1.3. 페이지 테이블에 대한 고려 사항
- 페이지 크기가 크면 내부 단편화 문제 발생, 페이지 크기가 작으면 페이지 테이블이 커져 메모리 낭비됨
- 대형 페이지(huge page) : 기본적으로 설정된 페이지 사이즈보다 크면, 대형 페이지
- 페이지 테이블이 메모리에 있다면 메모리 접근 시간이 두 배로 늘어나 처리되는데 오래 걸린다.
- 페이지 테이블 정보 읽기 1회
- 페이지 테이블 정보를 통해 메모리 프레임에 접근 1회
- 총 2회의 메모리 접근
1.2.1.4. 페이지 테이블의 메모리 접근 횟수 감소를 위한 방안 - TLB
- Translation Lookaside Buffer(TLB) : 페이지 테이블의 캐시 메모리, 페이제 테이블의 일부 내용을 저장. 참조 지역성에 근거해 주로 최근에 사용된 페이지 위주로 저장
- TLB 히트 : CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우
- TLB 미스 : CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 없을 경우
1.2.1.5. 페이징에서의 주소 변환 방법
- 하나의 페이지 혹은 프레임은 여러 주소를 포괄하고 있기에 특정 주소에 접근하려면 두 가지 정보가 필요하다
- 어떤 페이지 혹은 프레임에 접근하려는지
- 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지
- 따라서 페이징 시스템에서의 모든 논리 주소는 페이지 번호와 변위로 구성되어 있음
- CPU가 32비트 주소를 내보냈다면 N비트=페이지 번호, 32-N비트= 변위로 구성됨
- 페이지 번호 : 접근하고자 하는 페이지의 번호, 페이지 테이블에서 페이지 번호를 찾으면 페이지가 어떤 프레임에 할당 되었는지 확인 가능
- 변위 : 접근하려는 주소가 프레임의 시작 번지로부터 얼마나 떨어져 있는지를 나타냄
- 논리 주소의 '페이지 번호' + '변위'를 가지고 페이지 테이블을 통해 물리 주소의 '프레임 번호' + '변위'로 변환된다.
1.2.1.6. 페이지 테이블 엔트리
- 페이지 테이블 엔트리 : 페이지 테이블의 각각의 행들
- 페이지 번호, 프레임 번호 외에 다른 정보도 포함되어 있음
- 유효 비트 : 현재 해당 페이지에 접근 가능 여부 표시, 현재 페이지가 메모리와 보조기억장치 중 어느 곳에 적재되어 있는지를 판단함. 메모리(1), 보조기억장치(0)
- 페이지 폴트 : 메모리에 적재되어 있지 않은 페이지로 접근할 때 발생하는 예외
- 페이지 폴트 처리 과정
가. CPU는 기존 작업 내역을 백업
나. 페이 폴트 처리 루틴 실행
다. 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효 비트를 1로 변경
라. 페이지 폴트를 처리했다면 CPU는 해당 페이지에 접근 가능
- 보호 비트 : 페이지 보호 기능, 해당 페이지의 읽기, 쓰기 가능 여부 확인. 읽기 전용 페이지에 쓰기를 시도하면 운영체제가 제재함.
- r(read), w(write), x(execute)로 구성 가능
- 참조 비트 : CPU가 이 페이지에 접근한 적이 있는지를 나타냄
- 수정 비트(더티 비트) : 해당 페이지에 데이터를 쓴 적이 없는지 수정 여부를 나타냄.
- 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지 여부를 판가름하기 위해 존재
- 메모리에서 쓰기 작업을 통해 수정이 발생한 경우, 보조기억장치에 기존의 파일 내용을 덮어써야한다. 이를 확인하기 위해 존재하는 비트
1.2.1.7. 페이징의 이점
- 외부 단편화 문제 해결
- 프로세스 간에 페이지를 공유 - 쓰기 시 복사
- 쓰기 시 복사 : 부모 프레세스 또는 자식 프로세스 둘 중에 하나가 페이지에 쓰기 작업을 하면 그 순간 해당 페이지가 별도의 공간으로 복제되어 각 프로세스는 자신의 고유한 페이지가 할당된 프레임을 가리킨다.
- 프로세스 생성 시간 단축 및 메모리 절약
1.2.1.8. 계층적 페이징
- 모든 테이블 엔트리를 항상 메모리에 유지하면 낭비가 되므로 이를 보완 하는 방법
- 다단계 페이지 테이블 기법 : 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식
- 페이지 테이블을 여러 개의 페이지로 쪼개고, 이 페이지들을 가리키는 페이지 테이블을 두는 방식(outer 페이지 테이블). 대신 outer 페이지 테이블은 항상 메모리에 유지
1.3. 페이지 교체와 프레임 할당
1.3.1. 요구 페이징
1.3.1.1. 요구 페이징의 진행 순서
- CPU가 특정 페이지에 접근 명령
- 해당 페이지가 현재 메모리에 있을 경우(유효 비트 1), CPU는 페이지가 적재된 프레임에 접근
- 해당 페이지가 현재 메모리에 없을 경우(유효 비트 0), 페이지 폴트 발생
- 페이지 폴트 처리 루틴은 해당 페이지를 메모리로 적재하고 유효 비트를 1로 설정
- 다시 1번을 수행
1.3.1.2. 순수 요구 페이징
- 아무런 페이지도 메모리에 적재하지 않고 실행하여 프로세스의 첫 명령어를 실행하는 순간부터 페이지 폴트 발생, 실행에 필요한 페이지가 어느 정도 적재된 이후부터 페이지 폴트 발생 빈도 급감
1.3.1.3. 요구 페이징 시스템의 필수 조건
- 페이지 교체 : 효율적인 메모리 사용을 위해 메모리에 적재된 페이지를 보조기억장치로 보냄
- 페이지 교체 알고리즘 : 보조기억장치로 보낼 페이지를 결정하는 알고리즘
- 프레임 할당
1.3.2. 페이지 교체 알고리즘
- 페이지 폴트가 적을수록 좋은 알고리즘을 의미
- 페이지 참조열을 통해 페이지 폴트 횟수를 알 수 있어야 함.
1.3.2.1. FIFO 페이지 교체 알고리즘
- 가장 먼저 올라온 페이지부터 내쫓는 방식
- 2차 기회 페이지 교체 알고리즘 : 메모리에 오래 머무른 페이지 중에 참조비트가 0인 페이지는 오랫동안 사용되지 않은 페이지로 인식하여 보조기억장치로 보낸다.
1.3.2.2. 최적 페이지 교체 알고리즘
- CPU에 의해 참조되는 횟수를 반영하여 자주 사용될 페이지를 선별
- 가장 낮은 페이지 폴트율을 보장
- 오랫동안 사용되지 않을 페이지를 예측하는 것이 어려워서, 다른 페이지 교체 알고리즘의 성능 평가 기준으로 활용함.
1.3.2.3. LRU 페이지 교체 알고리즘
- Least Reccently Used Page Replacement Algorithm
- 오랫동안 사용하지 않은 페이지가 앞으로도 사용되지 않을 것이라는 시각을 토대로 작성
1.3.2. 스래싱과 프레임 할당
1.3.2.1. 스래싱
- 스래싱(thrashing) : 프로세스가 실행되는 시간보다 페이징에 더 많은 시간을 소요하여 성능이 저해되는 문제
- 멀티프로그래밍의 정도 : 메모리에서 동시에 실행되는 프로세스의 수
- 스래싱의 원인 : 각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기 때문
1.3.2.2. 프레임 할당
- 정적 할당 방식 : 프로세스의 크기와 물리 메모리의 크기만을 고려한 할당 방식
- 균등 할당 : 모든 프로세스에 동일한 수의 프레임을 할당
- 비례 할당 : 프로세스 크기에 맞게 할당
- 동적 할당 방식 : 프로세스의 실행을 보고 할당할 프레임 수를 결정
- 작업 집합 모델 : 프로세스가 일정 기간 동안 참조한 페이지 집합을 기억하여 비번한 페이지 교체를 방지
- 페이지 폴트 빈도 : 페이지 폴트율에 상한선과 하한산을 정하고 그 내부 범위안에서만 프레임을 할당하는 방식
2. 파일 시스템
2.1. 파일과 디렉터리
- 파일 : 하드 디스크나 SSD와 같은 보조기억장치에 저장된 관련 정보의 집합
2.1.1. 파일의 구성
- 속성(메타데이터) : 파일의 형식, 위치, 크기, 보호, 생성 날짜, 마지막 접근 날짜, 마지막 수정 날짜, 생성자, 소유자 정보를 기록
- 확장자 : 파일의 유형을 알리는 방법
- 생성/삭제, 열기/닫기, 읽기/쓰기의 시스템 호출 제공
2.1.2. 디렉터리(폴더)
- 1단계 디렉터리 : 모든 파일이 하나의 디렉터리 아래에 있는 경우
- 트리 구조 디렉터리 : 여러 계층으로 구성된 디렉터리
- 루트 디렉터리 : 최상위 디렉터리
- 보조기억장치에 테이블 형태의 정보로 저장
2.1.2.1. 절대 경로와 상대 경로
- 절대 경로 : 루트 디렉터리에서 자기 자신까지 이르는 고유 경로
- 상대 경로 : 현재 디렉터리부터 사용하는 경로
2.2. 파일 시스템
- 파일과 디렉터리를 보조기억장치에 일목요연하게 저장하고 접근할 수 있게 하는 운영체제 내부 프로그램
2.2.1. 파티셔닝
- 파티션닝 : 저장 장치의 논리적인 영역을 구획하는 작업
- 파티션 : 파티셔닝 작업으로 나누어진 영역
2.2.2. 포매팅
- 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지를 결정하고, 새로운 데이터를 쓸 준비를 하는 작업을 의미
- 파티션 마다 다른 파일 시스템을 설정 가능
2.2.2.1. 파일 할당 방법
- 하드 디스크의 포맷팅이 끝나면 운영체제는 파일과 디렉터리를 블록 단위로 읽고 씀.
- 하나 이상의 섹터(하드 디스크의 가장 작은 용량 단위)를 하나의 블록으로 단위로 묶어 블록 단위로 파일과 디렉터리를 관리
파일 할당
- 연속 할당 : 보조기억장치 내 연속적인 블록에 파일을 할당
- 파일의 첫 번째 블록 주소와 블록 단위의 길이만 알면 됨
- 단순하지만 외부단편화 문제 야기
- 불연속 할당
- 연결 할당 : 각 블록 일부에 다음 블록의 주소를 저장하여 각 블록이 다음 블록을 가리키는 형태로 할당
- 연속 할당의 외부 단편화 문제 해결
- 반드시 파일의 첫 번째 블록부터 접근하여 차례대로 읽어야함. -> 임의 접근 속도가 매우 느림
- 하드웨어 고장이나 오류 발생 시 해당 오류 접근 불가
- 색인 할당 : 파일의 모든 블록 주소를 색인 블록(index block)에서 관리
- 파일 내 임의의 접근 용이
- 디렉터리 엔트리에 색인 블록 주소 명시
2.2.2.2. FAT 파일 시스템
- 연결 할당의 단점(블럭 안에 다음 블록의 주소를 저장) 보완
- 파일 할당 테이블(File Allocation Table)
- 디렉터리 엔트리에 파일 이름과 파일의 첫 번째 블록 주소를 명시
- FAT가 메모리에 적재되어 실행되면 임의 접근 성능이 개선됨
- 파티션 구성 예시
2.2.2.3. 유닉스 파일 시스템
- 색인 할당 기반의 유닉스 시스템
- 색인 블록(index-node) 기반으로 파일의 데이터 블록들을 찾는 방식
- 유닉스 파일 시스템의 파티션 구성
- i-node 하나는 여다섯 개의 블록을 차지하는 파일을 가리킬 수 있음
- 20개 이상의 블록을 차지하는 파일을 가리키는 방법
- i-node 하나가 가리키는 15개 중 12개의 블록에 파일 데이터가 저장된 블록주소를 직접 명시(직접 블록이라 지칭)
- i-node의 13 번째 블록 주소는 단일 간접 블록의 주소를 저장(단일 간접 블록 - 파일 데이터가 저장된 블록이 아닌 파일 데이터를 저장한 블록 주소가 저정된 블록)
- i-node의 14 번째 블록 주소는 이중 간접 블록 주소를 저장(이중 간접 블록 - 데이터 블록 주소를 저장하는 블록 주소가 저장된 블록, 단일 간접 블록들의 주소를 저장하는 블록)
- i-node의 15 번째 블록 주소는 삼중 간접 블록의 주소를 저장(삼중 간접 블록 - 이중 간접 블록 주소가 저장된 블록)
2.2.2.3. 저널링 파일 시스템
- 시스템 크래시 : 파일 시스템을 변경 도중 전원이 나가거나 치명적인 오류로 컴퓨터가 강제종료 되어 버린 상황
- 저널링 기법 : 작업 로그를 통해 시스템 크래시가 발생했을 때 빠르게 복구하기 위한 방법
- 파일 시스템 변경 작업의 순서
- 작업 직전 파티션의 로그 영역에 수행하는 작업(변경 사항)에 대한 로그를 남김
- 로그를 남긴 후 작업을 수행
- 작업이 끝났다면 로그를 삭제
- 파일 시스템이 남긴 로그를 읽고 수행 중이던 작업을 이어서 진행
2.2.2.4. 마운트
- 한 저장 장치의 파일 시스템에서 다른 저장 장치의 파일 시스템에 접근할 수 있도록 파일 시스템을 편입시키는 작업