프로세스에 연속적인 메모리 공간을 할당하는 방식을 연속 메모리 할당방식이라고 한다.
메모리상의 빈 공간에 또 다른 프로세스를 적재하여 실행하는 방식을 스와핑이라고 한다.
이 때 프로세스들이 쫓겨나는 보조기억장치의 일부 영역을 스왑 영역이라고 한다. 그리고 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것을 스왑 아웃, 반대로 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것을 스왑 인이라고 한다.
스와핑을 이요하면 프로세스들이 요구하는 메모리 주소 공간의 크기가 실제 메모리 크기보다 큰 경우에도 프로세스들을 동시 실행할 수 있다.
비어있는 메모리 공간에 프로세스를 연속적으로 할당하는 방식을 알아보자. 여기에는 대표젹으로 최초 적합, 최적 적합, 최악 적합이 있다.
최초 적합은 운영체제가 메모리 내의 빈 공간을 순서대로 검색하가 적재할 수 있는 공간을 발견하면 그 공간에 프로세스를 배치하는 방식이다.
최적적합은 운영체제가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 작은 공간에 프로세스를 배치하는 방식이다.
최악 적합은 운영체제가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간 중 가장 큰 공간에 프로세스를 배치하는 방식이다.
연속 메모리 할당은 외부 단편화라는 문제를 내포하고 있다. 외부 단편환느 프로세스들이 메모리에 연속적으로 할당되는 환경에서는 위와 같이 프로세스들이 실행되고 종료되기를 반복하며 메모리 사이 사이에 빈 공간들이 생긴다. 프로세스 바깥에 생기는 이러한 빈 공간들은 분명 빈 공간이지만 그 공간보다 큰 프로세스를 적재하기 어려운 상황을 초래하고, 결국 메모리 낭비로 이어지는 현상을 외부 단편화라고 한다.
외부 단편화를 해결할 수 있는 방안으로 메모리를 압축하는 방법이 있다. 메모리 조각 모음이라고도 부른다. 압축은 여기저기 흩어져 있는 빈 공간들을 하나로 모으는 방식으로 메모리 내에 지정된 프로세스를 적당히 재배치 시켜 흩어져있는 작은 빈공간들을 하나의 큰 빈공간으로 만드는 것이다.
하지만 압축 방식은 여러 단점이 있고, 다른 해결방안으로 가상 메모리 기법 중 페이징 기업이 오늘날까지 사용되고 있다.
가상 메모리는 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 메모리 크기보다 더 큰 프로세스를 실행할수 있게 하는 기술이다. 가상 메모리 기법에는 크게 페이징과 세그맨테이션이 있다.
만일 메모리와 프로세스를 일정한 단위로 자르고, 이를 메모리에 불연속적으로 할당할 수만 있다면 외부 단편화는 발생하지 않는다. 페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 자르고, 메모리 물리 주소 공간을 프레임이라는 페이지와 동일한 크기의 일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다.
페이징 시스템에서의 스왑 아웃은 페이지 아웃, 스왑인은 페이지 인이라고 부르기도 한다.
프로세스가 메모리에 불연속적으로 배치되면 CPU입장에서 '다음에 실행할 명령어 위치'를 찾기 어려워진다. 이를 해결하기 위해 페이징 시스템은 프로세스가 물리 주소에 불연속적으로 배치되더라도 논리주소에는 연속적으로 배치되도록 페이지 테이블을 이용한다.
페이지 테이블은 페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표이다. 다시 말해 현재 어떤 페이지가 어떤 프레임에 할당되었는지를 알려준다.
프로세스마다 각자의 페이지 테이블을 가지고 있고 각 프로세스의 페이지 테이블들은 메모리에 적재되어 있다. 그리고 CPU 내의 페이지 테이블 베이스 레지스터는 각 프로스의 페이지 테이블이 적재된 주소를 가리키고 있다.
페이지 테이블을 메모리에 두면 메모리 접근시간이 늘어다는 문제를 해결하기 위해 CPU곁에 TLB라는 페이지 테이블의 캐시 메모리를 두고 페이지 테이블의 일부 내용을 저장한다. 참조 지역석에 근거해 주로 최근에 사용된 페이지 위주로 가져와 저장한다.
CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB내에 있을 경우 이를 TLB 히트라고 한다. 하지만 만일 페이지 번호가 TLB에 없을 경우 어쩔 수 없이 페이지가 메모리 내의 페이지 테이블에 접근하는 경우를 TLB 미스라고 한다.
페이징 시스템에서는 모든 논리 주소가 기본적으로 페이지 번호와 변위로 이루어져 있다.
페이지 번호는 말 그대로 접근하고자 하는 페이지 번호이다. 변위는 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지를 알기 위한 정보이다.
페이지 테이블의 각각의 행들을 페이지 테이블 엔트리라고한다. 페이지 테이블 엔트리에는 페이지 번호, 프레임 번호 뿐만이 아닌 유효 비트, 보호 비트, 참조 비트, 수정 비트가 담겨져 있다.
유효 비트는 현재 해당 페이지에 접근 가능한지 여부를 알려준다. 페이지가 메모리에 적재되어 있다면 유효 비트가 1, 그렇지 않다면 0이 된다. 만일 CPU가 유효 비트가 0인 메모리에 적재되어 있지 않는 페이지로 접근하면 페이지 폴트라는 예외가 발생한다.
보호 비트는 페이지 보호 기능을 위해 존재한느 비트이다. 비트가 0일경우 이 페이지는 읽기만 가능한 페이지임을 나타내고, 1일 경우 읽고 쓰기가 모두 가능한 페이지임을 나타낸다.
참조 비트는 CPU가 이 페이지에 접근한적이 있는지 여부를 나타낸다. 적재 이후 CPU가 읽거나 쓴 페이지는 참조 비트가 1로 세팅되고, 적재 이후 한 번도 읽거나 쓴 적이 없는 페이지는 0으로 유지된다.
수정 비트는 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부를 알려준다. 더티 비트라고도 부른다. 이 비트가 1이면 변경된 적이 있는 페이지, 0이면 변경된 적이 없는 페이지임을 나타낸다.
운영체제는 프로세스들이 한정된 메모리를 효율적으로 이용할 수 있도록 불필요한 페이지를 선별하고, 프로세스들에 적절한 수의 프레임을 할당하여 페이지를 할당할 수 있게 하여야한다. 요구 페이징의 개녕과 페이지 교체 알고리즘, 그리고 프레임 할당에 대해 학습 해보자.
처음부터 모든 페이지를 적재하지 않고 필요한 페이지만(페이지 폴트가 발생하면)을 메모리에 적재하는 기법
요구 페이징 시스템이 안정적으로 작동하려면 필연적으로 다음 두가지를 해결해야 한다.
좋은 알고리즘이란 무엇일까? '고른 페이지를 스왑 아웃 시켰을 때 페이지 폴트가 자주발생하는 것'은 좋지않은 알고리즘이다.
그렇기에 페이지 교체 알고리즘을 제대로 이해하려면 페이지 폴트 횟수를 알 수 있어야 한다. 이는 페이지 참조열을 통해 알 수 있다. 페이지 참조열은 CPU가 참조하는 페이들 중 연속된 페이지를 생략한 페이지열을 의미한다.
메모리에 가장 먼저 올라온 페이지부터 내쫓는 방법이다. 가령 프로세스가 사용할수 있는 프레임이 세 개 있고, 페이지 참조열이 아래와 같다.
2 3 1 3 5 2 3 4 2 3
그렇다면 FIFO 페이지 교체 알고리즘은 네 번의 페이지 폴트가 발생한다. 페이지가 초기에 적재될 때 발생할 수 있는 페이지 폴트는 고려하지 않고, 적재된 페이지를 교체하기 위해 발생한 페이지 폴트만을 페이지 폴트로 간주했다.
구현은 간단하지만, 마냥 좋은 것은 아니다. 실행 초기에 적재되고 사용하지 않을 수도 있지만 내내 사용할 경우도 있을 수있다. 이런 페이지는 먼저 들어왔다고 내쫓으면 안되는 경우이다.
CPU에 의해 참조되는 횟수를 고려하는 페이지 교체 알고리즘이다. 앞으로의 사용 빈도가 가장 낮은 페이지를 교체하는 알고리즘을 페이지 교체 알고리즘으로 삼는것이 가장 합리적이고, 이 알고리즘이 최적 페이지 교체 알고리즘이다.
2 3 1 3 5 2 3 4 2 3
이 경우에 두 번의 페이지 폴트가 발생한다. 이 알고리즘은 이름 그대로 가장 낮은 페이지 폴트율을 보장한다. 하지만 실제 구현이 어렵다. 그 이유는 '앞으로 사용되지 않을 페이지'를 예측하기란 어렵고, 앞으로 어느 부분을 참조할지 미리 알기는 현실적으로 불가능에 가깝기 때문이다.
주로 다른 페이지 교체 알고리즘의 이론상 성능을 평가하기 위한 기준으로 사용된다.
최적 페이지 교체 알고리즘을 조금 변형하여 가장 오랫동안 사용되지 '않은' 페이지를 교체하는 알고리즘이다.
LRU 페이지 교체 알고리즘은 '최근에 사용되지 않은 페이지는 앞으로도 사용되지 않을 것'이라는 아이디어를 토대로 만들어진 알고리즘이다. 페이지마다 마지막으로 사용한 시간을 토대로 최근에 가장 사용이 적었던 페이지를 교체한다.
파일과 디렉터리는 모두 운영체제 내부 파일 시스템이 관리하는 존재이다.
하드 디스크나 SSD와 같은 보조기억장치에 저장된 관련 정보의 집합을 의미한다. 파일은 의미있고 관련 있는 정보를 모은 논리적 단위이다.
파일을 이루는 정보에는 이름과 파일을 실행하기 위한 정보, 그리고 파일 관련 부가 정보인 속성또는 메타데이터가 있다.
대표적인 속성의 종류는 다음과 같다.
속성 이름 | 의미 |
---|---|
유형 | 운영체제가 인지하는 파일의 종류 |
크기 | 파일의 현재 크기와 허용 가능한 최대 크기 |
보호 | 파일을 읽고, 쓰고, 실행할 수 있는지에 대한 사용자 권한 정보 |
날짜 | 생성 날짜, 마지막 접근 날짜, 마지막 수정 날짜 등 시간 정보 |
생성자 | 파일을 생성한 사용자 정보 |
소유자 | 파일을 소유한 사용자 정보 |
위치 | 파일의 보조기억장치상의 현재 위치 정보 |
파일 속성 중 파일 유형은 운영체제가 인식하는 파일 종류를 나타낸다. 이를 알리기 위해 흔히 사용하는 방식은 확장자를 이용한다.
파일 유형 | 대표적인 확장자 |
---|---|
실행 파일 | (확장자가 없는 경우), .exe, .com, .bin |
목적 파일 | .obj, .o |
소스 코드 파일 | .c, .cpp, .cc, .java, .asm, .py |
워드 프로세서 파일 | .xml, .rtf, .doc, .docx |
라이브러리 파일 | .lib, .a, .so, .dll |
멀티미디어 파일 | .mpeg, .mov, .mp3, .mp4, .avi |
백업/보관 파일 | .rar, .zip, .tar |
운영체제는 파일연산을 위한 시스템 호출을 제공한다.
1. 파일 생성
2. 파일 삭제
3. 파일 열기
4. 파일 닫기
5. 파일 일기
6. 파일 쓰기
파일들을 일목요연하게 관리하기 위해 디렉터리를 이용할수 있다. 윈도우에서는 폴더라고 부른다.
1단계 디렉터리 (single-level directory)는 옛날 운영체제의 형태로, 모든 파일이 하나의 디렉터리 아래에 있는 형태이다.
트리 구조 디렉터리 (tree-structured directory)는 최근 사용하는 거의 모든 운영체제의 형태로, 디렉터리 안에 또 다른 디렉터리가 존재할 수 있어 트리 구조를 이루는 형태. 이때 최상위 디렉터리는 루트 디렉터리라고 부르고 슬래시(/)로 표현한다. 하위 디렉터리는 서브 디렉터리 또는 자식 디렉터리라고 부른다.
(보기) 최초 적합, 최적 적합, 최악 적합
(1)
: 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식(2)
: 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식(3)
: 프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식답 : 1 - 최초 적합, 2 - 최악 적합, 3 - 최적 적합
답 - 2 3 1 3 5일떄 2가 가장 사용안됐으므로 페이지 폴트가 발생, (현재 5 3 1) - 2 3 1 3 5 2일때 1이 가장 사용 하지 않았으므로 페이지 폴트 발생(현재 5 3 2) - 2 3 1 3 5 2 3 4 일때, 5를 가장 사용하지 않았으므로 페이지 폴트 발생 (현재 4 3 2)
총 3번의 페이지 폴트가 발생한다.