[Operating System] 프로세스와 스레드의 메모리

Kim Hyen Su·2024년 3월 7일

👾 CS

목록 보기
2/5

참고 포스팅

💻 프로세스 & 스레드 메모리


👾 프로세스의 자원 구조

프로그램이 실행되어 운영체제로 부터 메모리를 할당 받으면 다음과 같은 4가지 영역으로 구성되어 있습니다.

  • 코드 영역(TEXT / CODE) : 프로그래머가 작성한 소스 코드가 CPU에서 해석 가능한 기계어 형태로 저장되어 있습니다.

  • 데이터 영역(DATA) : 코드가 실행되면서 사용하는 전역 변수나 각종 데이터들이 모여 있습니다. 데이터 영역은 .data, .rodata, .BSS 영역으로 세분화 됩니다.

    • .data : 전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장.
    • .BSS : 초기값 없는 전역 변수, static 변수가 저장. 이 영역의 변수들은 프로그램 시작 시, 0으로 초기화 됩니다.
    • .rodata : const 같은 상수 키워드가 선언된 변수나 문자열 상수가 저장.
  • 스택 영역(STACK) : 지역 변수와 같이 함수 호출과 종료에 수명이 끝나는 변수를 저장하는 영역입니다. 스택은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸됩니다. 만일 스택 영역의 메모리를 초과하게 되면 stack overflow 에러가 발생하게 됩니다.

  • 힙 영역(HEAP) : 생성자 또는 인스턴스와 같이 동적으로 할당되는 데이터들을 위해 존재하는 공간입니다. 사용자에 의해 메모리 공간이 동적으로 할당되고 소멸됩니다.

위 그림에서 Stack과 Heap 영역에 위아래로 화살표가 나타난 이유는 코드 영역과 데이터 영역은 선언할 때 그 크기가 결정되는 정적인 영역이지만, 스택과 힙 영역은 프로세스가 실행되는 동안에 크기가 늘었다가 줄어드는 동적인 영역이기 때문입니다.

프로그램이 여러개 실행된다면 메모리에 프로세스들이 담길 주소 공간이 생성되고 그 안에 Code, Data, Stack, Heap 메모리 공간이 구성됩니다.


👾 스레드의 자원 공유

스레드는 프로세스가 할당 받은 자원을 아용하는 실행 단위로, 스레드 간에는 프로세스의 자원을 공유하면서 작업을 수행합니다. 따라서 여러 작업을 동시에 수행하는 프로세스의 내부 그림을 보면 다음과 같습니다.

프로세스의 4가지 메모리 영역 중 스레드는 STACK 영역만 할당 및 복사하고 나머지 영역들은 다른 스레들과 공유합니다.

스택은 함수 호출 시 전달되는 인자, 돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이기 때문에, 독립적인 스택을 가졌다는 것은 독립적으로 함수 호출이 가능하다는 의미입니다. 즉, stack을 가짐으로써 스레드는 독립적인 실행 흐름을 가질 수 있게 되는 것입니다.

프로세스 간의 자원 공유
프로세스는 기본적으로 프로세스 들 간에 메모리 직접 접근이 불가능합니다.

이처럼 구성한 것은 하나의 프로세스를 다수의 실행 단위인 스레드로 구분하여 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 동시 수행 능력을 높이기 위함입니다.


👾 프로세스의 자원 공유

profile
백엔드 서버 엔지니어

0개의 댓글