쓰레드에는 2가지가 있습니다. 유저 쓰레드와 커널 쓰레드.
커널의 개입 없이 사용자 영역의 쓰레드 라이브러리를 활용하는 방식입니다. 일종의 가상 쓰레드를 생성하여 실행 흐름만 사용하는 방식입니다.
커널이 관리하는 쓰레드입니다. OS 스케쥴러의 최소 단위가 바로 커널 쓰레드입니다.
- 사용자 스레드 전환은 왜 오버헤드가 적은가?
: 커널을 호출하지 않기 때문에 오버헤드가 적습니다.
- 디스크 I/O는 어떤 쓰레드로 구현하는게 유리한가?
: 시스템 콜을 자주 호출하기 때문에 동시에 실행되는 것처럼 보이게 하기 위해서 커널 쓰레드를 사용하는 것이 유리합니다.
사용자 쓰레드들을 하나의 커널 쓰레드로 묶어버리는 방법입니다.
하나의 유저 쓰레드를 하나의 커널 쓰레드에 매핑하는 방식입니다.
여러개의 user-level 쓰레드들을 여러개의 커널 쓰레드에 매핑하는 방식입니다.
Many-to-Many + One-to-One 느낌의 방식입니다.
쓰레드를 생성, 관리기 위한 API를 제공합니다. 유저레벨, 커널레벨 두가지 구현이 존재합니다.
Posix Thread 입니다. 유저/커널 쓰레드 생성 둘 다 지원합니다. 하지만 일반적으로 유저 쓰레드 생성에 주로 사용합니다.
Specification, not implementation
C언어로 pthread를 사용하는 예시입니다. 특정 함수를 별도의 실행흐름으로 돌립니다. 이처럼, 대부분 함수를 쓰레드로 넘기는 방식을 주로 사용합니다.
쓰레드 함수입니다. 여기서 눈여겨 볼 점은, sum 함수의 선언이 없다는 점 입니다. 프로세스의 전역 변수로 선언되어 있기 때문에 별도의 선언 없이도 사용할 수 있습니다.
자바의 경우, JVM에 의해 관리됩니다. 자바에서의 쓰레드 생성은 Thread 클래스를 상속받은 후 Runnable 인터페이스를 구현하므로써 생성할 수 있습니다. 예를 들어
이런식으로! 아래는 오오오래전에 라이노 엔진 기반으로 작성했던 라이브러리의 일부 코드입니다.
Thread 를 새로 할당하고, Runnable을 넘겨주므로써 쓰레드를 생성한다는 것을 알 수 있습니다.
명시적으로 쓰레드를 생성하기 보다는, Executor 인터페이스를 통해 생성하는 것도 지원합니다.