저장 공간은 계층구조를 가진다. CPU와 가장 가까운 공간부터 레지스터 -> CPU캐시 -> 메인메모리 -> 보조기억장치 -> 외부기억장치 순이며, 이 저장 공간들은 CPU로부터 멀어질수록 데이터를 저장하는 용량이 커지고 접근하는 속도는 느려진다.
레지스터
CPU(Central Processing Unit)가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치이며 속도가 매우 빠름
캐시 메모리
속도가 느린 하드디스크에 대한 엑세스를 극도로 줄이기 위해 하드디스크를 자주 참조하는 프로그램이나 데이터를 미리 읽어들이기 위한 메모리
RAM
일반적으로 말하는 메모리이며, 메인메모리(주기억장치)라고 한다.
실행하는 프로그램(프로세스)이 로드되는 장소이다. 하드디스크와 같은 보조기억장치는 읽고 쓰는 처리가 매우 느리므로 하드디스크에 저장된 프로그램을 메모리로 읽어들여 실행하는 것이 효율적이다.
주기억장치는 CPU와 상호작용하며 Load 명령을 통해 주기억장치에서 CPU내부의 레지스터로 데이터를 이동시키고, Store 명령은 CPU 내부의 레지스터의 내용을 주기억장치로 이동시킨다.
보조기억장치
프로그램을 영구히 저장할 수 있는 저장 장치로서 하드 디스크나 SSD 등이 있다. 일반적으로 프로그램들은 보조기억장치에 저장되며 그 중에서 실행을 한 프로그램이 프로세스가 되어 주기억장치에 적재되고 CPU가 처리해 프로그램이 작동하게 되는 것이다.
외부기억장치
프로그램이나 파일을 본체 밖에 저장하기 위한 장치로, 자기디스크, 자기테이프 등이 있다.
메모리 관리는 컴퓨터 메모리를 관리하는 행위이다. 가장 단순한 형태의 메모리 관리 방법은 프로그램의 요청이 있을 때, 메모리의 일부를 해당 프로그램에 할당하고, 더 이상 필요하지 않을 때 나중에 다시 사용할 수 있도록 할당을 해제하는 것이다.
메모리 관리를 위해 사용되는 기법 중 하나인 스와핑(swapping)은 프로세스를 불러들이기 위한 공간이 메모리에 부족하다면 현재 메모리에 적재된 프로세스들을 보조기억장치로 내보내고(swap out), 원하는 프로세스를 주기억장치로 불러들이는 (swap in) 방식이다.
기억장치의 관리를 위해 운영체제는 보조기억장치에 보관 중인 프로그램이나 데이터를 언제 주기억장치로 적재할 것인지를 결정
새로 반입되는 프로그램이나 데이터를 주기억장치의 어디에 위치시킬 것인지를 결정
주기억장치의 모든 영역이 이미 사용중인 상태에서 새로운 프로그램이나 데이터를 주기억장치에 배치하려고 할 때 사용되고 있는 영역 중에서 어느 영역을 교체하여 사용할 것인지를 결정
프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면, 메모리 공간이 작은 공간으로 나누어져 사용가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 보고 메모리 단편화가 생겼다고 한다.
내부단편화
분할된 영역이 할당된 프로그램의 크기보다 크기 때문에 프로그램이 할당된 후 사용되지 않게 남게되는 빈 공간. 예를 들어 메모리 분할 자유 공간이 10,000B 있고 Process A 가 9,998B 사용하게되면 2B 라는 차이 가 존재하고, 이 현상을 내부 단편화라 칭한다.
외부단편화
분할된 영역이 할당될 프로그램의 크기보다 작기 때문에 프로그램이 할당 될 수 없어 사용되지 않고 빈 공간으로 남게 되는 영역
해결방법은 가상메모리를 이용하여 내부 단편화 기법을 해결하는 세그멘테이션과 외부 단편화를 해결하는 페이징 기법이 있다.
페이징 기법을 사용하게되면 하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없애 외부 단편화 문제점을 해결할 수 있다.
가상기억장치를 일정한(고정된) 크기를 가진 블록인 페이지 단위로 나누고 물리 메모리는 페이지 크기와 같은 프레임으로 나누어 사용한다.
하나의 프로세스가 사용하는 공간은 여러개의 페이지로 나뉘어서 관리되고(논리 메모리에서), 개별 페이지는 순서에 상관없이 물리 메모리에 있는 프레임에 mapping 되어 저장된다고 볼 수 있다.
메모리를 서로 크기가 다른 논리적인 블록 단위인 세그먼트로 분할하여 메모리를 할당하는 기법이다.
사용자가 세그먼트 번호와, 변위 두 개의 주소로 지정하고 세그먼트 테이블에는 각 세그먼트의 기준(세트먼트들의 시작 물리 주소)과 한계(세그먼트의 길이)를 저장한다.
-단점
가상메모리를 사용하여 내부 단편화는 해결하지만 외부 단편화 문제는 여전히 존재한다. 서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되다 보면, 자유 공간들이 많은 수의 작은 조각들로 나누어져 못 쓰게 될 수도 있기 때문이다.
주기억장치 안의 프로그램 양이 많아질 때, 사용하지 않는 프로그램을 보조기억장치 안의 특별한 영역으로 옮겨서 그 보조기억장치 부분을 주기억장치처럼 사용할 수 있는데, 이를 가상 메모리라고 한다.
이런 가상 메모리는 프로그램을 여러 개의 작은 블록 단위로 나누어서 보관해 놓고, 프로그램 실행 시 요구되는 블록만 주기억장치에 불연속적으로 할당함으로써 프로세스 전체가 메모리에 적재되지 않아도 프로세스의 실행이 가능하도록 한다.
프로그램의 일부분만 메모리에 올려 얻을 수 있는 이점은
가상적으로 주어진 주소를 가상 주소(virtual address) 또는 논리 주소(logical address) 라고 하며, 실제 메모리 상에서 유효한 주소를 물리 주소(physical address) 또는 실주소(real address)라고 한다. 가상 주소의 범위를 가상 주소 공간, 물리 주소의 범위를 물리 주소 공간이라고 한다.
예를 들어, 한 프로그램이 실행되며 논리 메모리로 100KB 가 요구되었다고 하자. 하지만 실행까지에 필요한 메모리 공간(Heap영역, Stack 영역, 코드, 데이터)의 합이 40KB 라면, 실제 물리 메모리에는 40KB 만 올라가 있고, 나머지 60KB 만큼은 필요시에 물리메모리에 요구한다고 이해할 수 있겠다.
프레임(Frame) : 물리 메모리를 일정한 크기로 나눈 블록이다.
페이지(Page) : 가상 메모리를 일정한 크기로 나눈 블록이다.
가상 메모리의 내용을 물리 메모리에 로드하는 과정을 생각해보자. 로드할 때 무작위로 위치 및 크기를 설정하여 로드하면 메모리 공간에 빈공간이 발생하게 된다. 이를 최소화하기 위해 프레임과 페이지를 도입하였으며, 프레임과 페이지의 크기는 보통 같으며, 페이지는 프로세스의 구성요소라고 볼 수 있다.
운영체제의 스와퍼(Swapper)는 물리 메모리에 동작하고 있는 모든 프로세스를 로드하지 않는다. 게다가 운영체제의 페이저(Pager)는 프로세스의 모든 페이지를 물리메모리에 로드하지 않는다.(물리 메모리를 효율적으로 사용하기 위해서이다.) 그러므로 프로그램의 페이지가 물리 메모리에 부재할 수 있는데, 이것을 페이지 폴트(Page Fault)라고 한다.
페이지 폴트가 발생하면, 해당 페이지를 가상 메모리에서 찾아야한다. 이 때 운영체제가 페이지 폴트를 해결하는 과정을 요구 페이징(Demand Paging)이라고 한다.
가상 메모리 관리 방법으로, 프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전략을 요구 페이징이라고 한다.
가상 메모리 시스템에서 많이 사용되며, 프로세스 실행에 실제 필요한 페이지들만 메모리로 읽어옴으로써, 사용되지 않을 페이지를 가져오는 시간과 메모리 낭비를 줄일 수 있다.
요구 페이징 에서 언급된대로 프로그램 실행시에 모든 항목이 물리 메모리에 올라오지 않기 때문에, 프로세스의 동작에 필요한 페이지를 요청하는 과정에서 page fault(페이지 부재)가 발생하게 되면, 원하는 페이지를 보조저장장치에서 가져오게 된다. 하지만, 만약 물리 메모리가 모두 사용중인 상황이라면, 페이지 교체가 이뤄져야 한다.(또는, 운영체제가 프로세스를 강제 종료하는 방법이 있다.)
FIFO 페이지 교체
가장 간단한 페이지 교체 알고리즘으로 FIFO(first-in first-out)의 흐름을 가진다. 즉, 먼저 물리 메모리에 들어온 페이지 순서대로 페이지 교체 시점에 먼저 나가게 된다는 것이다.
최적 페이지 교체(Optimal Page Replacement)
앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체하는 것이다.모든 알고리즘보다 낮은 페이지 부재율을 보이며 Belady의 모순이 발생하지 않는다.
LRU 페이지 교체 (Least-Recently-Used Page Replacement)
최적 알고리즘의 근사 알고리즘으로, 가장 오랫동안 사용되지 않은 페이지를 선택하여 교체한다. 대체적으로 FIFO 알고리즘보다 우수하고, OPT알고리즘보다는 그렇지 못한 모습을 보인다.
LFU 페이지 교체(Least Frequently Used Page Replacement)
참조 횟수가 가장 적은 페이지를 교체하는 방법이다. 활발하게 사용되는 페이지는 참조 횟수가 많아질 거라는 가정에서 만들어진 알고리즘이다.
어떤 프로세스가 특정 페이지를 집중적으로 사용하다, 다른 기능을 사용하게되면 더 이상 사용하지 않아도 계속 메모리에 머물게 되어 초기 가정에 어긋나는 시점이 발생할 수 있다. 최적(OPT) 페이지 교체를 제대로 근사하지 못하기 때문에, 잘 쓰이지 않는다.
캐시 메모리는 속도가 빠른 장치와 느린 장치간의 속도차에 따른 병목 현상을 줄이기 위한 범용 메모리이다. 이러한 역할을 수행하기 위해서는 CPU 가 어떤 데이터를 원할 것인가를 어느 정도 예측할 수 있어야 한다. 캐시의 성능은 작은 용량의 캐시 메모리에 CPU 가 이후에 참조할, 쓸모 있는 정보가 어느 정도 들어있느냐에 따라 좌우되기 때문이다.
이 때 적중율(Hit rate)을 극대화 시키기 위해 데이터 지역성(Locality)의 원리를 사용한다. 지역성의 전제조건으로 프로그램은 모든 코드나 데이터를 균등하게 Access 하지 않는다는 특성을 기본으로 한다. 즉, Locality란 기억 장치 내의 정보를 균일하게 Access 하는 것이 아닌 어느 한 순간에 특정 부분을 집중적으로 참조하는 특성인 것이다.
이 데이터 지역성은 대표적으로 시간 지역성(Temporal Locality)과 공간 지역성(Spatial Locality)으로 나뉜다.
http://itnovice1.blogspot.com/2019/08/blog-post_78.html
https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC_%EB%B3%B4%ED%98%B8
https://jihooyim1.gitbooks.io/iknowosbasic/content/contents/03.html
https://www.youtube.com/watch?v=VchHn4XKFXc&list=PLRx0vPvlEmdCpDmUS-azJTey03BE76eI_&index=7
https://preamtree.tistory.com/21