쓰레드를 공부하면서 중요하다고 생각하는 것을 곱십고 정리해서 여러편으로 나눠서 올릴 생각입니다. 기본적으로 제가 보기 위해서 작성하는 것이지만 다른 분들도 도움이 됐으면 좋겠습니다. 😀
제가 실습한 코드는 혹시 몰라 올려둡니다. https://github.com/helloJosh/nhn-homework-thread-study
1. Process
- 실행 중인 프로그램을 의미
- 더 자세히 말하면, 코드를 컴파일하여 프로그램을 실행시키면, 메모리 할당이 이루어지고 컴파일된 바이너리 코드가 올라가게되어 프로그램이 실행되고 이 순간부터 process라고 부른다.
2. Thread
Process와 유사하지만, 메모리를 공유하여 한 Process에 많은 Thread가 존재할 수 있다. Thread 별로 Stack, Register를 가지고 있다.이부분 좀더 자세히 예를 들어 설명하자면
- Static에는 말그대로 정적변수이 들어간다.
- Heap에는 Java new, 객체(ex. Array,ArrayList)의 주소값을 갖고있는 변수가 들어간다
- Stack에는 로컬변수가 들어갑니다.
- Code도 말그대로 코드 관련된 값들이 들어가게된다.
즉, 다른 Thread가 Heap, Static영역의 값 접근 방법을 알려주면 Thread끼리는 이러한 값들을 공유할수 있다.
반면에, Registers, Stack에는 쓰레드 별로 갖고있는 지역변수에 대한 값을 가지고 있는데 이러한 값은 공유할수 없다는 말이된다.
3. Process 와 Thread의 차이
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은 메모리 관리를 위한 어떠한 조항도 제공하지 않는다. |
4. Single vs Multi Thread
단편적으로 생각하면 Single이나 Multi나 한 Process가 일을 하는 것이기 때문에 어느쪽이나 효율이 똑같다고 생각할수도 있다. 게다가 Multi Process는 Context Switching에 대한 비용도 있다.
그렇다면 Multi Thread가 왜 좋을까 2가지 이유가 있다.
- 프로세서의 활동을 극대화
단편적으로 생각하면 Multi나 Single이나 Single Processer에서는 같다고 생각할 수 있지만 코드 영역에서는 한 Thread가 일을 마치면 Sleep 상태에 들어간다. Multi Thread는 그 사이의 놀고 있는 Process에 대한 활동을 극대화할수있다. - 하나의 프로세스를 다수의 실행 단위로 구분하여 자원 공유
'Java > Thread' 카테고리의 다른 글
Synchronization Control - #5 (0) | 2024.07.27 |
---|---|
Thread Synchronization(쓰레드 동기화) - #4 (0) | 2024.07.27 |
Thread Object 관리 - #3 (0) | 2024.07.27 |
Thread Counter 구현 - #2 (0) | 2024.07.27 |