Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

프로세스 주소공간 #3

Closed
Brandnew-one opened this issue Mar 27, 2022 · 1 comment
Closed

프로세스 주소공간 #3

Brandnew-one opened this issue Mar 27, 2022 · 1 comment

Comments

@Brandnew-one
Copy link
Owner

프로세스는 운영체제로 부터 자원을 할당받는 작업의 단위이고
운영체제로 부터 할당받은 자원은 독립된 Heap, Data, Stack, Code 로 구성되어 있다고 학습했습니다.

오늘은 프로세스 메모리 영역에 대해서 좀 더 자세히 알아보겠습니다.

스크린샷 2022-03-27 오후 7 51 40

Code(TEXT)

  • 우리가 작성한 소스코드가 들어가는 부분으로 실행할 프로그램의 코드가 저장되는 영역
  • 함수, 제어문, 상수등이 여기에 지정된다
  • 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없도록 Read-Only

Data

  • 프로그램의 전역변수와 정적변수가 저장되는 영역 -> 프로그램이 실행되는 동안 항상 접근 가능한 변수가 저장
  • 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다
  • 실행중에도 전역변수가 변경될 수 있으니 Read-Write
  • 초기화된 데이터는 Data 영역에 저장되고, 초기화 되지않은 데이터는 BSS 영역에 저장된다.

Stack

  • 함수의 호출관 관계되는 지역변수와 매개변수가 저장되는 영역
  • Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 종료되면 소멸한다
  • Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다. (인스터스 생성시 주소값이 Stack에 저장된다)
  • 메모리의 높은 주소에서 낮은 주소 방향으로 할당된다.
  • 컴파일 타임에 크기가 결정되기 때문에 무한히 할당할 수 없다 -> Stack Overflow

Heap

  • 런타임에 크기가 결정되는 메모리 영역이다.
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다
  • 참조형의 데이터의 값이 저장된다. (인스턴스의 실제 데이터가 저장되는 공간)
  • Heap은 메모리의 낮은주소 부터 높은 주소 방향으로 할당된다.

HEAP, STACK 영역은 같은 공간을 공유하고 있다.

따라서 어느 한쪽의 영역이 상대공간을 침범하는 일이 생길 수 있고 이를 Heap Overflow, Stack Overflow 라고 한다.

기존의 지식과 조금 엮어서 풀어보겠습니다.

1 ) 코딩테스트 문제를 풀 때, 겪던 메모리 초과

보통 백준에서 알고리즘 문제를 풀 다 보면 심심찮게 메모리 초과를 경험할 수 있습니다. 물론 실제로 문제에서 요구하는 메모리 보다 더 많은 메모리를 사용하는 경우일 수도 있지만 대부분 지역변수로 할당된 메모리를 전역변수로 수정하면 위와 같은 문제를 피할 수 있었습니다.
이는 보통 OS에서 성능상의 이유로 Stack 영역에 메모리 제한을 걸어두기 때문입니다. (윈도우: 1MB, 리눅스: 8MB)
따라서 전역변수로 선언한 데이터들은 Data 영역에 저장되기 때문에 위와 같은 문제를 피할 수 있었습니다.

2) ARC

Swift에서는 클래스를 통해서 인스턴스를 생성할 경우

  • 실제 인스턴스 메모리는 Heap 영역
  • 메모리를 가리키는 주소값은 Stack 영역

에 저장되고 RC가 0이되는 순간에 자동으로 Heap 영역의 메모리를 해제하는 ARC 라는 기능이 있습니다.

C언어의 경우, Heap 영역 메모리를 사용하기 위해서는 Calloc, Malloc과 같은 함수를 통해서 사용자가 지정한 크기 만큼을 Heap 영역에 할당하고 Stack 영역에는 마찬가지로 주소값만을 가지고 있게 됩니다.
하지만 C에서는 메모리 누수를 피하기 위해서는 Swift와 달리 Heap영역 메모리 해제를 위해서 free 해주는 과정이 필요합니다.

@Brandnew-one
Copy link
Owner Author

프로세스 구역을 나눈 이유?

최대한 데이터 공유를 활용해서 메모리의 사용량을 줄이기 위해서

예를들면, 코드는 같은 프로그램내에서는 모두 같은 내용이기 때문에 하나로 관리해서 공유할 수 있음

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant