프로세스와 쓰레드를 메모리 관점에서 이해해보자

728x90

프로세스 : 프로그램이 올라가는 자원할당의 단위

쓰레드 : 프로세스내의 실행흐름의 단위

 

데이터를 관리하는 메모리에는 4가지 종류로 구분하는데

코드 , 데이터 , 힙 , 스택 이 있다.

 

코드는 말그대로 돌아가는 코드를 말한다. 읽는 것 만 한다.

데이터는 전역변수나 static으로 선언한 공용변수를 의미하고

힙은 동적메모리로, 개발자가 관리하는 메모리다. (new 같은걸로 선언하는거)

 

스택은 함수호출로 지역변수, 매개변수 , 리턴 주소를 말한다.

여기서 프로세스는 4가지 모두 독립적으로 쓰는데

쓰레드는 코드,데이터,힙은 공용으로 쓰면서 스택은 각각 사용한다.

 

이게 의미하는게 뭐냐면 쓰레드가 각 작업단위에 독립적인 실행을 할 수있다는 의미다.

정리하면 스택 즉, 호출흐름만 쓰레드가 독립적으로 관리하고 나머지는

프로세스의 종속되서 메모리를 공유하는 것이다.

 

그래서 쓰레드가 앞서말한 3가지 메모리영역을 공용으로 쓰기때문에

프로세스보다 가벼운건데 이거를 context-switching 비용이 적다고 말할 수 있다.

 

쉽게말해 전부다 들고 다니는것보다는 일부만 들고 다니는게 더 빠르다는

당연한 말이다.

 

근데 여기서 문제는 쓰레드는 하나만 실행하는게 아니라 복수개를 사용하는

즉, 멀티 쓰레딩을 할때인데, 이러면 공용으로 사용하기 때문에 힙 같은

값을 재할당할 수 있는 메모리 값들이 동시 접근하게 될 수 있고, 이를

Race Condition 이라고 한다.

 

필자는 멀티쓰레딩을 이용해 구축할때는 원칙적으로 접근하는게 있는데

  1. 동시에 접근할 가능성이 있는 변수는 지역변수로 둔다. 그러면 스택에 쌓이기 때문에 독립적으로 존재해진다.
  2. 어차피 데이터라는거는 DB에 저장해서 쓰면된다. 트랜잭션으로 보호해서 논리흐름을 보호하고, 동시에 접근하는 경우를 안만든다.
  3. 동시에 접근하는걸 막는 락기법이 있는데 이건 다음포스트에 하겠다.
728x90

'CS' 카테고리의 다른 글

API 캐싱  (0) 2025.09.02
[면접 질문 정리] Array , ArrayList , LinkedList 를 이해해보자  (2) 2025.07.08
HTTP에서 “GET”이 더 안전하다?  (1) 2025.05.20
필터 , 인터셉터의 차이와 이해  (0) 2025.04.18
SSO VS Social Login  (0) 2025.04.01