C Language

CPU 메모리에 대해 학습하기

567Rabbit 2024. 5. 31. 14:42

(형식) 변수 = 데이터
=을 기준으로 왼쪽은 변수, 오른쪽은 데이터라고 한다.

count = 3

 

  • 코드 (Code) 영역:
    • 프로그램의 "요리책"이라고 생각할 수 있다.
    • 요리책에는 요리 방법(명령어)들이 적혀 있어서, 요리사가 이를 보고 요리를 만든다.
    • 프로그램이 실행될 때, CPU가 이 요리책을 보고 무엇을 해야 할지 알아낸다.
    • 프로그램의 실행 코드가 저장되는 영역이다.
    • 주로 읽기 전용이며, 프로그램이 실행되면서 CPU가 명령어를 가져와 실행한다.
    • 컴파일된 기계어 코드가 위치하며, 함수와 메소드 등이 포함된다.
    • 보통 텍스트 세그먼트라고도 한다.

 

  • 데이터 (Data) 영역:
    • 주방의 "저장 공간"과 같다
    • 모든 재료(전역 변수와 정적 변수)가 저장되어 있다.
    • 프로그램 시작할 때 재료를 꺼내놓고, 프로그램이 끝날 때까지 그대로 두는 공간
    • 초기화된 데이터는 레시피에 따라 이미 준비된 재료(초기화된 변수)이고, 초기화되지 않은 데이터는 아직 꺼내지 않은 재료(초기화되지 않은 변수)이다
    • 전역 변수와 정적 변수가 저장되는 영역이다
    • 프로그램 시작 시 할당되고 프로그램이 종료될 때까지 존재한다
    • 데이터 영역은 다시 초기화된 데이터 세그먼트와 초기화되지 않은 데이터 세그먼트(BSS)로 나뉜다

 

  • 스택 (Stack) 영역:
    • 주방의 "작업대"라고 생각할 수 있다
    • 요리사가 요리할 때 사용하는 도구(지역 변수와 매개변수)들이 여기 놓인다
    • 작업대는 요리할 때 필요할 때마다 도구를 꺼내고, 요리가 끝나면 다시 제자리에 돌려놓는다
    • 도구를 쓸 때마다 쌓아두고(할당), 다 쓰면 치우는(해제) 방식이다
    • 함수 호출과 관련된 지역 변수, 매개변수, 리턴 주소 등을 저장하는 영역이다.
    • LIFO(Last In, First Out) 구조로 관리되며, 함수 호출 시 할당되고 함수 종료 시 해제된다.
    • 자동으로 관리되며, 컴파일러가 함수의 호출과 복귀에 따라 스택을 관리한다
    • 메모리 주소는 높은 주소에서 낮은 주소로 할당된다
    • java의 경우 main 함수가 끝나면 스택 영역(작업 영역)에서 사라지는 것을 예로 들 수 있다.

 

  • 힙 (Heap) 영역:
    • 주방의 "냉장고"라고 할 수 있다
    • 필요한 재료(동적 메모리)를 요리 중간에 꺼내서 쓸 수 있다.
    • 냉장고에서 재료를 꺼낼 때는 우리가 직접 꺼내고, 다 쓰고 나면 다시 냉장고에 넣어야 한다.
    • 프로그래머가 직접 재료를 관리해야 해서, 잘못 관리하면 재료가 상하거나(메모리 누수) 냉장고가 꽉 차서 문제가 생길 수 있다.
    • 동적 메모리 할당을 위해 사용되는 영역이다.
    • 프로그램 실행 중 필요한 시점에 malloc, calloc, realloc 등의 함수를 사용하여 메모리를 할당하고, free 함수를 사용하여 해제한다.
    • 힙 메모리는 프로그래머가 직접 관리해야 하며, 잘못된 관리(예: 메모리 누수, 이중 해제 등)는 프로그램의 안정성에 문제를 일으킬 수 있다.
    • 메모리 주소는 낮은 주소에서 높은 주소로 할당된다.
    • C언어는 직접 개발자가 garbage를 삭제하며, java에서는 garbage collector라는 소프트웨어를 사용해 삭제한다.