프로그램 카운터와 스택 포인터 등을 비롯한 쓰레드 실행 환경 정보와 Stack은 독립적으로 가지고 Code, Data, Heap을 다른 쓰레드와 공유한다.
Stack이 독립적으로 할당되는 이유: 독립적인 실행 흐름, 즉 독립적인 함수 호출을 가능하게 하기 위해
PC 레지스터를 독립적으로 갖는 이유: 독립적인 실행흐름이 있으므로 Context switching이 발생하기 때문에 필요하다.
프로세스: 운영체제로부터 자원을 할당받는
작업
의 단위
쓰레드: 프로세스가 할당받은 자원을 이용하는실행흐름
의 단위이다.
모든 프로세스에는 최소 한 개 이상의 쓰레드가 존재하며 둘 이상을 가진 프로세스를 멀티쓰레드 프로세스라고 한다.
하나의 프로그램을 여러 개의 쓰레드로 구성하여 작업을 처리하도록 하는 것
실제로는 한 개의 CPU 코어가 한가지 작업만 수행할 수 있기 때문에 동시에 처리되는 작업의 개수는 CPU 코어의 개수와 일치한다.
짧은 시간동안 여러 작업을 번갈아가며 수행함으로써 동시에 여러 작업이 수행되는 것처럼 보이게 하는 것이다.
프로세스 당 생성 가능한 쓰레드의 수는 제한되어 있지 않으나 쓰레드가 작업을 수행하는데 개별적인 메모리 공간을 필요로 하기 때문에 제한이 있다.
프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니다. (오히려 더 낮은 성능을 보일 수 있다)
시스템 처리량 증가(처리 비용 감소):
Context switching
을 할 때 공유하고 있는 메모리 만큼의 자원을 아낄 수 있다.Context Switching: CPU가 현재 작업중인 기존 프로세스를 중단하고 다른 프로세스를 실행하기 위해 지금까지의 상태를 저장하고 다음 프로세스의 상태를 메모리에 올리는 작업
시스템 자원 소모 감소(자원의 효율성 증대):
프로세스를 생성하여 자원을 할당하는 시스템 콜이 감소하여 자원의 효율적 관리 가능
CPU의 사용률이 향상된다.
하나의 쓰레드에 문제가 발생해 공유된 자원을 잘못 건드리면 전체 프로세스가 영향을 받는다.
자원을 공유하기 때문에 동기화 문제
(Synchronization Issue)가 발생한다. (사용자 레벨 쓰레드의 경우 쓰레드의 스케줄링은 운영체제가 아닌 개발자가 하기 때문에 직접 동기화 문제에 대응할 수 있어야 한다)
동기화 문제: 공유 자원에 여러 쓰레드가 동시에 접근해서 데이터의 일관성을 보장하지 못하는 문제
하나의 프로그램을 여러 개의 프로세스로 구성해 작업을 처리하도록 하는 것
Context switching에서의 오버헤드가 발생한다: 독립된 메모리 영역을 할당받기 때문에 서로 공유하는 메모리가 없어서 캐시에 있는 모든 데이터를 초기화하고 다시 불러와야 하기 때문에 자원과 시간이 많이 소모된다.
프로세스 간 공유된 자원이 없으므로 다소 복잡한 통신 기법 (IPC)을 필요로 한다.