MultiThreading

프로세스와 스레드

프로세스 : 프로그램이 메모리에 적재되어 실행되고 있는 상태 스레드 : 프로세스 내부의 작업 흐름

멀티스레드 사용 이유

  1. 자원의 효율적 사용
  2. 처리 속도 향상
  3. 동시에 여러 작업을 처리해야하는 경우

멀티스레딩 장단점

장점

  1. 멀티프로세스보다 가벼움
  2. 스레드 간 데이터 공유 용이

단점

  1. 스레드 1개에서 문제가 생길경우 프로세스에 영향을 미침
  2. 데이터를 공유하는 과정에서 오염이 발생할 수 있음

컨텍스트 스위치

여러 프로세스와 여러 스레드를 실행해야하는 경우 OS는 번갈아가면서 처리하게 되는데 이것을 컨텍스트 스위치라한다. 이 과정에서 작업의 상태나 위치를 저장하고 불러오는 과정이 추가로 들어가기 때문에 오버헤드가 발생한다. 일반적으로 스레드 하나가 일시 정지했다가 다시 실행하는데 5밀리초가 걸린다.

뮤텍스&세마포어

뮤텍스 : 하나의 스레드만 접근가능한 임계영역을 설정한다. 스레드가 자원을 점유하면 lock하고, 자원을 다 사용하면 unlock을 통해 다른 스레드가 접근가능하도록한다. 세마포어 : 카운팅을 통해 스레드가 자원을 점유할 지 판단. 여러 스레드가 자원을 점유할 수 있다.

데드락

발생 조건

  1. 상호배제 : 공유 자원에 하나의 프로세스만 접근 가능하다.
  2. 점유와 대기 : 프로세스가 자원을 점유하는 상황에서 다른 자원을 점유하기 위해 대기한다.
  3. 비선점 : 다른 프로세스가 사용중인 공유 자원을 뺏어올 방법이 없다.
  4. 환형 대기 : 여러 프로세스가 자원을 대기하는 형태가 사이클을 이룬다.

해결 방법

  1. 여러 뮤텍스를 사용할 경우 잠금 순서를 명확하게한다.
  2. 뱅커 알고리즘 : 안전 상태와 불안전 상태를 판단해, 프로세스가 자원을 점유할 지 결정 이해하기 쉬운 글

스레드 풀

스레드를 생성, 유지, 삭제하는데에도 자원을 소모한다. 작업을 완료했을 때 스레드를 삭제하고 다른 작업을 실행할 때 생성하는 것보다 만들어둔 스레드에 새 작업을 할당하는 것이 더 자원을 효율적으로 사용할 수 있다.

메모리 배리어

컴파일러의 최적화에 의해 코드의 순서가 바뀌는 경우를 방지한다.

멀티스레딩 사용할 때 유의할 점

  1. 공유자원에 접근할 때 읽기 작업만 해도 잠금을 걸어야한다.
  2. 잠금의 순서와 범위를 명확하게한다.
  3. 잠금 안에서 얻은 참조 타입을 잠금 외부에서 사용하는 경우 데이터 레이스가 발생할 수 있다.
  4. 잠금된 뮤텍스나 임계영역을 삭제해선 안된다.