CS 전공지식

23.12.21 프로세스와 스레드의 차이?

김용글 2023. 12. 21. 14:23

1. 프로그램(Program)

    - 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태이며 어떤 작업을 위해 실행 할 수

      있는 파일

 

2. 프로세스(Process)

    - 컴퓨터에서 연속적으로 실행되고 있는 프로그램으로 메모리에 올라가서 실행되고 있는 프로그램의 인스턴스

    - 운영체제로부터 시스템의 자원을 할당받은 작업의 단위, 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드) 를

       가지고 있다

    - 각 프로세스는 별도의 주소 공간에서 실행되고 있으며 각 프로세스끼리는 자원의 공유를 하지 않음

    - 하나의 프로세스가 다른 프로세스의 자원에 접근하러면 프로세스 간이 통신이 필요하며 메일슬롯, 파이프, 소켓,

      시그널, 공유 메모리등의 수단을 이용해야함

  1) 할당 받는 시스템의 자원?

      - Code, Data, Stack, Heap 구조로 되어있는 독립된 메모리 영역

      - 주소 공간 

      - CPU 시간

3. 스레드(Thread)

    - 프로세스 내에서 실행되는 흐름의 단위로 프로세스 하나에 자원을 공유하면서 일련의 과정을 여러개 동시에

      실행 시킬 수 있는 것

    - 프로세스 내에서 각각 Stack 만 따로 할당 받고 Code, Data, Heap 영역을 공유

    - 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유하며 다른 프로세스라면 프로세스의 메모리에

       접근할 수 없다

    - 한 스레드가 프로세스 자원을 변경하면 다른 아웃 스레드(sibling thread)도 변경된 결과를 직접 반영하여 볼 수 있다.

 

4. 자바에서 스레드

    - 자바에서 스레드는 일반 스레드와 거의 차이가 없고 JVM 이 운영체제의 역할을 대신 수행

    - 자바에서 프로세스가 존재하지 않고 스레드만 있으며 자바 스레드는 JVM에 의해 스케줄링 되는 실행 단위 코드 블록

      따라서, 자바에서의 스레드 스케줄링은 JVM 에 의해 이루어짐

    - 개발자는 자바 스레드로 작동시킬 스레드 코드를 작성하면 스레드 코드가 생명을 가지고 실행 시작을 JVM 에 요청

       * JVM : 자바의 가상환경을 만들어 주어 여러가지 기기위에 JAVA 를 실행 시킬 수 있게 한다

  1) JVM 의 스레드 관리 예시

      - 스레드 존재 갯수
      - 스레드로 실행시키는 프로그램 코드의 메모리 위치

      - 스레드 상태 관리

      - 스레드 우선순위 관리

 

5. 멀티 프로세스와 멀티 스레드의 차이

  1) 멀티 프로세스(Multi-Process)

      - 하나의 응용 프로그램을 여러개의 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 동작시키는 것

      - 여러개의 자식 프로세스 중 하나에 문제가 발생해도 다른 자식 프로세스에 영향을 미치지 않으면 구현이 간단한

        장점이 있다.

      - 각 프로세스들이 독립적으로 동작(자원의 할당 또한 독립)이어서 안정적

      - 단점으로는 멀티스레드보다 많은 메모리 공간과 CPU 처리시간을 차지하며 작업량이 많을 수록 오버헤드가 크고

        문맥교환(Context-Switching)에 많은 시간이 소요되어 성능 저하가 발생할 수 있다.

      - 프로세스 간에 자원 공유를 하려면 프로세스 간의 통신을 통해 해야하며 통신을 위해 IPC 를 통해야 함

         * IPC (Inter Process Communication)

            - 프로세스들끼리 서로 데이터를 주고 받는 행위 또는 그에 대한 방법이며, 대표적인 종류에는

              메세지 전달(Message Passing) 과 메모리 공유(Shared Memory) 가 있다.

 

  2) 멀티 스레드(Multi-Thread)

      - 하나의 응용 프로그램을 여러개의 스레드로 구성해서 각 스레드가 하나의 작업을 처리하도록 하는 것

      - 장점으로는 시스템 자원과 처리 비용이 감소하고 Stack 영역만 처리하면 되기 때문에 문맥 교환이 빠름

        또한, 스레드간의 자원(Coda, Data, Heap) 을 공유해 통신 부담이 적고 응답 시간이 빠르다

      - 단점으로는 스레드가 개별로 유기적으로 움직이기 때문에 프로그램의 테스트와 디버깅이 어렵고 데이터 공유를

        할 때 동기화 문제가 발생한다. 또한, 하나의 스레드에서 오류가 발생하면 전체 프로세스로 영향을 미치고,

       너무 많은 스레드를 사용할 때에는 오버헤드가 발생할 수 있다.

 

6. 멀티 프로세스 대신 멀티 스레드를 사용하는 이유

    - 멀티 스레드를 사용하면 자원의 효율성이 증대, 처리비용감소, 응답시간 단축에 큰 메리트가 있다

  1) 자원의 효율성 증대

      - 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행하면 프로세스를 생성해 자원을 할당하는 시스템 콜이

        줄어들기 때문에 자원을 효율적으로 관리할 수 있다.

      - 멀티 프로세스에서는 프로세스 간의 문맥교환이 단순히 CPU 레지스터의 교체뿐만 아니라 RAM 과 CPU 사이의

        캐시 메모리에 대한 데이터 역시 초기화가 이루어지기 때문에 오버헤드가 크다

      - 스레드는 프로세스 내의 메모리 자원을 공유하기 때문에 독립적인 프로세스와 다르게 스레드에서는 데이터를

        주고 받는 것이 간단하며 시스템 자원 소모가 크게 줄어듬 

 

  2) 처리 비용 감소와 응답시간 단축

      - 스레드는 Stack  영역을 제외한 모든 메모리의 자원을 공유하기 때문에 프로세스 간의 통신(IPC) 보다는

        스레드 간의 통신이 비용이 적기 때문에 작업들 간의 통신 부담이 줄어듬

      - 스레드는 문맥교환시에 Stack 영역만 처리해서 프로세스 간의 전환속도 역시 멀티 프로세스보다 훨씬 빠르다 

 

7. 프로세스와 스레드의 차이

     - 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다. 
     - 프로세스는 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당 받는다.       

       (code, data, heap, stack)
     - 스레드는 이중에 stack만 따로 할당받고 나머지 영역은 스레드끼리 서로 공유한다.
       

     - 프로세스는 강제종료가 되어도 파일은 손상시키는 경우가 아니라면 아무런 영향이 없지만 스레드는

       code, data, stack 메모리 영역을 공유하기 때문에 하나의 스레드에서 오류가 발생하면 같은 프로세스내의

       다른 스레드가 모두 강제로 종료된다

 

 

참고 블로그

https://developer-ellen.tistory.com/201