스레드
스레드는 여러 개가 존재할수도 있다. 이를 멀티 스레드라고 한다.
이러한 스레드는 커널 수준 스레드와 사용자 수준 스레드로 나뉜다.
커널 수준 스레드는 커널 레벨에서 생성되는 스레드이다.
운영체제 시스템 내에서 생성되어 동작하는 스레드로, 커널이 직접 관리한다.
그런데 커널 수준에서는 프로세스가 주기억 장치에 여러 개가 적재되어 CPU 할당을 기다리며 동작한다.
CPU에서 인터럽트 발생으로 현재 작업 중인 프로세스가 Block되고 다른 프로세스로 변경할 때, CPU 내 재배치 레지스터에 다음에 실행할 프로세스 정보들로 교체를 하고 캐시를 비운다. 이 것을 Context Switching이라고 한다.
Context Switching이 일어날 때는 CPU가 일을 못한다.
때문에 컨텍스트 스위칭이 자주 발생하면 성능에 영향이 간다는 단점이 있다.
하지만 커널이 직접 관리하므로 특정 스레드가 Block이 되어도 다른 스레드들은 독립적으로 일을 할 수 있다.
사용자 수준 스레드는 스스레드를 관리하는 라이브러리로 인해 사용자 단에서 생성 및 관리되는 스레드이다.
그래서 커널이 따로 관리하지 않고, 커널이 이 스레드에 대해서 알지도 못하낟.
한 마디로 커널 레벨 밖에 있는 스레드이다.
스레드는 프로세스 단위라면서 어떻게 운영체제 레벨인 커널 안이 아니라 커널 밖에서 생성하여 이용할 수 있을까?
이는 실제 물리적으로 커널 밖에 있다는 것이 아니다. 커널 내부에 존재하지만 커널의 통제권 안에 없을 뿐이다
커널에는 '커널 모드'와 '사용자 모드' 2가지가 있고, 여기서 '사용자 모드'에서 동작하는 스레드가 사용자 수준 스레드인 것이다.
입출력 인터럽트가 발생하면 커널은 '사용자 모드'가 되어서 사용자 수준 스레드의 응답을 기다린다. 사용자 수준 스레드의 응답이 오면 다시 '커널 모드'로 변환되어 이어서 커널 스레드가 일 처리를 하게 되는 것이다.
사용자 수준 스레드
장점 : context switching이 없어서 커널 스레드보다 오버헤드가 적음 (스레드 전환 시 커널 스케줄러 호출할 필요가 없기 때문)
단점 : 프로세스 내의 한 스레드가 커널로 진입하는 순간, 나머지 스레드들도 전부 정지됨 (커널이 스레드의 존재를 알지 못하기 때문에)
커널 수준 스레드
장점 : 사용자 수준 스레드보다 효율적임. 커널 스레드를 쓰면 멀티프로세서를 활용할 수 있기 때문이다. 사용자 스레드는 CPU가 아무리 많아도 커널 모드의 스케줄이 되지 않으므로, 각 CPU에 효율적으로 스레드 배당할 수가 없음
단점 : context switching이 발생함. 이 과정에서 프로세서 모드가 사용자 모드와 커널 모드 사이를 움직이기 때문에 많이 돌아다닐 수록 성능이 떨어지게 된다.
출처
Tech Interview for developer
혼자 공부하는 컴퓨터 구조 + 운영체제
https://helloinyong.tistory.com/293