2022.05.18 TIL(Thread vs Process)

이진호·2022년 5월 18일
0

TIL

목록 보기
11/11

본문의 내용은 다음의 강의를 토대로 작성한 글임.
https://www.youtube.com/watch?v=1grtWKqTn50

Keywords
1. 실행 단위 - cpu core에서 실행하는 하나의 단위로 프로세스스레드를 포함하는 개념.
- 이 실행 단위는 프로세스일수도 스레드일수도 있음.
2. (부연 설명이 없는) 프로세스 - 하나의 스레드만 가지고 있는 단일 스레드 프로세스
3. 동시성 - 한 순간에 여러가지 일이 아니라, 짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것.

1. Process & Thread

1-1. 프로그램과 프로세스

예시) 피자집에 가서 피자를 시켰는데 피자가 나왔다고 하면서 피자 레시피가 적힌 종이를 줌.
여기서, 이 레시피는 우리가 열심히 구현하고 있는 코드 파일에 해당함(=프로그램).
하지만 이 프로그램은 실행하기 전에는 그저 코드가 구현되어 있는 파일일 뿐임. 이 때, 피자레시피를 통해 피자를 만드는 것처럼 실행이 되어서 사용이 가능한 무언가가 되어야 하는데 이것이 바로 프로세스임.

1-2. Process 지식

프로그램이 프로세스가 되면서 어떤 일이 일어날까?(총 두가지 일이 발생함)

  • 프로세스가 필요로 하는 재료들이 메모리(Code, Data, Heap, Stack)에 올라가야 함.
  • 해당 프로세스에 대한 정보를 담고 있는 PCB 블럭이 프로세스 생성 시 함께 만들어짐.

1-3. Process & Thread

원래 한 프로세스가 실행되기 위해서 cpu를 점유하고 있으면 다른 프로세스는 실행상태에 있을 수 없음. 따라서, 다수의 프로세스들을 동시에 실행하기 위해서 여러 개의 프로세스를 시분할로, 즉 짧은 텀으로 전환해서 사용하려 함.

Context switch

  • PCB_1과 PCB_2라는 프로세스들이 있을 때, PCB_1이 실행중이면 PCB_2가 준비상태에 있고, PCB_2를 실행하기 위해서는 프로세스1이 먼저 준비상태로 내려가고, 프로세스2가 cpu에 적재가 되고, 이런식으로 전환하며 프로세스를 실행하는 것.
  • 이처럼 힘든 작업을 보완하기 위해 경량화된 프로세스 버전인 쓰레드가 존재함.

여기서, 쓰레드는 코드, 데이터, 힙 영역공통된 자원으로 사용함. 각 스레드는 스택 부분만을 따로 가지고 있음.
이처럼 공유되는 자원이 있기 때문에 이전처럼 컨텍스트 스위칭이 일어날 때 캐시 적중률이 올라감(= 쉽게 말해 모조리 다 빼고 다시 다 넣을 필요가 없음)

1-4. Multi_prcess & Multi_thread

이 두가지는 처리방식의 일종으로 한 어플리케이션에 대한 처리방식이라 생각하면 됨. 따라서, 여기서는 한 어플리케이션을 처리하는 방법이 두 가지가 있구나라고 생각하면 됨.

1) Multi_process
예를 들어 여러 사용자가 로그인을 요청하는 상황이 존재함.
한 프로세스는 매번 하나의 로그인만 처리할 수 있기 때문에 동시 처리를 할 수 없음
따라서, 부모 프로세스는 fork를 통해 자식 프로세스를 여러 개 만들어서 이를 처리하게 함. 이 떄, 자식 프로세스는 부모 프로세스와 별개의 메모리 영역을 확보하게 됨.

  • 각 프로세스는 독립적
  • IPC를 사용한 통신
  • 자원 소모적, 개별 메모리 차지
  • Context Switching 비용이 큼.
  • 동기화 작업이 필요하지 않음.

2) Multi_Thread
한 프로세스 내에서 구분지어진 실행 단위임.

  • Thread끼리 긴밀하게 연결되어 있음.
  • 공유된 자원으로 통신 비용 절감
  • 공유된 자원으로 메모리가 효율적임
  • Context Switching 비용이 적음
  • 공유 자원 관리를 해야함.

만일 프로세스가 다수의 스레드로 구분되어 있지 않으면 단일스레드 하나로 프로세스가 실행됨. 다시 말해 해당 프로세스의 하나밖에 없는 쓰레드가 실행 단위가 됨.

1-5. Multi core

동시성(Concurrency): 하나의 코어에서 하나 이상의 프로세스(혹은 쓰레드)가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는 것

병렬처리(Parallelism): 둘 이상의 코어에서 동시에 하나 이상의 프로세스(혹은 스레드)가 한꺼번에 진행되는 것

Multi core는 물리적으로 여러 코어를 사용해서 다수의 실행 단위를 한순간에 처리할 수 있게 함.

번외) 리눅스에서 Process와 Thread

  • 리눅스 커널에서는 프로세스와 스레드를 동일하게 봄.
  • 스레드는 사용자 스레드와 커널 스레드가 존재하는데, 리눅스는 사용자 스레드당 커널 스레드 하나가 매칭되어 있는 구조임.
  • 따라서, '각각의 쓰레드가 하나의 프로세스다'라고 표현을 함.
  • 여기서 프로세스는 메모리 공유를 하고, 이전에 언급한 프로세스와 달리 light weight process라 구분해서 부름.
  • 커널 및 유저 입장에 따라 다르게 보임.

요약

  • 프로세스는 프로그램이 실행된 것이다.
  • 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위이다.
  • 한 어플리케이션에 대한 작업을 동시에 하기 위해서는 2가지 처리 방식(멀티 프로세스, 멀티 스레드)이 있다.
  • 동시에 실행이 되는 것처럼 보이기 위해서 실행 단위는 시분할로 cpu를 점유하며 context switching을 함.
  • 멀티 프로세스는 독립적인 메모리를 가지고 있지만 멀티 스레드는 자원을 공유한다.
  • 멀티 코어는 하드웨어 측면에서 실행 단위를 병렬적으로 처리할 수 있도록 여러 프로세스가 존재함.

0개의 댓글