서버에서 살아남기

메모리 구조 본문

운영체제

메모리 구조

개발롬 2023. 7. 31. 22:15

메모리 구조

  • 컴퓨터의 메모리 구조는 크게 코드, 데이터, 스택, 힙 영역으로 나뉘며 각 영역의 특성은 다음과 같습니다.

코드 영역

  • 실행할 프로그램 코드가 저장되는 영역으로 CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리합니다. 함수, 제어문, 선언문 등의 코드가 저장됩니다. 컴파일 언어의 경우, 개발자가 작성한 원시 코드(프로그래밍 언어로 작성한 코드)를 기계어로 번역한 결과가 저장되는 영역입니다. python과 같은 인터프리터 언어의 경우는 개발자가 작성한 원시 코드가 먼저 바이트 코드로 컴파일 되고, 이 바이트 코드가 저장되는 영역입니다. 바이트 코드는 python 인터프리터가 이해하고 실행할 수 있는 중간 단계의 코드로 원시 코드를 CPU가 직접 해석하고 실행하는 기계어 코드로 변환하는 단계를 생략하고 python 가상 머신 위에서 직접 실행됩니다.

데이터 영역

  • 프로그램의 전역 변수와 정적 변수가 저장되는 영역이며, 프로그램의 어디서든 접근이 가능하기 때문에 프로그램이 실행되는 동안은 게속해서 메모리에 유지됩니다.그래서 더 이상 변하지 않을 초기값이나 상수 등을 저장하는데 사용합니다.

스택 영역

  • 함수의 호출과 관련된 정보를 저장하는 영역으로 함수가 호출되면 스택 영역에 매개변수, 지역변수, 반환주소, 이전의 프레임 포인터 등의 정보가 차례로 저장(push)됩니다. 함수 호출이 완료되면 그 함수의 스택 프레임은 스택에서 제거(pop)됩니다. 후입선출의 원칙에 따라 관리됩니다.

힙 영역

  • 프로그래머가 직접 제어할 수 있는 메모리 영역으로 동적 메모리 할당을 위한 공간입니다. 실행 중에 사용자의 요청에 의해 메모리를 할당하거나 해제하는 영역입니다. python과 같은 고수준 언어에서는 개발자가 직접 메모리를 관리할 필요가 거의 없습니다. 가비지 컬렉션과 같은 메모리 관리 기능을 내장하고 있기 때문입니다.
❗️ python 에서 힙 영역을 관리하기 위핸 주요 메커니즘 두가지✌🏻

1. 참조 카운팅
- 각 객체는 참조수를 세는 카운터를 갖습니다. 이는 다른 객체가 해당 객체를 얼마나 많이 참조하고 있는지를 나태냅니다. 

a = [1, 2, 3]  # 리스트 [1, 2, 3]의 참조 카운트가 1 증가
b = a  # 리스트 [1, 2, 3]의 참조 카운트가 1 증가
del a  # 리스트 [1, 2, 3]의 참조 카운트가 1 감소
del b  # 리스트 [1, 2, 3]의 참조 카운트가 1 감소. 참조 카운트가 0이 되므로 메모리에서 해제됨


2. 가비지 컬렌션
- 참조 카운팅만으로는 모든 종류의 메모리 누수를 처리하지 못합니다. 
예를 들어, 서로를 참조하는 두 객체가 다른 곳에서는 더이상 참조되지 않는 경우 이들은 더 이상 필요하지 않은 객체임에도
참조 카운트가 0이 되지 않아 메모리에서 해제되지 않습니다.
이런 부분을 가비지 컬렉션이 감지하여 메모리를 회수 합니다.

'운영체제' 카테고리의 다른 글

스레드 풀  (0) 2023.07.23
CPU 스케쥴링  (0) 2022.07.10