사실 스레드는 두가지가 있다.
윈도우 OS에서 API 형태로 제공
커널 영역에서 쓰레드 정보를 가지고 관리
OS에서 쓰레드를 관리하기에 유저 영역의 모든 쓰레드에 대해 공평한 CPU 자원 할당
아래 그림에서는 모든 쓰레드에 대해 1/3 씩 자원 할당하고 있다.
장점 : 커널에서 직접 제공해 주기 때문에 안정성과 다양한 기능성 제공
단점 : 스케줄러가 스레드를 관리하기 위해 유저 모드에서 커널 모드로 컨텍스트 스위칭이 빈번히 발생하며 이에 따른 성능 저하 발생
개발자들이 만들어서 라이브러리 형태로 제공
프로세스에서 쓰레드를 관리
커널은 쓰레드에 대한 정보는 없으며 프로세스에 대한 정보만 가지고 있음
각 프로세스가 쓰레드를 관리하며 스케줄러는 프로세스를 관리한다.
프로세스 A의 쓰레드는 각각 1/2 1/2 만큼의 자원을 할당받고 프로세스 C의 쓰레드는 1/2 1/1 만큼의 자원을 할당 받기에 프로세스 C의 쓰레드가 좀더 많은 자원을 할당 받을 것이다.
이것은 자원을 공평하게 배분 해야할 스케줄러에게는 않좋은 점이다.
다만 개별 쓰레드를 직접 관리 하는것이 아닌 프로세스를 관리 하기에 커널 영역과 유저 여역간의 컨텍스트 스위칭은 덜 발생한다.
장점 : 유저 모드에서 커널 모드로 컨텍스트 스위칭이 필요 없다
단점 : 프로세스 단위 블로킹이 발생하여 스레드를 많이 사용하는 프로세스는 성능이 많이 느려진다. 스케줄러가 모든 프로세스의 쓰레드들에 대한 효율적인 자원 분배가 어렵다.
프로세스는 생명주기 동안 2가지 모드를 바꿔가며 동작 하는데 커널 모드와 유저 모드이다
일반적으로 유저 모드로 동작 하다가 자식 프로세스 생성과 같은 OS 시스템과 커뮤니케이션이 필요한 작업을 수행할 때 커널 모드로 전환한다.
메모리를 2등분 하여 상위 메모리는 유저 메모리 영역으로 사용하고 하위 메모리는 커널 메모리 영역으로 사용한다.