쓰레드란

프로세스 내에서 일을 처리하는 세부실행 단위 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업한다. 경량화된 프로세스라고도 부른다.

멀티쓰레드

멀티 쓰레드란 하나의 프로세스내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다. 멀티 스레딩은 Function 단위로 실행시킨다. 즉 어떤 Function에서 다른 Function을 호출하면서 그 밑의 루틴을 다시 실행하는 것이다.

멀티프로세스와의 차이점

멀티 프로세스(multi process)는 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것을 의미합니다.
멀티 스레드와 멀티 프로세스 모두 여러 흐름을 동시에 수행하다는 공통점을 가지고 있습니다.
멀티 프로세스는 각 프로세스가 독립적인 메모리를 가지고 별도로 실행되지만, 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유한다는 점이 다르다.
멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유하므로, 시스템 자원의 낭비가 적다.

멀티쓰레드에서 쓰레드간 스택영역만 비공유하고 데이터 영역과 힙영역을 공유한다

장, 단점

  • 멀티 쓰레드의 장점 :
    • 쓰레드의 생성 및 컨텍스트 스위칭은 프로세스의 생성 및 컨텍스트 스위칭보다 빠르다.
    • 데이터 영역과 힙 영역을 통해 데이터 교환이 가능하다, 쓰레드 사이에서의 데이터 교환에서는 특별한 기법이 필요없다.
    • 멀티 쓰레드 컨텍스트 스위칭 시 데이터 영역과 힙을 뮤올리고 내릴 필요가 없다.
  • 멀티 쓰레드의 단점:
    • 서로 다른 쓰레드가 자원(데이터와 힙영역)을 공유하기 때문에 엉뚱한 값이나 수정이 될 수 있다.(동기화 필요)
    • 과도한 락으로 인해 병목현상이 일어날 수 있다
  • 병목현상이란?
    • 어떠한 특정 요소의 한계 때문에 전체가 제한받는 상황을 이에 비유해서 병목현상이라 부른 것이다. 즉 일부분에 의한 전체의 하향 평준화.
  • 임계영역(Critical Section)이란?

    • 둘 이상의 쓰레드가 동시에 실행하면 문제를 일으키는 코드블록! * 이것이 바로 쓰레드의 문제점이다.

    • 이는 하나의 변수(즉 메모리 공간)에 둘 이상의 쓰레드가 동시에 접근하기 때문이다. (쓰레드간 실행흐름이 넘어가기 때문에 문제가 발생한다.)

    • 이러한 문제를 막기 위해서는 동기화(Synchronization)가 필요하다.

  • 쓰레드 동기화 방법의 종류

    • 뮤텍스: Mutual Exclusion 의 약자로 쓰레드의 동시 접근을 허용하지 않는다는 의미.
      뮤텍스의 쓰레드 동기화 방법은 임계영역에 들어가기 위해 이 뮤텍스를 가지고 있어야 들어갈수 있다.
      일종의 자물쇠와 같은 역할. 예) 임계영역에 들어간 쓰레드가 뮤텍스를 이용해 임계영역에서 본인이 나올때까지 다른 쓰레드가 못들어오게 내부에서 자물쇠로 잠근다.
  • 세마포어: 세마포어 역시 뮤텍스와 비슷한 역할을 하지만 세마포어는 동시 접근 동기화가 아닌 접근 순서 동기화에 더 관련있다.

참고: 메모리 구조

프로그램을 실행시키면 운영체제는 우리가 실행시킨 프로그램을 위해 메모리 공간을 할당해준다.
할당되는 메모리 공간(RAM)은 크게 스택(Stack), 힙(Heap), 데이터(Data)영역으로 나뉘어진다.

  • 데이터(Data) 영역
    • 전역 변수와 static 변수가 할당되는 영역
    • 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리에서 소멸됨
  • 스택(Stack) 영역
    • 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역
    • 함수 호출이 완료되면 사라짐
  • 힙(Heap) 영역
    • 필요에 의해 동적으로 메모리를 할당 할 때 사용
    • 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우(런 타임때) 유용하게 사용되는 공간

정리

일단 쓰레드란 프로세스 내에서 일을 처리하는 단위이고 경량화된 프로세스 라고도 한다. 멀티 쓰레드는 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미하는 데 이때 Function단위로 실행시킨다.

멀티 프로세스는 각 독립적인 메모리를 가지고 별도로 실행되지만 멀티 스레드는 각 스레드가 속한 프로세스의 메모리만 공유하므로 시스템자원 낭비가 적다. 데이터와 힙영역에서 데이터 교환을 할 수 있어 특별한 기법이 필요없이 편하다. 또 프로세스 성생 및 컨텍스트 스위칭보다 속도가 빠르다

단점으로 서로 다른 쓰레드가 자원을 공유하기때문에 엉뚱한 값이나 수정이 될 수있다. 이 때문에 동기화를 해주어야한다. 과도한 락이 걸려 병목현상이 일어날 수 있다.