새소식

ETC

Process & Thread

  • -

프로그램과 프로세스

 

피자와 피자 레시피를 비유로 들면 이와 같습니다. 피자 레시피 = 코드가 구현되있는 파일 = 프로그램 피자 레시피가 피자가 되는 것처럼 코드 파일(프로그램)도 실행되어 사용할 수 있는 무언가!!가 되어야 합니다. 그 무언가가 프로세스 입니다.

 

프로그램 -> 프로세스

 


프로그램이 프로세스가 되면서 총 2가지 일이 발생합니다. 프로세스가 필요로 하는 재료들이 메모리에 올라가야 합니다. 메모리는 Code, Data, Heap, Stack 으로 총 4가지 영역으로 구성되어 있습니다. 또한, 해당 프로세스에 대한 정보를 담고 있는 Process Control Block(PCB)가 프로세스 생성 시 함께 만들어 집니다.

 

Process & Thread

 

우리는 대부분 위 그림과 같이 여러 가지의 프로세스를 동시에 사용합니다. 하지만 원래 한 프로세스가 실행되기 위해서 CPU를 점유하고 있으면 다른 프로세스는 실행상태에 있을 수 없습니다. 노래 듣다가 코딩을 하기 위해서 인텔리제이를 키면 노래가 꺼지게 되는 것입니다. 그래서 다수의 프로세스를 동시에 실행하기 위해 여러 개의 프로세스를 시분할 로, 즉 짧은 텀을 반복하면서 전환해서 실행을 시키도록 합니다.


위 그림을 화살표 방향대로 보시면 처음에는 PCB_1이 실행상태로 CPU에 적재되고, PCB_2가 실행상태로 되기 위해서는 PCB_1이 다시 준비 상태로 내려가게 됩니다. 이런 일련의 과정을 매우 짧은 텀으로 반복하게 되는 것입니다. 이러한 행위를 컨텍스트 스위칭 이라고 합니다. 두 개의 프로세스의 컨텍스트 스위칭을 봤는데도 매우 힘든 작업인 것을 알 수 있습니다.

Thread

 

그래서 등장하는게 경량화된 프로세스 버전인 스레드 입니다.

왜 스레드가 경량화된 프로세스냐 하면, 하나의 프로세스 안에 다수의 스레드가 있다면 공유되는 자원 이 있기 때문입니다. 스레드는 프로세스의 메모리 구조에서 Code, Data, Heap영역을 공통된 자원으로 사용하고 각 스레드는 Stack 부분만을 따로 갖습니다. 공유되는 자원이 있기 때문에 이전처럼 컨텍스트 스위칭이 일어날 때 캐싱 적중률이 올라갑니다. 즉, 모조리 다 빼고 다시 다 넣을 필요가 없다는 겁니다.

Multi-process

 


하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것을 의미합니다. 한 애플리케이션에서 여러 사용자가 로그인을 요청하는 상황이 있다고 가정해 봅니다. 한 프로세스는 매번 하나의 로그인만 처리할 수 있기 때문에 동시에 처리할 수 없습니다. 그래서 부모 프로세스가 fork() 하여 자식 프로세스를 여러 개 만들어 일을 처리하도록 합니다. 이때 자식 프로세스는 부모와 별개의 메모리 영역을 확보 하게 됩니다.

Multi-thread

 


하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것을 의미합니다. 스레드는 한 프로세스 내에서 구분지어진 실행 단위입니다. 만약 프로세스가 다수의 스레드로 구분되어있지 않다면 단일 스레드 하나로 프로세스가 실행됩니다.
이때 실행 단위는 프로세스 그 자체(= 해당 프로세스의 하나밖에 없는 스레드 하나)가 됩니다. 프로세스 내에서 분리해서 여러 스레드로 나뉘어서 실행 단위가 나뉘어지면 Multi-thread가 됩니다. 예시로, 인텔리제이를 사용하면서 테스트도 돌리면서 소스코드를 수정해야 한다면 한 애플리케이션에 대한 작업의 단위가 나뉘게 됩니다. 이때 각각의 스레드가 각 작업을 담당하게 되는 것입니다.

정리를 하자면 다음과 같습니다.

  • Multi-process
    • 각 프로세스는 독립적이기에 하나의 프로세스가 비정상 종료되더라고 다른 프로세스에 영향 X
    • IPC를 사용한 통신
    • 자원 소모적, 개별 메모리 차지
    • 컨텍스트 스위칭 비용이 큼
    • 동기화 작업이 필요하지 않음
  • Multi-thread
    • 스레드끼리 긴밀하게 연결되어 있음
    • 공유된 자원으로 통신 비용 절감
    • 공유된 자원으로 메모리가 효율적
    • 컨텍스트 스위칭 비용이 적음
    • 공유 자원 관리가 필요함
    • 동기화 작업이 필요
    • 하나의 쓰레드가 비정상 종료될 경우, 다른 쓰레드도 종료될 가능성이 있음

 

Multi-core

 

싱글 코어를 가진 CPU가 실행 단위를 처리할 때는 동시에 여러 가지가 진행되기 위해서 빠른 텀으로 전환되면서 실행된다고 앞서 설명했습니다. 이 개념이 동시성 입니다. 빠르게 여러 실행 단위를 번갈아 실행하면서 동시에 일어난 것처럼 보이게 하는 것입니다. 하지만 멀티 코어는 병렬처리 합니다. 물리적으로 둘 이상의 코어를 사용해서 동시에 하나 이상의 프로세스(혹은 스레드가)한꺼번에 진행되게 하는 것입니다.

 

정리

 

  • 프로세스는 프로세서에 의해 동작하고 있는 프로그램입니다.
    • 프로세스가 동작한다는 것은 프로세스의 특정 스레드가 실행 중이라는 의미로 그 특정 스레드는 프로세스가 가진 데이터를 참조합니다.
    • 따라서 스레드 단위 작업을 지원하기 위한 자원 할당 단위 라고 말하기도 합니다.
  • 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위이다.
  • 애플리케이션에 대한 작업을 동시에 하기 위해서는 2가지 처리 방식(멀티 프로세스, 멀티 스레드)이 존재한다.
  • 동시에 실행되는 것 처럼 보이기 위해서 실행 단위는 시분할로 cpu를 점유하여 컨텍스트 스위칭을 한다.
  • 멀티 프로세스는 독립적인 메모리를 갖고 있지만, 멀티 스레드는 자원을 공유한다.
  • 멀티 코어는 하드웨어 측면에서 실행 단위를 병렬적으로 처리할 수 있도록 여러 프로세서가 있는 것이다.



참고
[10분 테코톡] 🌷 코다의 Process vs Thread

'ETC' 카테고리의 다른 글

Tomcat의 file upload (feat. octet-stream, multipart)  (0) 2023.12.31
가비지 컬렉터  (0) 2023.12.30
HTTP/HTTPS  (0) 2023.12.30
Blocking과 Non-Blocking, Sync와 Async  (0) 2023.12.30
리눅스 메모리 관리  (0) 2023.12.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감/반응 부탁드립니다.