[CS]Memory 개념 정리

minujana
5 min readAug 12, 2021

메모리에 대한 개념을 좀 정리하려고 한다.

  • 메모리 구조
  • 프로세스
  • 스레드
  • 멀티 프로세스
  • 멀티 스레드
  • 컨텍스트 스위칭
  • 오버플로우

메모리 그 자체라기 보단 관련된 용어들도 같이 정리해두고, 잊혀질만 할 때쯤 한번씩 참고해서 읽기위해…

개발자가 아니더라도 서버단에서 이러한 지식을 알고 있다면, 언젠가 트러블슈팅에 도움이 될 것이라고 생각하니까 정리해두자

메모리 구조

메모리 구조는 많이들 알고있는 것 처럼

코드, 데이터, 힙, 스택 의 4가지 영역으로 구성된다.

이미지 출처: 구글 검색(https://ju-hyeon.tistory.com/7)

메모리 구조를 나타내는 그림은 거의 위와 같은 모양이고, 그림에서 위쪽이 Low Address, 아래쪽이 High Address를 나타낸다. 그림을 참고하여 각 영역을 설명하자면,

  • 코드 영역: 말그대로 실행할 코드가 저장되는 영역이다.
  • 데이터 영역: 프로그램 실행에 사용되는 ‘ 전역 변수 ‘ 와 ‘ 정적 변수 ‘ 등이 저장되는 곳이다.
  • 힙 영역: 사용자(코드 개발자)에 의하여 할당되고, 해제되는 영역이다. Low Address → High Address의 방향으로 메모리가 찬다.
  • 스택 영역: 프로그램이 자동으로 사용하는 영역으로 함수가 호출될때 사용되고 바로 비워지는 아주 빠른 영역이다. 하지만, 컴파일할 때 크기가 결정되며 그 크기를 넘어서는 확장은 불가능하다. High Address → Low Address의 방향으로 메모리가 찬다.

→ 힙을 얼마나 잘 쓰느냐가 프로그램의 성능을 좀 좌우한다고 생각하는데, 힙과 관련하여 유발되는 문제점은 힙 할당 or 해제시에 속도 저하, 힙 경합 발생시 컨텍스트 스위칭 유발 등이 있다.

→ 힙과 스택의 메모리가 채워지는 방향성이 달라서 프로그램이 돌다보면 어느순간 두 영역이 서로의 영역을 침범하게되면 에러가 발생하는데, 이를 오버플로우라고 한다.

컨텍스트 스위칭과 오버플로우를 기억하고 뒤쪽에서 다시 자세히 참고하자

프로세스와 스레드

프로세스와 스레드는 아래 그림을 우선 참고하자.

[좌/우]: 프로세스/스레드 (출처: 구글검색, https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html)

프로세스는 말그대로 하나의 앱, 프로그램 단위이다. OS로부터 자원(메모리)를 할당받아서 사용을 한다. 이 프로세스안에 스레드라는 실행 단위가 존재하는데, 각 스레드는 프로세스가 OS로 부터 받은 자원을 공유하되 Stack 영역은 스레드 별로 사용한다.

위 그림은 멀티 프로세스와 멀티 스레드의 구조를 보여주기도 한다. 멀티 프로세스로 만든 프로그램과 멀티 스레드로 만든 프로그램의 차이는 명확하다.이러한 차이는 스레드와 프로세스의 자원 사용 방식의 차이에서 발생하는 거라고 생각한다.

멀티 스레드의 경우 한 프로세스에서 자원을 공유하면서 여러 스레드가 돌아가기 때문에 당연하게도 자원을 더 적게 사용하면서, 속도가 더 빠르다. 하지만, 하나의 스레드가 문제를 발생시키면, 다른 스레드에도 영향이 가고 전체에 영향을 끼칠 수 있는 단점이 존재해 구성에 난이도가 높다.

이와 반대로 멀티 프로세스는 독립된 자원을 사용하기에 다른 프로세스에 끼치는 영향도가 적다. 하지만, 프로세스간의 통신을 통해서 프로그램이 돌아가기 때문에 당연히 속도가 느리고, 오버헤드가 멀티스레드에 비해 더 길다.

컨텍스트 스위칭

메모리의 영역 중에서 힙 경합이 발생하면 컨텍스트 스위칭이 유발될 수 있다고 했다. 컨텍스트 스위칭이 일단 뭔지 알아보자

우선 순위의 작업을 위해서 현재 작업을 대기하고, 우선 순위의 작업을 불러와서 실행하는 과정을 컨텍스트 스위칭이라고 한다.

컨텍스트 스위칭 과정

그림을 보면 P0를 PCB에 저장하고, P1을 불러오고 실행한 후, 다시 PCB에 P1의 상태를 저장하고, P0를 불러와서 실행한다. 전형적인 인터럽트 상황에서 발생하는 컨텍스트 스위칭 과정이다.

그림에 idle 라고 쓰여있는 부분이 바로 CPU의 오버헤드가 발생하는 구간이다. P0를 저장하고 P1을 불러오는 동안 CPU는 말그대로 놀고있는다.

여기서 멀티스레드와 멀티프로세스의 속도 차이가 발생하는 이유가 하나 더 설명되는데, 스레드는 스택영역만 PCB에 저장되면 된다. 하지만, 프로세스는 해당 프로세스가 할당받은 메모리를 모두 저장한다. 프로세스가 무거우면 무거울수록 속도차이는 더욱 날 것이라고 예상할 수 있다.

최초에 우리가 생각했던 힙 경합이 스레드 컨텍스트 스위칭을 유발하는 걸 설명하고 다음으로 넘어가자.

멀티 스레드 환경에서 힙은 공유 자원이다. 따라서 사용자에 의해서 A스레드가 쓰고, 해제하고, B가 쓰고 해제하고 등등 이루어질껀데, A가 쓰는 도중 B가 쓰려하면 말그대로 경합이 발생하고, 우선 순위의 작업을 처리하기 위해서 스레드 컨텍스트 스위칭이 유발될 수 있는 것이다.

오버플로우

아까 앞에서 말한대로 오버플로우는 힙과 스택의 메모리 사용 방향성이 달라서 생기는 에러이다. 그 유명한 글로벌 지식인 사이트 스택오버플로우가 여기서 나온 용어이다.

힙은 Low → High로 오름차순의 방향성을 갖고,
스택은 High →Low로 내림차순의 방향성을 갖는데,

스택 영역이 점점 위에서 부터 채우면서 내려오다가 이미 힙이 사용하고있는 영역을 침범했다. → 스택오버플로우

반대로, 힙 영역이 점점 아래에서 부터 채워 올라오다 이미 스택이 사용하고 있는 영역을 침범한다. → 힙 오버플로우

이론 공부도 틈틈히 하고 정리를 해놓는게 좋을 것 같다.

--

--