728x90
프로세스 : 프로그램이 올라가는 자원할당의 단위
쓰레드 : 프로세스내의 실행흐름의 단위
데이터를 관리하는 메모리에는 4가지 종류로 구분하는데
코드 , 데이터 , 힙 , 스택 이 있다.
코드는 말그대로 돌아가는 코드를 말한다. 읽는 것 만 한다.
데이터는 전역변수나 static으로 선언한 공용변수를 의미하고
힙은 동적메모리로, 개발자가 관리하는 메모리다. (new 같은걸로 선언하는거)
스택은 함수호출로 지역변수, 매개변수 , 리턴 주소를 말한다.
여기서 프로세스는 4가지 모두 독립적으로 쓰는데
쓰레드는 코드,데이터,힙은 공용으로 쓰면서 스택은 각각 사용한다.
이게 의미하는게 뭐냐면 쓰레드가 각 작업단위에 독립적인 실행을 할 수있다는 의미다.
정리하면 스택 즉, 호출흐름만 쓰레드가 독립적으로 관리하고 나머지는
프로세스의 종속되서 메모리를 공유하는 것이다.
그래서 쓰레드가 앞서말한 3가지 메모리영역을 공용으로 쓰기때문에
프로세스보다 가벼운건데 이거를 context-switching 비용이 적다고 말할 수 있다.
쉽게말해 전부다 들고 다니는것보다는 일부만 들고 다니는게 더 빠르다는
당연한 말이다.
근데 여기서 문제는 쓰레드는 하나만 실행하는게 아니라 복수개를 사용하는
즉, 멀티 쓰레딩을 할때인데, 이러면 공용으로 사용하기 때문에 힙 같은
값을 재할당할 수 있는 메모리 값들이 동시 접근하게 될 수 있고, 이를
Race Condition 이라고 한다.
필자는 멀티쓰레딩을 이용해 구축할때는 원칙적으로 접근하는게 있는데
- 동시에 접근할 가능성이 있는 변수는 지역변수로 둔다. 그러면 스택에 쌓이기 때문에 독립적으로 존재해진다.
- 어차피 데이터라는거는 DB에 저장해서 쓰면된다. 트랜잭션으로 보호해서 논리흐름을 보호하고, 동시에 접근하는 경우를 안만든다.
- 동시에 접근하는걸 막는 락기법이 있는데 이건 다음포스트에 하겠다.
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 |