메모리
- 특정 형식의 데이터 모음으로 정의할 수 있으며, 명령 및 처리된 데이터를 저장하는 데 사용된다. 프로그램이 실행된다면 프로그램에 접근하는 정보와 함께 프로그램이 메인 메모리 안에 있어야 한다.
메인 메모리
- 메인 메모리는 현대 컴퓨터 작동에 매우 중요하다.
- 메인 메모리는 수십만에서 수십억에 이르는 크기의 큰 단어 혹은 바이트 배열이다. 메인 메모리는 CPU 혹은 I/O 장치가 공유하는 정보의 저장소이다.
- 메인 메모리는 프로세서가 효과적으로 프로그램과 정보를 이용하도록 한다. 메인 메모리는 주로 RAM(Random Access Memory)로 알려져있다.
논리적 주소와 물리적 주소
- 논리적 주소는 CPU에 의해 생성이 된다. 논리적 주소는 가상 주소라고 불리기도 한다. 논리적 주소 공간은 프로세스의 사이즈를 결정하며, 이러한 논리적 주소는 변경될 수가 있다.
- 물리적 주소는 메모리 장치의 실제 주소이다. 물리적 주소는 메모리 관리 장치(MMU)에 의해 계산이 되며, 논리적 주소와 물리적 주소의 1:1 매핑은 메모리 관리 장치에 의해 수행이 되며, 물리적 주소는 항상 일정하게 유지가 된다.
스와핑
- 프로세스가 실행되는 중에는 언제나 메모리에 상주해 있어야 한다. 여러 프로세스를 실행시키기 위해서 프로세스를 임시로 메인 메모리에서 보조 메모리로 옮긴다.
- 스와핑을 통해 더 많은 프로세스를 실행할 수 있고 할당된 메모리에 알맞게 사용할 수 있다.
- 만약 높은 우선 순위의 프로세스가 도착하여 메모리에 적재되길 원한다면, 메모리 매니저가 메인 메모리에 있는 낮은 우선 순위의 프로세스를 꺼내고, 그 자리에 높은 우선 순위의 프로세스를 적재한다. 이후에 높은 우선 순위의 프로세스가 끝난다면, 보조 메모리에 있던 낮은 우선 순위의 프로세스를 가져와 메인 메모리에 적재한다.
연속 메모리 할당
- 메인 메모리는 운영 체제와 사용자의 프로세스를 적재해야한다. 따라서, 메모리의 적절한 할당은 운영 체제에게는 중요하다.
- 메모리는 일반적으로 상주 운영 체제용, 사용자 프로세스용으로 나뉜다. 보통은 사용자의 여러 프로세스들이 메모리에 동시적으로 있어야 한다. 그리하여, 비어있는 메모리에 주 메모리에 들어가기 위해 기다리고 있는 입력 큐의 프로세스들을 어떻게 할당할지 고려해야 한다.
- 각 프로세스는 단일 연속 메모리 조각에 존재한다.
메모리 할당
- 메모리를 할당하는 가장 간단한 방법은 메모리를 고정된 크기 조각으로 나누고 그 조각에 하나의 프로세스가 들어가도로 한다. 이에 따르면 조각 수에 따라 몇 개의 프로그램이 실행 될지 정해진다.
- 다중 파티션 할당 : 이 방법은 입력 큐에서 프로세스를 선택하여 비어있는 파티션에 넣는다.
- 고정 파티션 할당 : 이 방법은 운영체제가 어떤 메모리의 부분이 가능하고, 어떤 부분이 프로세스가 적재되어있는지 테이블을 유지하는 방법이다. 처음에는 모든 메모리를 유저의 프로세스가 적재 가능하도록 한다. 특히, 그 중에 비어있는 메모리 공간을 구멍(Hole)이라고 한다. 프로세스가 도착하여 메모리를 필요로 하면, 운영체제는 이 프로세스가 할당될 수 있는 충분히 큰 구멍을 찾게 된다.
- 이러한 구멍을 찾는 방법은 세 가지가 있다.
- 첫 번째로는 처음으로 프로세스가 할당 가능한 구멍을 찾는 것이다.
- 두 번째로는 프로세스가 딱 알맞게 적재 가능한 구멍을 찾는 것이다.
- 세 번째로는 프로세스가 적재 가능한 아주 가장 큰 구멍을 찾는 것이다. 이 방법은 매우 큰 구멍을 생성하게 된다.(60kb(hole)-25kb(process)=35kb(hole))
메모리 관리
소프트웨어 응용 프로그램이 컴퓨터 메모리에 액세스하는 방식을 제어하고 조정하는 프로세스이다.
소프트웨어는 실행 될 때 컴퓨터의 RAM(메모리)에 접근해야 한다. 접근하게 되면, 소프트웨어의 바이트 코드를 RAM에 로드 시키고, 소프트웨어에서 사용하는 데이터 값과 데이터 구조를 저장한 후에 소프트웨어를 실행을 위한 모든 런타인 시스템을 로드한다.
특히, 바이트 코드를 로드하는 메모리 공간 외에도 스택과 힙 메모리라는 두 가지의 메모리 영역을 사용한다.
스택
- 스택은 정적 메모리 할당에 사용되며 후입선출(LIFO)이다.
- 후입선출의 특성으로 인해 데이터를 저장하고, 데이터를 빼내는 게 매우 빨라서 스택의 내부를 들여다 볼 필요가 없다. 하지만, 이 뜻은 스택에 들어가는 데이터의 양은 유한해야하며, 정적이어야 한다.
- 스택은 함수의 실행 데이터가 스택 프레임으로 저장되는 곳이다. 예를 들면, 함수가 새 변수를 선언할 때마다 스택의 최상위 블록으로 올라가고, 함수가 종료된다면 스택에 올려진 변수들은 삭제된다.
- 멀티 스레드로 이루어진 어플리케이션은 스레드 하나 당 한 개의 스택을 가질 수 있다.
- 스택의 메모리 관리는 매우 간단하며 직관적이며, 이러한 일들은 운영체제(OS)에 의해 이루어진다.
- 스택에 저장되는 전형적인 데이터들은 지역변수(local variable), 포인터, 그리고 함수 프레임이다.
- 힙과 다르게, 스택의 데이터들은 유한해야하기 때문에 스택 오버 플로우 에러가 발생된다.
힙
- 힙은 동적 메모리 할당에 사용된다. 그리고, 스택과는 다르게 프로그램이 포인터를 이용하여 힙의 안쪽 데이터를 살펴봐야 한다.
- 힙은 스택보다 느리다. 그 이유는 데이터를 살피는 과정이 있기 때문이다. 하지만, 힙은 스택보다는 많은 데이터를 저장할 수 있다. 그 뜻은, 힙에서는 동적 사이즈의 데이터가 저장될 수 있다는 것이다.
- 힙은 멀티 스레드로 이루어진 어플리케이션에서는 스택과 다르게 공유된 하나의 힙만 사용한다.
- 힙의 동적인 특성으로 인해 관리하기가 까다로우며, 대부분의 메모리 관리 문제가 힙에서 발생한다.
- 힙에 저장되는 일반적인 데이터는 전역 변수, 오브젝트(객체), 문자열, 맵 및 기타 복잡한 데이터 구조와 같은 참조 우형이다.
- 어플리케이션이 할당된 힙보다 더 많은 메모리를 사용하려 하면 메모리 부족 오류가 발생한다. 일반적으로는 힙에 저장할 수 있는 값의 크기에는 제한은 없지만 어플리케이션에 할당되는 매모리의 상한선이 있다.
메모리 관리가 중요한 이유
- 하드 디스크 드라이브와 달리 RAM은 유한하기 때문이다. 프로그램이 메모리를 지속적으로 이용한다면, 메모리가 부족해지고 충돌이 일어나거나 운영 체제가 충돌할 가능성이 있기 때문이다. 따라서, 프로그램은 RAM을 계속 사용할 수가 없다. 이를 위하여 대부분의 프로그래밍 언어는 자동 메모리 관리를 수행한다. 그리고, 대부분의 메모리 관리에 대해 이야기 한다면 주로 힙 메모리 관리에 대해 이야기하는 것이다.
메모리 관리법 - 수동 메모리 관리
- 언어는 기본적으로 메모리를 관리하지 않는다. 생성한 개체에 메모리를 할당하고 해제하는 것은 개발자의 몫이다. 특히나 C와 C++에서는 malloc, realloc, calloc, free를 이용하여 메모리 관리를 위한 메서드를 제공한다. 이렇게 힙 메모리를 할당 및 해제하고 포인터를 이용하여 메모리를 관리하는 것은 개발자의 몫이다.
메모리 관리법 - 가비지 컬렉션(GC)
- 사용하지 않는 메모리 할당을 해제하여 힙 메모리르르 자동으로 관리한다. GC는 현대 언어의 일반적인 메모리 관리법 중 하나이며, 종종 특정 간격으로 실행되어 일시 중지 시간(pause times)이라는 오버헤드가 발생한다.
References
'조열심 카테고리 > Backend 공부' 카테고리의 다른 글
| Django 특정 비밀번호 에러 안 뜨게 하기 (0) | 2022.12.20 |
|---|---|
| Django kakao allauth 구현 (0) | 2022.12.20 |
| [Django] 자기 관리 웹 애플리케이션 제작 -1- (0) | 2022.08.14 |
| [Backend] 2. Inter Process Communication(IPC) (0) | 2022.07.19 |