📌 Index
- 메모리
- 주기억장치와 보조기억장치
- 메모리 관리
✔️ 메모리
메인 메모리(Main Memory, Physical Memory, 주기억장치)
CPU가 직접 접근할 수 있는 기억 장치로, 프로세스가 실행되려면 프로그램 코드를 메인 메모리에 적재해두어야 한다. 그러나 만약 프로그램 용량이 메인 메모리 보다 크다면, 어떻게 될까?
가상 메모리(Virtual Memory)
가상 메모리(Virtual Memory)는 물리적 메모리 크기의 한계를 극복하기 위해 나온 기술이다. 즉, 물리 메모리보다 큰 프로세스를 수행하기 위해 가상 메모리를 사용한다. 예를 들어, 100MB 메모리 크기에서 200MB 크기의 프로세스를 수행할 수 있도록 하는 것이다. 필요한 부분만 메모리에 적재하고, 프로세스를 실행 시 실행에 필요한 부분만 메모리에 올린다.
실제 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리한 것으로, 사용자에게 한정적인 메모리 공간보다 더 많은 메모리를 제공하기 위해 가상 주소를 사용한다. 컴퓨터의 물리적 메모리 부족을 보완하고, RAM(Random Access Memory)에서 디스크 스토리지로 데이터를 일시적으로 전송하는 스와핑을 할 수 있게하며, 컴퓨터가 보조 메모리를 주 메모리인 것처럼 처리할 수도 있다.
가상 주소는 메모리 관리 장치(MMU)에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 된다. 여기서 가상 주소 공간은 하나의 프로세스가 메모리에 저장되는 논리적인 모습을 가상 메모리에 구현한 공간이며, 가상 주소(logical address 또는 virtual address)는 해당 공간을 가리키는 가상적으로 주어진 주소이다. 실제 메모리 상에 있는 주소는 실제 주소(physical address)라고 한다.
가상 메모리가 필요한 이유
물리 메모리의 한계
- 모든 프로그램 코드를 물리 메모리에 올릴 수 없다.
- 그렇다고 프로그램을 교체하면서 올리면, 메모리 교체 성능 문제가 발생한다.
가상 메모리의 장점
- 프로그램 용량이 실제 물리 메모리보다 커도 된다.
- 전체 프로그램이 물리 메모리에 올라와 있지 않아도 된다.
- 더 많은 프로그램을 동시에 실행할 수 있다.
- 응답 시간은 유지
- CPU 이용률과 처리율은 증가
즉, 다중 프로그램을 실현하기 위해 물리 메모리의 제약을 보완하고, 프로세스 전체를 메모리에 올리지 않고도 실행할 수 있도록 해준다.
가상 메모리의 주요 기능
- 주기억장치의 효율적 관리(스와핑) : 하드디스크를 주기억장치에 대한 캐시로 설정하여, 당장 사용하는 영역만 유지하고, 사용하지 않는 데이터는 하드디스크로 옮긴 뒤 필요할 때만 램에 데이터를 불러와 올리고, 다시 사용하지 않으면 하드디스크로 내림으로써 램을 효과적으로 관리한다.
- 메모리 관리의 단순화 : 각 프로세스마다 가상 메모리의 통일된 주소 공간을 배정할 수 있으므로 메모리 관리가 단순해진다.
- 메모리 용량 및 안전성 보장 : 한정된 공간의 램이 아닌, 거의 무한한 가상 메모리 공간을 배정함으로써 프로세스들 사이의 메모리 침범이 일어날 여지를 크게 줄인다.
✔️ 주기억장치와 보조기억장치
가상 메모리의 구현
운영체제는 물리 메모리의 제약을 갖고 있는 주기억장치를 보조하기 위해, 디스크를 보조 기억 장치(Paging Space)로 사용한다.
메인 메모리(주기억장치)와 디스크의 페이징 스페이스(보조 기억 장치)를 묶어 하나의 메모리 처럼 동작하게 하며, 이를 통해 메인 메모리의 한계를 넘는 메모리 사용을 가능하게 하는 가상 메모리를 구현한다.
스와핑(Swapping)
메모리는 크기가 크지 않기 때문에 프로세스를 임시로 디스크에 보냈다가 다시 메모리에 로드해야 하는 상황이 생긴다. 이때 디스크로 내보내는 것을 swap out, 메모리로 들여보내는 것을 swap in이라고 한다. 일반적으로 중기 스케줄러에 의해 swap out 시킬 프로세스를 선정하며, 우선순위에 따라 어떤 프로세스를 swap in/out 할지 결정한다. 우선순위가 낮은 프로세스를 swap out 시키고, 높은 프로세스를 메모리에 올려놓는 방식이다.
이러한 Swap 작업에는 디스크 전송 시간이 들기 때문에, 메모리 공간이 부족할 때 Swapping이 이루어진다. 페이지 폴트(page fault)가 발생한 경우 메모리의 당장 사용하지 않는 영역을 하드디스크로 옮기고, 하드디스크의 일부분을 "마치 메모리처럼" 불러와 사용한다.
페이지 폴트(page fault, 페이지 부재)
프로세스의 주소 공간에는 존재하지만, 컴퓨터의 RAM에는 없는 데이터에 접근하는 경우 발생하는 것으로, 메인 메모리에 없는 페이지를 접근하려고 할 때 발생하는 운영체제의 trap이다. 다음 과정은 page fault가 발생했을 때 처리하는 과정을 나타낸 것이다.
스와핑 과정
- CPU는 물리 메모리를 확인하여 해당 페이지가 없으면 trap을 발생(page fault)하여 운영체제에 알린다.
- 운영체제는 CPU의 동작을 잠시 멈춘다.
- 운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는 지 확인하고, 없으면 스와핑이 발동한다.
- 비어 있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화한다.
- 중단되었던 CPU를 다시 시작한다.
✔️ 메모리 관리
다중 프로그래밍 시스템에 여러 프로세스를 수용하기 위해 주 기억 장치(RAM)을 동적 분할하는 메모리 관리 작업이 필요하다. 즉, 하드 디스크에 있는 프로그램을 어떻게 메인 메모리에 적재할 것인지 판단해야 한다.
메모리는 일반적으로 커널 영역과 사용자 프로세스 영역으로 나뉘어서 사용된다. 그중 사용자 프로세스 영역의 할당 방법으로는 Contiguous Allocation(연속적 할당), Noncontiguous Allocation(비연속적 할당)으로 나뉜다.
연속 메모리 관리
Contiguous Allocation(연속 할당) 시스템은 말 그대로, 각 프로세스들이 연속적인 메모리 공간을 차지하게 되는 것이다. 각 프로세스를 메모리에 담기 위해 메모리는 미리 공간을 분할해두는데, 고정된 크기로 나누는 고정 분할 방식과 프로세스의 크기를 고려해서 나누는 가변 분할 방식이 있다.
- 고정 분할 기법(Fixed partition) : 주 기억 장치가 고정된 파티션으로 분할
- 내부 단편화, 외부 단편화 발생
- 분할의 크기가 모두 동일하거나 혹은 서로 다를 수 있다. 분할 당 하나의 프로세스가 적재되기 때문에 동시에 메모리에 load 되는 프로세스의 수가 고정된다. 또한 수행 가능한 프로세스의 최대 크기가 제한된다.
- 동적(가변) 분할 기법(Variable partition) : 파티션들이 동적으로 생성되며, 자신의 크기와 같은 파티션에 적재
- 외부 단편화 발생
- 프로세스의 크기를 고려해서 할당하기 때문에 분할의 크기나 개수가 동적으로 변하며, 이를 위해서는 기술적인 관리 비법이 필요하다.
Contiguous Allocation에서 메모리를 분할하는 각 단위는 Block이고, 프로세스가 사용할 수 있는 Block을 Hole이라고 한다. 다양한 크기의 Hole들이 메모리 여러 곳에 흩어져 있고, 프로세스가 도착하면 수용 가능한 Hole을 할당시켜준다. 동적 분할 방식에서 크기가 n인 프로세스가 들어갈 가장 적절한 Hole을 찾는 문제를 Dynamic Storage-Allocation Problem이라고 하는데, 세 종류의 해결법이 있다.
- First-fit
크기가 n 이상이 Hole 중 최초로 발견한 Hole에 해당한다.
- Best-fit
크기가 n 이상인 가장 작은 Hole을 찾아 할당한다. Hole들이 크기 순으로 정렬되지 않은 경우 모든 Hole을 탐색해야 한다. 항상 거의 딱 맞는 크기를 할당하기 대무에, 할당 후에 아주 작은 Hole들이 많이 생성된다.
- Worst-fit
가장 큰 Hole에 할당한다. 마찬가지로 모든 Hole을 탐색해야 하고, 상대적으로 아주 큰 Hole들이 새로 생성된다.
First-fit과 Best-fit이 Worst-fit에 비해서는 속도나 공간 측면에서 효과적인 것으로 알려져 있으나, 전체적으로 효율이 좋지 않은 편이다. 이와 같이 연속 메모리 관리 기법을 사용할 경우, 단편화 현상이 발생하게 된다.
단편화(Fragmentation)
단편화는 프로세스들이 메모리에 적재되고 제거되는 일이 반복되면 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 공간들이 늘어나게 되는 현상을 말한다. 이러한 단편화는 2가지로 나뉜다
내부 단편화(Internal Fragmentation)
내부 단편화는 프로세스가 사용하는 메모리 공간보다 분할된 공간이 더 커서 메모리가 남는 경우를 말한다. 예를 들어 1000 크기의 분할이 있고, 990 크기의 프로세스가 들어갈 때, 10만큼의 공간이 남게 되는데, 이 현상을 내부 단편화라고 한다.
외부 단편화(External Fragmentation)
외부 단편화는 총공간을 계산했을 때 프로세스가 들어갈 수 있는 메모리가 있음에도 불구하고, 공간들이 연속하지 않아 사용할 수 없는 경우를 말한다.
고정 분할은 외부 단편화와 내부 단편화 모두 발생할 수 있고, 가변 분할은 외부 단편화가 발생할 수 있다.
외부 단편화를 해결하는 방법으로는 Compaction(압축)이 있다. Compaction은 프로세스가 사용하는 공간들을 한쪽으로 몰아서 공간을 확보하는 방법이다. 하지만 Compaction은 비용이 매우 많이 드는 작업이므로 효율이 좋지 않다.
불연속 메모리 관리
프로그램의 일부가 서로 다른 주소 공간에 할당될 수 있는 기법이다. 앞서 봤던 단편화 문제를 해결하기 위해 제시된 기법으로, 외부 단편화 해소를 위한 페이징과 내부 단편화 해소를 위한 세그멘테이션으로 나뉜다.
Reference