질문 출처: https://github.com/jjuyeon/Tech-Interview-Study/tree/main/operatingSystem
가상 메모리
개념
가상 메모리는 메모리 관리 기법의 하나로, 기계에 실제로 이용 가능한 기억 자원을 이상적으로 추상화하여 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말한다. 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식이다. 쉽게 말해서 ssd나 하드를 램처럼 사용하는 기술이다.
프로그램이 실행되기 위해서는 보조기억장치(HDD, SSD 등)에 저장되어 있는 프로그램의 데이터들을 주기억장치(RAM)로 가져와야 한다. 하지만 다음과 같은 두 가지 상황에서는 모든 데이터들이 주기억 장치로 이동할 수 없다.
1. 프로그램 전체의 크기가 주기억장치보다 큰 경우.
- 주기억장치의 크기는 10인데 프로그램 실행에 필요한 데이터의 크기가 20이면 옮길 수 없다.
2. 여러 개 프로그램을 실행할 경우 그 프로그램들 크기가 주기억장치보다 큰 경우.
- 주기억장치의 공간은 크기 5짜리 두 개인데 실행된 프로그램이 크기 5에 세 개일 경우 옮길 수 없다.
이러한 문제를 해결할 수 있는 방법이 가상 메모리이다. 아무리 여러 프로그램을 실행시키고 있더라도 한 순간에 실행되는 프로그램은 하나이다. 또한 그 하나에서도 일부 데이터만 필요하기 때문에, 당장 실행에 필요한 부분만 주기억장치에 넣고 나머지 부분은 보조기억장치에 넣어둔다. 이것이 가상 메모리의 개념이다. 결국 가상 메모리를 사용하면 사용자 입장에서는 실제 주기억장치보다 큰 주기억장치를 가지고 있는 것처럼 느끼게 된다.
예를 들어, A 프로그램과 B 프로그램을 실행하고 있을 때 컴퓨터는 각 프로그램을 일정한 크기로 나누어서 관리한다.
프로그램 전체 크기가 크더라도 지금 당장 필요한 부분만 주기억장치에 넣어(A1을 넣음) 실행한 뒤 나머지는 보조기억장치에 둔다. 필요한 부분이 바뀌면 그 부분만 다시 주기억장치로 불러들이는 것이다.
게임을 하거나 프로그램을 실행시키면 '로딩중'이라고 뜨는 것을 볼 수 있다. 또는 그런 메세지가 뜨지 않더라도 실행 명령을 내린 이후 실제로 프로그램이 열리기까지 약간의 시간이 소요되는데, 이 때가 바로 보조기억장치에 있던 데이터들을 나누고, 선별해서 필요한 데이터만 주기억장치로 불러들이는 시간이라고 할 수 있다.
가상 주소, 논리 주소
가상적으로 주어진 주소를 가상 주소 또는 논리 주소라고 하며, 실제 메모리 상에서 유효한 주소를 물리 주소 또는 실주소라고 한다. 가상 주소의 범위를 가상 주소 공간, 물리 주소의 범위를 물리 주소 공간이라고 한다.
가상 주소 공간은 메모리 관리 장치에 의해서 물리 주소로 변환된다. 이 덕분에 프로그래머는 가상 주소 공간상에서 프로그램을 짜게 되어 프로그램이나 데이터가 주메모리상에 어떻게 존재하는지를 의식할 필요가 없어진다. 대부분의 현대적 아키텍처와 운영 체제는 가상 메모리 기능을 제공하며, 각 응용 프로그램에 더 적합한 메모리 관리를 위해 어도비 포토샵과 같은 일부 응용 프로그램은 스스로 가상 메모리를 관리하기도 한다.
필요한 이유
좀 더 많은 주소 공간의 표현을 위해 사용한다. 실행 중인 프로세스들에 대한 물리 메모리의 사용 효율을 극대화 시킴
단점
ssd나 하드를 가상 메모리로 사용하면 저장장치 수명이 짧아진다. 또한 ssd와 하드 자체가 램에 비해 읽고 쓰는 속도가 느린 편이다.
페이징
가상 메모리를 구현하는 한 방법으로, 가상 메모리 공간을 일정한 크기의 페이지로 나누어 관리하는 방법이다. 이 때 실제 주기억장치의 페이지에 해당하는 부분을 페이지 프레임이라고 한다.
외부 단편화 문제를 해결하기 위해 나온 개념인데, 이는 크게 물리 메모리와 논리 메모리로 구분이 된다. 물리 메모리는 frame이라는 고정 크기로 분리되어있고 논리 메모리는 프로세스가 점유하는 메모리로 페이지라는 고정된 크기의 블록으로 분리된다. 이는 페이지 교체 알고리즘으로 교체가 된다.
세그멘테이션
페이징에서처럼 메모리를 같은 크기로 나누는 것이 아닌 서로 다른 크기의 논리적 단위인 세그먼트로 분할한다.
메모리 관리 전략
메모리 관리가 필요한 이유
프로세스는 PCB와 Stack, Data, Code, Heap 등 다양한 정보들을 보유 중인 독립적인 메모리 공간이 있다. 이 공간은 OS나 타 프로세스도 접근할 수 없다. 하지만 OS가 사용하는 메모리 영역은 다른 프로세스가 접근할 수 있다.
메모리를 잘 관리하지 못하면 한정된 자원을 비효율적으로 사용해 성능이 저하될 수 있다.
Contiguous Allocation (연속 메모리 할당)
연속 메모리 할당은 기본적으로 메모리의 연속된 부분이 프로세스나 파일에 할당되는 방법이다. 이 때문에 사용 가능한 모든 메모리 공간은 같은 장소에 함께 존재하며, 이는 사용되지 않은 메모리 파티션이 전체 메모리 공간에 걸쳐 무작위로 분포되지 않는다는 것을 의미한다.
메인 메모리는 운영체제용과 사용자 프로그램용 두 가지 주요 부분의 조합이다. 메모리 파티션을 고정된 크기의 파티션으로 분할하여 연속적인 메모리 할당을 구현할 수 있다.
Noncontiguous Allocation (비연속 메모리 할당)
비연속 메모리 할당은 기본적으로 연속 할당 방법과 반대되는 방법이며, 다른 위치에 존재하는 비연속적인 메모리 공간을 프로세스에 할당한다. 사용 가능한 메모리 공간도 여기저기 흩어져 있다. 이 메모리 할당 기술은 메모리의 낭비를 줄이는 데 도움이 되지만 내부 및 외부 단편화를 야기한다.
내부 단편화
할당한 영역 중 사용되지 않은 공간으로 인해 공간이 낭비되는 것. 예를 들어, 프로세스에게 1GB의 메모리를 할당해 주었는데 실제로 프로세스가 사용하는 메모리는 120MB 뿐이라 나머지 880MB가 낭비되는 상황을 말한다.
외부 단편화
메모리의 여유 공간의 간격이 띄엄띄엄 존재해서 실제로 사용할 수 없는 경우를 의미한다. 예를 들어, 메모리에 1GB의 공간이 남아서 100MB의 프로세스를 올리려고 했는데, 알고보니 메모리에 50MB 크기의 공간이 20개 있어서 올릴 수 없는 상황을 말한다. 동적 메모리 할당 해제를 자주하면 나타나는 문제점이다.
차이점
Contiguous Memory Allocation | Non-Contiguous Memory Allocation | |
1 | 파일/프로세스에 연속적인 메모리 블록을 할당 | 파일/프로세스에 별도의 메모리 블록을 할당 |
2 | 실행 속도가 빠르다 | 실행 속도가 느리다 |
3 | OS가 제어하기 쉽다 | OS가 제어하기 어렵다 |
4 | 프로세스를 실행하는 동안 주소 변환이 많지 않으므로 오버헤드가 최소화된다 | 주소 변환이 자주 일어나므로 오버헤드가 커진다 |
5 | 내부 단편화, 외부 단편화 모두 발생한다 | 외부 단편화만 발생 |
6 | 단일 파티션 할당 및 다중 파티션 할당이 포함된다 | 페이징 및 세분화(segmentation)가 포함된다 |
7 | 메모리 낭비가 있다 | 메모리 낭비가 없다 |
8 | 스왑 인 프로세스(swap-in processes)는 원래 할당된 공간에 배열된다 | 스왑 인 프로세스는 메모리의 모든 위치에 배열될 수 있다 |
9 | 정적 파티션, 동적 파티션 두 가지가 있다. | 다섯 가지 종류가 있다. 1. paging 2. multilevel paging 3. inverted paging 4. segmentation 5. segmentated paging |
https://www.geeksforgeeks.org/difference-between-contiguous-and-noncontiguous-memory-allocation/