Process(프로세스) vs Thread(쓰레드) - #1

김병우·2024년 3월 11일
0

Java-Thread

목록 보기
1/5

쓰레드를 공부하면서 중요하다고 생각하는 것을 곱십고 정리해서 여러편으로 나눠서 올릴 생각입니다. 기본적으로 제가 보기 위해서 작성하는 것이지만 다른 분들도 도움이 됐으면 좋겠습니다. 😀
제가 실습한 코드는 혹시 몰라 올려둡니다. https://github.com/helloJosh/nhn-homework-thread-study

1. Process

  • 실행 중인 프로그램을 의미
  • 더 자세히 말하면, 코드를 컴파일하여 프로그램을 실행시키면, 메모리 할당이 이루어지고 컴파일된 바이너리 코드가 올라가게되어 프로그램이 실행되고 이 순간부터 process라고 부른다.

2. Thread

  • Process와 유사하지만, 메모리를 공유하여 한 Process에 많은 Thread가 존재할 수 있다.
  • Thread 별로 Stack, Register를 가지고 있다.

    이부분 좀더 자세히 예를 들어 설명하자면
    Heap에는 Java new, 객체(ex. Array,ArrayList)의 주소값을 갖고있는 변수가 들어간다
    Static에는 말그대로 정적변수 그리고 8가지 원시타입이 들어간다.
    Code도 말그대로 코드 관련된 값들이 들어가게된다.

    , 다른 Thread가 Heap, Static영역의 값 접근 방법을 알려주면 Thread끼리는 이러한 값들을 공유할수 있다.

    반면에, Registers, Stack에는 쓰레드 별로 갖고있는 지역변수에 대한 값을 가지고 있는데 이러한 값은 공유할수 없다는 말이된다.

3. Process 와 Thread의 차이

ProcessThread
프로그램이 실행하기 위한 모든 자원들을 개별적으로 가지고 있어 무겁다개별적으로 분리가 필요한 최소한의 자원들만 가져 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가지 이유가 있다.

  1. 프로세서의 활동을 극대화
    단편적으로 생각하면 Multi나 Single이나 Single Processer에서는 같다고 생각할 수 있지만 코드 영역에서는 한 Thread가 일을 마치면 Sleep 상태에 들어간다. Multi Thread는 그 사이의 놀고 있는 Process에 대한 활동을 극대화할수있다.
  2. 하나의 프로세스를 다수의 실행 단위로 구분하여 자원 공유




이정도로 Thread에 대한 개요를 마치고 다음 게시물 부터는 Java코드를 통해서 공부해나갈 계획입니다.

profile
백엔드개발자

0개의 댓글