현재까지는 흐름(쓰레드가)이 하나뿐인 프로세스를 생각해 왔다.
그러나, 하나의 프로세스는 여러개의 쓰레드들을 컨트롤 할 수 있다.
프로세스가 한번에 여러개 동작 할 수 있었던 이유?
cpu가 program counter를 가지고 있고, 이를 context switching 할시에 바꿔주면 , 각각의 실횅할 프로세스의 context를 가지고 와서 실행 할 수 있다.
→이 때, 이 pc(program counter)즉, register set 정보만 별도로 유지 한다면, 하나의 프로그램(프로세스 안에서) 굳이 fork할 필요 없이, 실행 쓰레드만 달리 할 수 있다.
쓰레드란?
a lightweight process (LWP)
멀티 쓰레딩이 제공 될 때, 실제로 “CPU를 점유하는 기본 단위”이다
어떤 프로세스 안에 여러개의 쓰레드가 있다고 하면, 이 프로세스의 ID(PID)가 CPU를 점유하는 것이 아니라, 이 프로세스 내의 쓰레드 ID(TID)가 CPU를 점유한다.
TID 별로 program counter, register set, stack이 달라진다.
code / data / files 메모리 영역은 한프로세스 내의 쓰레드 들이 공유 한다.
멀티 쓰레드 하면 뭐가 좋을까?
멀티쓰레드의 장점 4가지
⇒ 멀티 쓰레드를 배우기 위해 멀티 프로세스를 배웠다고 해도 과언이 아니다!
자바는 언어및 자바 가상머신을 디자인 할 때 부터 쓰레드 모델을 도입해서, 쓰레드 기반으로 개발을 했다. API도 매우 쉽게 사용할 수 있게 되어있다. → 쓰레드의 생성 및 관리가 매우 용이 하다.
자바에서 쓰레드를 사용하는 방법 3가지
쓰레드라는 클래스를 상속 받는다. (권장 x)
⇒ 문제점 : 자바에서는 다중상속을 지원하지 않기 때문에, 쓰레드를 상속 받고 나면 다른 걸 상속 받을 수가 없다.
.run으로 바로 호출하는 것이 아니라, .start를 호출하고, 이 메서드가 .run을 호출 하는 방식으로 사용한다.
<실행 결과>
Implementing the Runnable interface (권장) ⇒ 가장 많이 쓰는 방법!
Runnable 인터페이스를 구현한 새로운 클래스를 정의하고
public void run() 메서드를 오버라이드 한다.
구현한 새로운 클래스를 Thread class의 생성자의 파라미터로 넘겨주면 쓰레드가 생성 된다.
익명 쓰레드 이용(Using the Lamda expression) →좀더 간편
새로운 클래스를 선언하지 않고,
람다 익스프레션으로 Runnable interface를 선언하자.
자바 1.8부터 함수형 프로그래밍을 지원하므로, 그 이상 버전에서부터 사용 가능. 실행결과는 위와 동일하다.
프로세스는 wait!
쓰레드는 join!
쓰레드 역시 프로세스의 status를 그대로 가지고 있다(ex> new, waiting, running …)
인터럽트를 걸어주면 exit로 빠져 나간다.
멀티코어 시스템에서는 멀티쓰레딩이 조금 더 복잡해졌다.
concurrency는 훨씬 향상되었다.
single-core : 쓰레드들이 시간의 흐름에 따라 interleaved 하게 실행된다.(시분할)
multiple-cores : 쓰레드들이 parallel하게 실행된다.
타임 쉐어링(시분할)과 동시에 parallel하게 실행된다.