03. 기억 장치 관리
01. 기억 장치의 계층과 사용 방식
1) 기억 장치의 계층 구조

- 프로그램이나 데이터는 보조 기억 장치에 저장되어 있다가 실행에 의해서 주기억 장치로 적제 되는데, 적재된 프로그램이나 데이터는 CPU에서 가져와 레지스터에 기억시킨 후 연산 장치를 통해 연산하거나 제어를 하게 됨
- 프로그램이나 데이터들은 보조 기억 장치, 주기억 장치를 통하여 CPU 내에 레지스터로 이동이 되는 과정에서 속도의 차이가 발생하고, 이러한 속도 차이를 캐시, 버퍼, 스풀 영역을 두어 극복하게 됨
- 스풀(Spool)은 보조 기억 장치에서 주기억 장치로 프로그램이나 데이터가 적재되는 과정에서 발생하는 속도 차이를 보조 기억 장치(주로 하드 디스크)가 중재함
- 버퍼(Buffer)는 주기억 장치에서 CPU로 적재되는 과정에서 발생하는 속도 차이를 주기억 장치(메모리)가 중재하는 장치
- 버퍼를 체계화하고 독립적으로 구성시킨 장치가 캐시(Cache) 기억 장치
- 레지스터는 CPU 내에 고속의 기억 장치로 CPU 동작에 필요 내용을 기억함
- 레지스터는 기억 장치 중에 가장 빠르며, 캐시 기억 장치와 주기억 장치는 직접 참조가 가능하지만 보조 기억 장치는 직접 참조할 수 없음
2) 기억 장치 계층 간의 관련 기술
- 가상 기억 장치(Virtual Memory)
- 보조 기억 장치인 하드 디스크 일부를 주기억 장치처럼 사용하는 기술
- 가상 디스크(Virtual Disk)
- 주기억 장치 일부를 보조 기억 장치인 하드 디스크처럼 사용하는 기술
- 인터리빙(Interleaving)
- 효율적으로 주기억 장치에 접근하기 위하여 여러 개의 독립된 기억 장치 모듈로 나누어 동시에 접근할 수 있도록 하는 방법
- 메모리 인터리빙은 단위 시간에 여러 기억 장치 모듈에 동시 접근이 가능하도록 하여 주기억 장치의 액세스 속도를 빠르게 함
- 사이클 스틸링(Cycle Stealing)
- 중앙 처리 장치(CPU)가 입출력 전용 프로세서인 채널(Channel)에 주기억 장치의 접근을 양보하여 입출력의 효율을 높이려는 방법
3) 기억 장치 사용 방식
1. 기억 장치 사용 방식
- 운영체제 입장에서는 CPU가 하나의 프로그램을 실행한다는 것은 CPU 이용률이 너무 낮으므로 동시에 여러 개의 프로그램을 적재하여 CPU 이용률을 극대화하기를 원함
- 이런 이유로 운영체제는 주기억 장치를 분할하여 여러 개의 프로그램을 적재하였고, 주기억 장치보다 큰 프로그램을 실행하기 위해서는 보조 기억 장치를 주기억 장치처럼 사용하는 가상 기억 장치 기술을 개발하여 현재까지 사용하고 있음
2. 기억 장치 사용 방식의 분류

- 주기억 장치-단일 프로그래밍
- 하나의 프로그램을 주기억 장치에 적재하여 운영하는 방식
- 주기억 장치-다중 프로그래밍
- 여러 개의 프로그램을 주기억 장치에 적재하여 운영하는 방식으로 주기억 장치의 분할이 필요함
- 보조 기억 장치-단일 프로그래밍
- 하나의 프로그램을 적재하여 사용하지 않으므로 의미가 없음
- 보조 기억 장치-다중 프로그래밍
- 보조 기억 장치를 주기억 장치처럼 사용하여 여러 개의 프로그램을 주기억 장치에 적재하여 운영하는 방식으로 보조 기억 장치에 있는 프로그램 파일의 분할이 필요함
3. 단편화(Fragmentation)
- 주기억 장치상에서 빈번하게 기억 장소가 할당되고 반납됨에 따라 기억 장소들이 조각들로 나누어져서 사용하지 못하는 공간
- 내부 단편화(Internal Fragmentation)
- 이미 정해진 크기에 프로그램을 할당하고 남은 기억 공간으로 사용되지 못하는 공간
- 외부 단편화(External Fragmentation)
- 사용 가능한 분할 영역은 있지만 프로그램의 크기가 커서 사용하지 못하는 기억 공간
02. 주기억 장치 사용 방식
1) 주기억 장치-다중 프로그래밍
- 주기억 장치를 분할하여 여러 개의 프로그램을 적재
- 여러 개의 프로그램이 주기억 장치에 적재됨
- 주기억 장치는 크기에 한계가 있으므로 하나의 프로그램의 크기가 상대적으로 작아짐
- 고정 분할(정적 분할) 할당 기법
- 주기억 장치의 크기를 다르게 분할하되 항상 고정된 크기를 갖는 형태로 분할하는 방식
- 분할된 영역이 고정되어 있으므로 프로그램이 적재되고 남는 공간이 생김
- 프로그램이 주어진 분할 안에 다 들어갈 수 없는 경우가 생길 수 있음
- 프로그램이 실행되기 위해서는 그 전체가 주기억 장치에 있어야 함
- 내부, 외부 단편화가 모두 존재함
- 단편화가 많아 효율적이지 못함
- 분할된 최대 영역보다 큰 프로그램은 적재할 수 없음
- 가변 분할(동적 분할) 할당 기법
- 프로그램의 크기에 따라 주기억 장치 분할 크기를 동적으로 분할하는 방식
- 미리 크기를 결정하지 않고 실행할 프로세스의 크기에 맞게 기억 장소를 분할함
- 외부 단편화만 존재함
- 기억 장소 활용률이 높아짐
- 고정 분할 방식에 비해 실행될 프로세스 크기에 대한 제약이 완화됨
- 주기억 장치의 크기를 넘지 않는 범위에서 큰 프로그램을 적재할 수 있음
- 주기억 장치 관리 레지스터
- 주기억 장치는 물리적으로 연속적인 공간
- 주기억 장치의 분할 영역, 프로그램이 적재되는 위치, 프로그램이 시작되는 위치 등을 CPU 내에 레지스터가 기억하고 있음
- 경계 레지스터(Boundary Register)
- 사용자 영역에 존재하는 프로그램이 운영체제 영역을 침범하지 못하도록 함
- 차폐 레지스터(Fence Register)
- 분할된 영역을 다른 프로그램이 사용하지 못하도록 분할 영역의 위치를 기억함
- 베이스 레지스터(Base Register)
- 주기억 장치에 적재된 프로그램의 시작 위치를 기억하고 있음
- 재배치 레지스터(Relocation Register)
- 프로그램이 한 영역에서 다른 영역으로 옮겨지더라도 명령의 주소 부분을 바꾸지 않고 정상적으로 실행될 수 있도록 함
- 통합(Coalescing)
- 인접한 공백들을 하나의 공백으로 합하는 과정
- 분할 공간은 있지만 프로그램의 크기가 커서 적재되지 못할 때 차폐 레지스터를 이동하여 적재 공간을 확보함
- 83K 프로그램이 80K 분할 공간에 적재되지 못해 80K의 외부 단편화가 발생할 때, 차폐 레지스터를 위쪽으로 이동하여 바로 위의 기억 공간의 내부 단편화로 남은 공간과 통합하여 프로그램을 적재시킬 수 있음
- 집약(압축, Compaction)
- 서로 떨어져 있는 여러 개의 낭비 공간을 모음
- 사용되고 있는 모든 프로그램을 주기억 장치의 한쪽 끝으로 옮기는 것
- 차폐 레지스터를 모두 프로그램 크기에 맞게 이동하여 내부 단편화를 모두 없앰
- 압축 후에는 기억 공간에 큰 공간이 남게 됨
- 압축은 단편화의 적극적인 해결 방안
- 시스템은 압축이 실행되는 동안 모든 일을 중지함
- 디스크 조각 모음(Garbage-Collection)도 압축과 같은 개념의 기술
03. 가상 기억 장치 사용 방식
1) 보조 기억 장치-다중 프로그래밍
1. 가상 기억 장치(Virtual Memory)의 등장 배경
- 주기억 장치를 이용하는 다중 프로그래밍 방식은 모든 프로그램이 주기억 장치에 적재되어야만 실행됨
- 적재되는 프로그램이 많을수록 분할된 영역의 크기가 상대적으로 작아지므로 프로그램의 크기도 작아질 수밖에 없음
- 소프트웨어 기술이 발전되고, 사용자의 요구가 늘어나면서 프로그램의 크기는 오히려 커지고 있음
- 이런 이유로 보조 기억 장치인 디스크를 주기억 장치처럼 사용하는 가상 기억 장치 기술이 등장함
2. 가상 기억 장치 기술
- 가상 기억 장치의 기술은 프로그램이 주기억 장치에 모두 적재되어야 할 필요가 없다는 것에서 출발함
- 주기억 장치에 프로그램이 모두 적재되어 실행되는 것보다는 복잡하고, 느리지만 프로그램의 크기 제한이 없어졌다는 것은 소프트웨어 개발 기술이 급속도로 발전할 수 있는 계기가 됨
- 가상 기억 장치 기술의 등장으로 사용자 프로그램의 크기에 제한이 없어짐
- 한 순간에 실행되는 프로그램의 크기는 매우 작으므로 디스크에 존재하는 프로그램을 작은 크기로 분할하여 필요할 때마다 주기억 장치에 적재하거나 교체하면서 실행할 수 있다는 것
- 프로그램을 작은 크기로 분할 할 때, 분할 크기가 모두 똑같다면 페이지(Page), 서로 다르면 세그먼트(Segment)라고 함
- 페이지로 운영하면 페이징(Paging), 세그먼트로 운영하면 세그먼테이션(Segmentation)이라고 함
3. 가상 기억 장치의 특징
- 사용하지 않는 프로그램을 외부 기억 장치로 옮김으로써 주기억 장치의 실제 크기보다 큰 프로그램을 실행할 수 있게 하는 기억 장치
- 가상 기억 장치는 주기억 장치 안의 프로그램 양이 많아질 때 사용하지 않는 프로그램을 보조 기억 장치 안에 특별한 영역으로 옮겨서 보조 기억 장치 일부분을 주기억 장치처럼 사용할 수 있음
- 프로그램을 여러 개의 작은 블록 단위로 나누어서 가상 기억 장치에 보관해 놓고, 프로그램 실행 시 요구되는 블록만 주기억 장치에 불연속적으로 할당하여 처리함
- 가상 메모리는 디스크와 같은 보조 기억 장치에 가상의 공간을 만들어 주기억 장치처럼 활용하도록 하여 실제 주기억 장치의 물리적 공간보다 큰 주소 공간을 제공함
2) 페이징(Paging) 기법
1. 페이징 기법의 특징
- 페이징 기법의 블록의 크기는 고정적
- 페이지 크기가 작을수록 더 많은 페이지 사상표가 필요하여 기억 공간이 낭비됨
- 페이지 사상표
- 가상 기억 장치에 존재하는 페이지들은 필요할 때마다 주기억 장치에 적재되면서 실행되는데, 이때 운영체제는 페이지마다 적재된 정보를 기록해야 하는데 이 기록부를 페이지 사상 테이블이라고 함
- 페이지 사상 테이블은 모든 페이지의 정보를 기록하게 됨
- 만약 페이지 수가 늘어나게 되면, 페이지 사상 테이블의 행의 개수도 같이 늘어나서 페이지 사상 테이블을 기억하기 위한 기억 장소가 낭비됨
- 페이지 크기가 작을수록 내부 단편화 크기는 줄어들게 됨
- 페이지 크기가 작을수록 꼭 필요한 내용만 사용하므로 유용도가 좋아짐
- 페이지 크기가 작을수록 페이지 부재가 증가함
- 페이지 크기가 작을수록 자주 사용하는 작업 집합을 효율적으로 운영할 수 있음
- 페이지 크기가 작을수록 특정한 참조 지역성만을 포함하기 때문에 기억 장치 효율이 높을 수 있음
- 페이지 크기가 클수록 참조되는 정보와는 무관한 많은 양의 정보가 주기억 장치에 남게 됨
- 페이지 크기가 클수록 페이지 테이블이 복잡하지 않으므로 관리가 용이함
- 페이지 크기가 크면 하나의 페이지를 디스크로부터 입출력하는 시간은 커지게 됨
- 페이지 사상표
2. 페이징 기법의 관련 용어
- 스와핑(Swapping)
- 작업의 모든 부분이 동시에 주기억 장치에 상주해 있을 필요가 없음
- 프로그램을 분할하여 당장 필요한 부분만 교체하면서 실행하는 방법
- 페이지 부재(page Fault)
- 가상 기억 장치 시스템에서 가상 페이지 주소를 사용하여 데이터에 접근하는 프로그램이 실행될 때, 프로그램에서 접근하려고 하는 페이지가 주기억 장치에 없을 때 발생하는 현상
- 스레싱(Thrashing)
- 동시에 여러 개의 작업이 수행되는 다중 프로그래밍 시스템 또는 가상 기억 장치를 사용하는 시스템에서 하나의 프로세스가 작업 수행 과정 중 지나치게 페이지 부재가 발생함으로 인하여 전체 시스템의 성능이 저하되는 현상
- 구역성(Locality)
- 프로그램이 실행할 때 기억 장치 내의 모든 정보를 균일하게 참조하는 것이 아니라 어느 한 순간에 특정 부분을 집중적으로 참조하는 프로그램의 순차적인 성질로, 한번 호출된 자료나 명령이 곧바로 다시 사용될 가능성을 말함
- 시간 구역성
- 반복(Looping), 부 프로그램(Subroutine, 서브 루틴), 스택(Stack), 집계(Counting, Totaling) 변수
- 공간 구역성
- 배열 순회(Array Traversal), 순차적 코드, 변수 선언
- 작업 집합(Working Set)
- 실행 중인 프로세스가 일정 시간 동안 참조하는 페이지들의 집합
- 자주 참조되는 페이지의 집합으로 주기억 장치에 고정 배치하여 교체 대상에서 제외함으로 교체 성능을 높이는 방법
- 주기억 장치에 적재되지 않으면 스레싱이 발생할 수 있음
- 주기억 장치에 적재되어야 효율적인 실행이 가능함
- 작업 집합은 언제든 변경될 수 있음
3) 세그먼테이션(Segmentation) 기법
1. 세그먼테이션 기법의 특징
- 프로그램을 동일한 페이지 크기로 분할하지 않고 프로그램 기능에 맞게 분할하는 것
- 기능별로 분할한 블록을 세그먼트라고 하며, 주기억 장치를 프로그램 별로 구분하지 않고 주기억 장치 전체를 이용하여 적재함
- 주기억 장치 전체에 분산된 같은 종류의 프로그램을 구분하기 위해서 기억 장치 보호키(Storage Protection Key)를 이용함
- 세그먼테이션 기법은 블록이 가변적
- 페이지 프레임처럼 주기억 장치를 구분하지 않고 주기억 장치 전체를 비연속적으로 할당 받아 사용함
- 세그먼테이션 기법을 사용하는 가장 큰 이유는 메모리를 효율적으로 관리하기 위함
- 여러 개로 분리된 세그먼트가 주(실)기억 장치를 차지할 수 있도록 해주어야 하며, 각 세그먼트는 같은 크기일 필요는 없으나 연결된 기억 장소로 구성되어야 함
- 페이징 기법에 비해 물리적 개념보다는 논리적이라는 장점이 있음
- 세그먼트의 길이(크기)가 모두 다르기 때문에 세그먼트 길이에 맞는 주기억 장치의 영역을 할당하지 못하면 다른 프로그램 영역을 침범하게 되는 세그먼트 오버플로우 결함(Segment Overflow Fault)이 발생함
- 외부 단편화만 발생함
- 주기적으로 압축이 필요함
2. 페이지 세그먼테이션의 사용 방식
- 페이지와 세그먼트 기법을 혼용하는 방식
- 하나의 세그먼트를 여러 개의 동일한 크기의 페이지로 구분하여 사용할 수 있음
- 주소 지정 블록은 세그먼트 번호와 페이지 번호가 존재함
