메모리 관리 개념
- 어떤 프로그램이든 프로세스가 되어 프로세서에 적재되기 위해서는 메모리에 적재되어야 실행이 가능
- 따라서 메모리는 중요한 작업공간임
- 한정된 메모리를 다중 프로그래밍 환경에서 이용하기 위해서는 여러 프로세스가 함께 메모리를 사용하므로 효율적인 관리를 해야 함
메모리 관리 정책
- 적재 정책 (Fetch Policy): 디스크에서 메모리로 프로세스를 언제 가져와야 할지를 정하는 것
- 배치 정책 (Placement Policy): 디스크에서 메모리 가져온 프로세스를 어느 위치에 저장할 것인지 정하는 것
- 대치 정책 (Replacement Policy): 메모리가 충분하지 않을 때 현재 메모리에 적재된 프로세스 중 제거할 프로세스를 결정하는 방법
논리적 주소, 물리적 주소 - 메모리 매핑
- 논리적 주소: 가상 주소라고도 하며, 목적 코드가 저장된 공간과 프로그램에서 사용하는 배열, 구조체 등이 해당
- 물리적 주소: 논리적 주소에 대응되는 실제 주소, 메모리 칩이나 디스크 공간에서 만듦
- 논리적 주소와 물리적 주소 변환은 MMU (메모리 관리 장치, Memory Management Unit) 에서 관리
- MMU는 CPU에서 논리적 주소를 받아 고정 분할, 동적 분할, 페이징, 세그멘테이션 등을 이용한 변환 방법 사용하여 물리적 주소로 변환 시킴
바인딩
- 값들이 확정이 되어 구속 (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
참고
'Backend Loadmap > Operating System' 카테고리의 다른 글
[백엔드로드맵][OS] 입출력 (I/O) 관리 (1) | 2023.05.12 |
---|---|
[백엔드로드맵][OS] 프로세스 간 통신 (IPC)란? (1) | 2023.05.09 |
[백엔드로드맵][OS] 기본적인 터미널 명령어 (0) | 2023.04.07 |
[백엔드로드맵][OS] 스레드와 동시성 (0) | 2023.04.06 |
[백엔드로드맵][OS] 프로세스 관리 (0) | 2023.04.02 |