하나의 프로세스를 다수의 실행 단위로 구분하고 자원 공유, 자원의 생성 및 관리의 중복성을 최소화 하여 수행 능력을 향상 시키는 것이 멀티쓰레드의 정의이다.
정리하자면 하나의 프로그램에서 동시에 여러개의 일을 처리할 수 있도록 실행흐름을 만드는 것 (일종의 경량화 된 프로세스)
프로세스를 이용하여 동시에 처리하던 일을 쓰레드로 구성할 경우 메모리, 시스템의 자원 소모가 줄어든다.
쓰레드간 통신이 필요한 경우 별도의 자원을 이용하는것이 아닌 메모리 공간(Data, Heap)영역을 이용하여 데이터를 공유하는게 가능하다.
쓰레드의 Context Switching은 프로세스의 Context Switching과 달리 캐시메모리를 비울 필요가 없다.
멀티 프로세스는 서로 Data, Heap, Stack과같은 메모리 영역을 다 공유하지 않는다.
멀티 쓰레드는 Stack 영역 빼고 다 공유한다.
멀티 쓰레드를 프로그래밍 할 때 자원 공유에 대한 동기화를 신경써서 코딩해야함 (thread-safe하게)
멀티 쓰레드간 동기화를 걸어줬을 때 서로 자원을 차지하려고 경쟁하다보면 dead-lock(교착상태)에 빠질 가능성이 있다.
그러므로 과도한 lock으로 인한 병목 현상을 줄여야 한다.
그래서 공유자원이 아닌 부분은 동기화를 할 필요가 없다
멀티 쓰레드 환경에서 둘 이상의 쓰레드가 접근해서는 안되는 공유자원을 접근하는 코드의 일부분을 말함
임계영역과 마찬가지로 공유자원에 여러 쓰레드가 접근하려고 할 때 lock을 이용해 한 번에 하나의 쓰레드에만 접근하도록 허용하는 것
멀티 쓰레드간 공유 자원 접근 순서를 제어하고 공유 자원의 수와 접근 쓰레드 수에 따라서 유연하게 공유영역으로의 접근을 제어한다.
두개 이상의 작업이 (멀티 프로세스, 멀티 쓰레드) 있는 환경에서 발생할 수 있는 Issue
아래에 발생조건 4가지가 모두 충족되면 데드락이 발생한다.
프로세스간 공유 자원은 한번에 하나의 프로세스에서만 할당된다.
즉, 여러 프로세스가 동시에 공유 자원을 사용할 수 없다.
프로세스가 공유 자원을 점유하면서, 다른 공유자원을 얻기 위해 대기하고 있는 상태를 말함
P1이 자원 B를 점유 중이고 A를 사용하기 위해 대기하고 있다고 가정한다면 P2는 B를 사용하기 위해 대기하고있는 상황이라면 P2는 P1의 작업이 끝날 때 까지 기다릴수밖에 없다.
프로세스가 한 자원을 점유하고 있으면 이를 다른 프로세스가 뺏을 수 없다.
다른 프로세스의 자원을 가지기 위해 대기하는 상황이 원형으로 만들어 진 것
P1은 B를 점유하고 있고, A를 사용하고자 함.
P2는 C를 점유하고 있고, B를 사용하고자 함. → 1이 B를 내놓을 때까지 대기
P3은 D를 점유하고 있고, C를 사용하고자 함. → 2가 C를 내놓을 때까지 대기
P4는 A를 점유하고 있고, D를 사용하고자 함. → 3이 D를 내놓을 때까지 대기
4는 3의 작업이 끝나기를, 3은 2의 작업이 끝나기를, 2는 1의 작업이 끝나기를 기다린다.
여러 프로세스가 동시에 공유 자원을 사용할 수 있도록 하거나
프로세스 실행전에 모든 자원을 할당시키거나
점유하고 있는 자원을 다른 프로세스가 뺏을 수 있도록 하거나
자원에 순서를 부여하거나..