과거 OS는 멀티 프로세스를 지원하는 OS, 지원하지 않는 OS가 있었고

거기서 분리되어 쓰레드를 지원하는 OS, 지원하지 않는 OS(Unix)가 있었다

현대에는

쓰레드를 지원하지 않는 OS

쓰레드를 지원하는 OS가 있다.


지원하는 OS가 무슨 의미냐면 커널에서 쓰레드를 지원해준다는 것이다.


지원하지 않는 OS는 커널에서 쓰레드를 지원하지 않는다. 그래서 라이브러리 형태로 커널을 사용해야 한다.

-> 유저가 만들어서 사용하는 쓰레드다.



라이브러리는 유저 영역이다. 쓰레드를 지원하는 라이브러리 역시 유저 영역이다.



커널이 쓰레드를 지원해준다는 것은 커널이 각각의 쓰레드를 스케줄링 해준다는 것이다

이를 커널 레벨 쓰레드라고 한다.


반대로, 지원해주지 않는다는 것은 커널이 각각의 프로세스를 스케줄링 해준다는 것이다

이를 유저 레벨 쓰레드라고 한다.


그래서 쓰레드 지원 OS는 총 쓰레드 갯수를 감안해서 스케줄링하지만, 지원하지 않는 OS는 총 프로세스 갯수를 감안해서 스케줄링한다.


그 결과, 유저 레벨 쓰레드에서 만약 내부 쓰레드가 Blocked 상태로 빠지게 되면 스케줄러는 해당 프로세스가 Blocked 상태로 빠졌다고 생각하고 해당 프로세스의 실행 권한을 뺏어가버린다.


한 쓰레드의 상태로 프로세스 전체가 멈춰버리게 되는 것이다.


그렇다고 유저 레벨 쓰레드가 안좋다는 것은 아니다. 유저 레벨 쓰레드는 빠르다!는 장점이 있다




커널 모드와 유저 모드



유저가 커널에 접근해서 커널을 뒤죽박죽 해놓으면 개망하기 때문에 평소에는 유저 모드로 커널 영역에 접근을 제한시킨다.


커널 모드는 모든 메모리에 접근이 가능한 상태를 의미하고


유저 모드는 유저 레벨만 접근이 가능한 상태를 의미한다.


커널 모드로 변환되는 경우는 스케줄러가 동작하거나, 프로세스를 생성하거나, 쓰레드 지원 OS라면 쓰레드를 사용하는 경우 등등, 커널이 필요한 경우에 커널 모드로 변경된다.



커널 레벨 쓰레드는 쓰레드간 실행 권한이 변경될 때, 쓰레드 간의 컨텍스트 스위칭이 일어날 때마다 유저 모드에서 커널 모드로 변경되어야 한다.


그로 인해 속도가 저하되는 것이다.


하지만 유저 레벨 쓰레드는 커널 영역으로 들어갈 필요가 없다. 그로 인해 속도적인 손해를 보지 않는다.



+ Recent posts