profile image

L o a d i n g . . .

메모리 관리 개념

- 어떤 프로그램이든 프로세스가 되어 프로세서에 적재되기 위해서는 메모리에 적재되어야 실행이 가능

- 따라서 메모리는 중요한 작업공간임

- 한정된 메모리를 다중 프로그래밍 환경에서 이용하기 위해서는 여러 프로세스가 함께 메모리를 사용하므로 효율적인 관리를 해야 함


메모리 관리 정책

- 적재 정책 (Fetch Policy): 디스크에서 메모리로 프로세스를 언제 가져와야 할지를 정하는 것

- 배치 정책 (Placement Policy): 디스크에서 메모리 가져온 프로세스를 어느 위치에 저장할 것인지 정하는 것

- 대치 정책 (Replacement Policy): 메모리가 충분하지 않을 때 현재 메모리에 적재된 프로세스 중 제거할 프로세스를 결정하는 방법


논리적 주소, 물리적 주소 - 메모리 매핑

- 논리적 주소: 가상 주소라고도 하며, 목적 코드가 저장된 공간과 프로그램에서 사용하는 배열, 구조체 등이 해당

- 물리적 주소: 논리적 주소에 대응되는 실제 주소, 메모리 칩이나 디스크 공간에서 만듦

- 논리적 주소와 물리적 주소 변환은 MMU (메모리 관리 장치, Memory Management Unit) 에서 관리

- MMU는 CPU에서 논리적 주소를 받아 고정 분할, 동적 분할, 페이징, 세그멘테이션 등을 이용한 변환 방법 사용하여 물리적 주소로 변환 시킴

MMU, https://velog.io/@vpdls1511/%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%99%80-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4


바인딩

- 값들이 확정이 되어 구속 (Bind) 된 상태

- 함수 호출된 부분에서 함수가 위치한 메모리 번지를 연결


바인딩 타임

- 프로그램에서 변수들이 갖는 속성이나 값이 완전히 결정되는 시간

- 이름에 속성이 연결되는 시간


바인딩 타임의 종류

1. 컴파일 시간 (Compile Time)

  • 프로세스가 메모리에 적재될 위치를 컴파일 과정에서 알 수 있다면 이때 바로 물리적 주소 생성 가능
  • 물리적 메모리 주소 (Physical Address)가 컴파일 시 알려짐
  • 시작 위치 변경 시 다시 컴파일
  • 컴파일러는 절대 코드 (absolute code) 생성

2. 적재 시간 (Load Time)

  • 프로세스를 어디에 적재해야할지 컴파일 과정에서 알려주지 않으면 컴파일러는 대체 가능한 상대 주소를 생성
  • 로더의 책임하에 물리적 메모리 주소 부여
  • 컴파일러가 재배치 가능 코드 (relocatable code)를 생성한 경우 가능

3. 실행 시간 (Run Time)

  • 한 프로세스가 동일한 장소에서 작동한다면 적재 시간 과정에서 바인딩 할 수 있지만, 프로세스를 실행하는 도중에 메모리의 한 세그먼트에서 다른 세그먼트로 이동한다면 바인딩은 수행 시간까지 지연 됨
  • 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음
  • CPU가 주소를 참조할 때마다 바인딩을 점검
  • 하드웨어적인 지원이 필요

정적 바인딩, 동적 바인딩

- 정적 바인딩 (Static Binding): 실행 시간 전에 일어나고, 실행 중에 변하지 않는 상태로 유지된느 바인딩

// int num, 정수 타입을 이름 num에 정적으로 바인딩 함

- 동적 바인딩 (Dynamic Binding): 실행 시간 중에 일어나거나 프로그램 실행 과정에서 변경되는 것

// int* ptr = malloc(sizeof(int) * 10);

 


링커와 로더

- 링커 (Linker): 모든 오브젝트 파일들을 하나의 오브젝트 파일로 합침 (실행 파일, 즉 Executable file로 함침)

- 로더 (Loader): 실행 파일을 읽음, 메인 메모리에 오브젝트 파일에 있는 내용들을 올리고, context 들을 만들고, 프로그램을 수행시킬 수 있도록 만듦, OS의 한 부분임


할당

- 기억 장소 할당: 변수에 메모리 공간을 바인딩 하는 과정

- 정적 할당: 메모리에 적재될 크기를 미리 아는 것 (배열 등), 실행 시간에 각 타입에 맞는 메모리 영역에 할당

- 동적 할당: 외부 환경에 의해 변화하여 크기를 미리 알 수 없는 것 (malloc 등), 명시적인 명령어에 의해 실행되는 할당, 동적 할당의 공간은 힙 영역, 포인터나 참조 변수를 통해 접근 가능


연속 메모리 할당

- 프로세스를 메모리에 연속적으로 할당하는 방법, 이 방식은 외부 단편화를 발생 시킬 수 있기에 세 가지 기법을 통해 극복 함

// 외부 단편화: 남아있는 총 메모리 공간이 요청한 메모리 공간보다 크지만, 남아있는 공간이 연속적이지 않아 발생하는 현상

- First Fit: 가장 처음 만나는 메모리 빈 공간에 할당하는 것

- Best Fit: 빈 메모리 공간의 크기와 프로세스의 크기 차이가 가장 적은 곳에 할당

- Worst Fit: 빈 메모리 공간의 크기와 프로세스의 크기 차이가 가장 큰 곳에 프로세스를 할당


페이징 (Paging)

- 하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없애는 메모리 관리 방법

- 물리 메모리는 Frame 이라는 고정 크기로 분리

- 논리 메모리는 Page라 불리는 고정 크기의 블록으로 분리

- 페이징 기법을 사용함으로써 논리 메모리는 물리 메모리에 저장 될 때, 연속되어 저장될 필요가 없고, 물리 메모리의 남는 프레임에 적절히 배치됨으로 외부 단편화 해결 가능한 장점 보유

- 하지만 내부 단편화 문제의 비중이 늘어난다는 단점 존재

// 내부 단편화: 주기억장치 내 사용자 영역이 실행 프로그램보다 커서 프로그램의 사용 공간을 할당 후 사용되지 않고 남게 되는 현상


세그먼테이션 (Segmentation)

- 논리 메모리와 물리 메모리를 같은 크기의 블록이 아닌, 서로 다른 크기의 논리적 단위인 세그먼트로 분할

- 사용자가 두 개의 주소로 지정 (세그먼트 번호, 변위)

- 세그먼트 테이블에는 각 세그먼트의 기준 (세그먼트의 시작 물리 주소)과 한계 (세그먼트의 길이)를 저장

- 서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되어서 외부 단편화 문제 있을 수 있음


메모리 풀 (Memory Pool)

- 필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당 받아 놓고 필요할 때마다 사용하고 반납하는 기법

- 메모리의 할당, 해제가 잦는 경우에 효과적

- 미리 할당을 해두었기 때문에 메모리 누수가 발생할 수 있다는 문제점 보유

- 미리 공간을 할당해두고 가져다쓰고 반납하기 때문에 외부 단편화, 내부 단편화 발생 X


참고

1. https://www.crocus.co.kr/1376

2. https://velog.io/@sierra9707/%EB%B0%B1%EC%97%94%EB%93%9C-%EB%A1%9C%EB%93%9C%EB%A7%B5-OS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC

3. https://velog.io/@vpdls1511/%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%99%80-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4

4. https://blog.naver.com/eludien/221462352935

복사했습니다!