쓰레드를 공부하면서 중요하다고 생각하는 것을 곱십고 정리해서 여러편으로 나눠서 올릴 생각입니다. 기본적으로 제가 보기 위해서 작성하는 것이지만 다른 분들도 도움이 됐으면 좋겠습니다. 😀
제가 실습한 코드는 혹시 몰라 올려둡니다. https://github.com/helloJosh/nhn-homework-thread-study
이부분 좀더 자세히 예를 들어 설명하자면
Heap에는 Java new, 객체(ex. Array,ArrayList)의 주소값을 갖고있는 변수가 들어간다
Static에는 말그대로 정적변수 그리고 8가지 원시타입이 들어간다.
Code도 말그대로 코드 관련된 값들이 들어가게된다.
즉, 다른 Thread가 Heap, Static영역의 값 접근 방법을 알려주면 Thread끼리는 이러한 값들을 공유할수 있다.
반면에, Registers, Stack에는 쓰레드 별로 갖고있는 지역변수에 대한 값을 가지고 있는데 이러한 값은 공유할수 없다는 말이된다.
Process | Thread |
---|---|
프로그램이 실행하기 위한 모든 자원들을 개별적으로 가지고 있어 무겁다 | 개별적으로 분리가 필요한 최소한의 자원들만 가져 LWP(Light Weight Process)라고도 하는 경량 process |
process별로 자체 메모리를 갖는다 | process내의 다른 thread와 메모리를 공유한다. |
개별 메모리로 인해 process 간 통신이 느리다. process간 통신을 위해서는 OS에서 제공하는 다양한 통신 기술을 이용해야 한다. | 공유 메모리를 이용한 직접 통신이 가능해 thread 간 통신이 빠르다. |
Multi process 지원 시스템에서는 process context switching시 이전 process의 메모리 및 스택 정보를 storage에 저장하는 swapping 이 발생할 수 있으며, 이는 메모리에 있던 정보르 storage에 옮기거나 storage에 저장된 정보를 메모리에 올리는 작업이 수행되므로 비용이 많이 든다 | thread 간 context 전환은 공유 메모리로 인해 비용이 저렴하다. |
구성 요소에 대한 여러 process가 있는 application은 메모리가 부족할 때 더 나은 메모리 활용도를 제공할 수 있다. Application의 비활성 process에 낮은 우선순위를 할당할 수 있다. 그러면 이 유휴 process는 storage로 swapping될 수 있다. | 메모리가 부족한 경우 Multi-threaded application은 메모리 관리를 위한 어떠한 조항도 제공하지 않는다. |
단편적으로 생각하면 Single이나 Multi나 한 Process가 일을 하는 것이기 때문에 어느쪽이나 효율이 똑같다고 생각할수도 있다. 게다가 Multi Process는 Context Switching에 대한 비용도 있다.