2 분 소요

프로세스란?

  • 사전적 의미 : 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
    • 메모리에 올라와 있는 프로그램의 인스턴스(독립적인 개체)
    • 운영체제로부터 시스템을 할당받는 자원의 단위

프로세스의 특징

  • 각각의 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받음
  • 기본적으로 프로세스당 최소 1개의 스레드를 가지고 있다.
  • 각 프로세스는 별도의 주소공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근 X
  • 한 프로세스가 다르 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC)을 사용해야한다.

스레드란?

  • 사전적 의미 : 프로세스 내에서 실행되는 여러 흐름의 단위
    • 프로세스의 특정한 수행 경로
    • 프로세스가 할당받은 자원을 이용하는 실행의 단위

스레드의 특징

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행
  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근 X
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

꼬리질문) 프로세스 주소 공간에 대해서 설명해주세요

https://i.imgur.com/QMkl6vC.png

Stack 영역

  • 함수의 호출과 관계없는 지역변수와 매개변수가 저장되는 영역
  • Stack 영역의 값은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
  • 재귀 함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생

Heap 영역

  • 런타임에 크기가 결정되는 영역
  • 사용자에 의해 공간이 동적으로 할당 및 해제
  • 주로 참조형 데이터 (ex. 클래스) 등의 데이터가 할당
  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당

Data 영역

  • 전역 변수나 Static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역
  • 어떤 프로그램에 전역/static 변수를 참조하는 코드가 존재한다면, 이 프로그램은 컴파일 된 후에 data 영역을 참조
  • 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸

Text 영역

  • 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간으로, 프로그램이 수정되면 안 되므로 ReadOnly 상태로 저장

Stack 영역과 Data 영역을 나누는 이유

  • Stack 영역을 통해 함수의 흐름을 관리하고, Data 영역 (+BSS 영역)을 통해 전역 변수, static 변수를 관리
  • 함수는 결국 스택방식으로 작동하기 때문에, 각 함수의 지역변수를 스택으로 관리하고 어디서나 접근가능해야하는 전역변수는 Data 영역에서 따로 관리
  • 최대한 데이터를 공유하여 메모리 사용량을 줄인다

꼬리 질문: 프로세스의 메모리 구조와 관련하여

질문 2: Stack Overflow가 발생하는 이유와 이를 방지하기 위한 전략은 무엇인가요?

답변 2: Stack Overflow는 주로 재귀 호출이 너무 깊어지거나, 지역 변수가 과도하게 많을 때 발생합니다. 이는 Stack 영역에 할당된 메모리가 제한적이기 때문에, 이 제한을 초과할 경우 발생합니다. 이를 방지하기 위한 전략으로는 재귀 함수의 깊이를 제한하거나, 필요 이상의 지역 변수를 생성하지 않는 것입니다. 또한, 재귀 대신 반복문을 사용하거나, 꼬리 재귀 최적화(Tail Recursion Optimization)와 같은 기술을 활용할 수도 있습니다.

질문 3: 프로세스의 Data 영역과 BSS 영역의 차이점은 무엇인가요?

답변 3: Data 영역은 초기화된 전역 변수와 static 변수를 저장하는 반면, BSS(Block Started by Symbol) 영역은 초기화되지 않은 전역 변수와 static 변수를 저장합니다. 두 영역 모두 프로그램의 시작과 함께 할당되고 종료될 때 해제되지만, BSS 영역은 값이 할당되지 않은 변수들을 위해 사용되므로 실제 메모리 할당은 변수에 값이 할당될 때 이루어집니다. 이는 메모리 사용 효율성을 높이는 데 도움이 됩니다.

질문 4: 메모리의 낮은 주소에서 높은 주소의 방향으로 할당하는 이유

Heap 영역 동작의 메커니즘은 자료구조에서의 Heap (LILO) 방식을 사용하기 때문에 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.

카테고리:

업데이트: