메모리(Memory)란?
컴퓨터에서 정보를 처리하기 위해 일시적으로 정보를 보관하는 기억장치이다. 좁은 의미로 메모리는 주기억장치인 램(RAM)을 의미하지만, 넓은 의미로는 보조기억장치인 롬(ROM)을 포함하기도 한다. 주기억장치인 램(RAM)의 용량이 부족한 경우를 대비하여 하드디스크의 일부분을 가상 메모리로 사용할 수 있다.
메모리 관리 전략
메모리 용량이 증가함에 따라 프로그램의 크기 또한 계속 증가하고 있기 때문에 메모리는 언제나 부족하므로 제한된 물리 메모리의 효율적인 사용과 메모리 참조 방식을 제공하기 위한 전략
메모리 낭비 방지 기법
1. 동적 적재(Dynamic Loading)
프로세스가 시작될 때 그 프로세스의 주소 공간 전체를 메모리에 올려놓는 것이 아니라 메모리를 효율적으로 사용하기 위해 필요한 루틴이 호출되면 해당 루틴을 메모리에 적재하는 방식이다. 루틴이 필요한 경우에만 적재하기 때문에 효율적이고 발생빈도는 적어도 많은 양의 코드를 필요로 하는 경우에 유용하다.
2. 동적 연결(Dynamic Linking)
실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지고 있다가 런타임에 실행 파일과 라이브러리가 메모리에 위치될 때 해당 모듈의 주소로 가서 필요한 것을 들고오는 방식이다. 여러 프로그램에 공통 사용되는 라이브러리를 관리하는 방법으로 라이브러리 루틴 연결을 실행까지 미루고 오직 하나의 라이브러리 루틴만 메모리에 적재해서 연결하여 사용하면 낭비되는 메모리를 줄여 효율을 높일 수 있다.
3. 스와핑(Swapping)
주기억장치에 적재한 하나의 프로세스와 보조기억장치에 적재한 다른 프로세스의 메모리를 교체하는 기법이다. CPU에서 실행중이지 않는 프로세스는 부하조절을 위해 프로세스의 일부를 디스크로 내보내 메모리를 확보한다. 문맥 교환으로 인한 오버헤드가 발생할 수 있고 속도가 느려지지만, 메모리 공간 확보에는 효율적이다.
단편화(Fragmentation)
메모리 공간을 비 효율적으로 사용되어 낭비되는 현상으로 프로세스들이 메모리에 적재되고 제거되는 일이 반복되어 메모리 틈 사이에 사용하지 못할 만큼의 작은 공간들이 늘어나는 것을 말한다. 총 메모리 공간은 충분하지만 실제 사용은 불가능하며, 실제 사용 가능한 메모리 공간이 줄어들어 시스템 성능 저하를 일으킬 수 있다.
1. 외부 단편화(External Fragmentation)
메모리 여유 공간이 충분해도 이러한 여유 공간들이 조각으로 흩어져 있어(Scattered Holes) 메모리에 프로세스를 적재하지 못해 메모리가 낭비되는 현상
2. 내부 단편화(Internal Fragmentation)
프로세스가 사용하는 메모리 공간에 포함되는 남는 부분으로 프로세스가 실제 사용 메모리 양 보다 더 큰 메모리가 할당되어 메모리가 낭비되는 현상
3. 압축(Compaction)
외부 단편화를 해소하기 위한 방법으로 Scattered Holes를 모으는 방법이다. 합치는 과정에서 메모리에 적재된 프로세스를 정지시키고 한쪽으로 이동시키는 작업이 필요해 비효율적이다.
메모리 관리 전략
1. 연속 메모리 할당(Contiguous Memory Allocation)
연속된 하나의 큰 메모리에서 프로세스를 메모리에 연속적으로 할당하는 기법이다. 프로세스를 RAM에 적재할 때 프로세스가 올라간 시작 주소만 알고 있다면 프로세스가 사용하는 모든 코드나 함수 또는 변수들의 위치를 쉽게 바인딩 가능하다. 할당과 제거를 반복하다보면 Scattered Holes가 생겨나고 이로 인하여 외부 단편화가 발생한다.
연속 메모리 할당에서 외부 단편화를 줄이기 위한 할당 방식
(1) 최초 적합(first-fit) : 요청한 크기를 만족하는 첫 번째 빈 메모리 공간에 프로세스를 할당
(2) 최적 적합(best-fit) : 빈 메모리 공간의 크기와 프로세스의 크기 차이가 가장 적은 곳에 프로세스를 할당
(3) 최악 적합(worst-fit) : 빈 메모리 공간의 크기와 프로세스의 크기 차이가 가장 큰 곳에 프로세스를 할당
2. 페이징(Paging)
메모리 공간이 연속적으로 할당되어야 한다는 제약 조건을 없애는 메모리 관리 전략이다. 한 프로세스의 논리 주소 공간을 여러 개로 분할하여 비연속적인 물리 메모리 공간에 할당하여 외부 단편화 해결이 가능하지만 내부 단편화 발생한다.
3. 세그멘테이션(Segmentation)
페이징 기법과 반대로 논리 메모리와 물리 메모리를 같은 크기의 블록이 아닌, 서로 다른 크기의 논리적인 단위인 세그먼트로 분할한다. 내부 단편화 해결이 가능하지만 외부 단편화 발생한다.
4. 세그멘테이션 페이징 혼용 기법
페이징과 세그멘테이션을 혼용해 이러한 단편화를 최대한으로 줄이는 전략이다. 프로세스를 세그먼트(논리적 기능 단위)로 나눈 다음 세그먼트를 다시 페이지 단위로 나누어 관리한다. 매핑 테이블을 두 번 거쳐 속도가 느려진다.
5. 메모리 풀(Memory Pool)
필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당받고 필요하면 사용, 반납하는 기법이다. 메모리 할당, 해제가 잦은 경우에 효과적이며 메모리 풀을 만들었지만 쓰지 않을 때도 계속 할당된 상태로 메모리 누수가 발생한다.
참고링크
'IT > etc.' 카테고리의 다른 글
[GitHub] Repository Naming Convention (0) | 2024.02.06 |
---|---|
프로세스간 통신(IPC) (0) | 2023.02.21 |
기본적인 터미널 명령어 (0) | 2023.02.09 |
스레드(Thread)? (0) | 2023.02.08 |
프로세스란? (0) | 2023.02.08 |