멀티스레딩 정리

멀티스레드를 이용한 프로그래밍 정리

개요

  • 멀티 스레드 프로그래밍을 할 때 주의해야하는 점과 주요 최적화 방법을 정리한 포스트입니다.

스레드(Thread)

  • 스레드: 모든 프로세스가 최소 한 개 이상 가지는 프로그램의 실행 흐름 단위
  • 메인 스레드: main함수를 시작점으로 가지며 프로세스의 생성과 함께 생성되는 스레드
  • 각 스레드는 생성될 때 실행할 코드 주소파라미터 값들을 가짐.

프로세스와 스레드의 차이

  • 프로세스는 실행할 프로그램의 메타 정보, pid, ppid와 같은 정보들 및 코드 영역, 데이터 영역, 힙 영역 등을 가짐
  • 스레드는 자신이 실행할 코드 주소(Program Counter), 스택 메모리, 커널 스택 메모리, Register Context, TID, State 등을 가짐.
  • 기존 운영체제 수업에서 PCB(Process Control Block)에 있다고 설명하는 프로그램 실행 정보의 일부가 스레드(TCB)에게로 넘어감

멀티 스레딩을 하는 이유

  • -> 스레드를 여러개 생성해서 실행 흐름을 생성하는 이유
  1. 멀티코어 활용, 병렬 처리. (예. 스레드1은 1에서부터 100까지의 덧셈을, 스레드2는 100부터 200까지의 덧셈을 동시에 한 뒤 두 결과값을 합침)
  2. I/O-bound 작업 동안에 다른 일을 하려고. (예. 디스크에서 게임 정보를 불러오는 동안에 화면엔 로딩바가 움직이게 하는 동시 동작)
  • 즉, 컴퓨터 자원을 더 효율적으로 유휴자원 없이 최대한 활용하기 위해 멀티스레딩을 함.
  • 윈도우에서 작업관리자를 실행한 후 성능 탭을 보면, 현재 실행되고 있는 프로세스 수스레드 수가 나옴. 평균적으로 프로세스당 10개 이상의 스레드를 사용하고 있음이 확인됨.

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

  • 멀티 스레드는 하나의 프로세스를 공유하는 실행 단위, 멀티 프로세스는 프로그램의 서로 독립적인 실행 인스턴스.
  • 멀티 스레드는 프로세스의 힙, 데이터 영역 메모리를 공유하기에 스레드 간에 간편한 상태 공유가 가능함.
  • 메모리가 공유되기 때문에 스레드 간의 영역(상태)이 침해될 수 있는 경쟁 상태가 발생.
  • 멀티 프로세스는 서로 독립적인 실행 상태를 가지기에 서로간의 침해가 불가능.
  • 단, 프로세스간의 상태 공유가 힘들어 프로세스간 통신(IPC)을 따로 수행해야 하며, n개의 스레드를 만드는 것보다 n개의 프로세스를 만드는 것이 비용이 더 큼.

멀티 스레드 환경에서의 주의점

  1. 경쟁 상태
  2. 잘못된 락에 의한 데드락
  3. 메모리 가시성 문제
  4. 컨텍스트 스위칭 비용

유저 스레드와 커널 스레드

callback

promise

async await

Sync