프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다.
프로세스 는 실행중인 프로그램으로 실행에 필요한 데이터+메모리+쓰레드로 구성되어 있다.
쓰레드는 실질적으로 자원을 가지고 일을 수행하는 주체를 말한다. 이 스레드는 경량화된 프로세스라고도 하는데, 부모 프로세스의 자원을 이 쓰레드들이 공유자원(코드,데이터,힙 영역)을 사용하고, 각자 stack 영역을 갖는다.
멀티 태스킹은 여러개의 프로세스를 동시에 실행하는 것
멀티 프로세스
멀티 쓰레딩은 하나의 프로세스에서 여러개의 쓰레드를 동시에 실행하는 것
테코톡에서 사용한 예시
Internet Explorer 사용시, 여러 탭을 띄워 작업을 하다가 한 탭이 문제가 생겨 작업이 중지되면, 다른 탭들도 모두 영향을 받아 닫혀버린 경험이 있을 것임
왜냐면 쓰레드로 긴밀하게 연결이 되어 있으니까
Google chrome 사용시, 여러 탭을 띄워 작업을 하다가 한 탭이 문제가 생겨도, 다른 탭들이 영향을 받지 않음
왜냐면 프로세스로, 조금 비효율적일지라도, 각자도생을 하기때문
컨텍스트 스위칭을 통해서 작업이 동시에 일어나는 것처럼
여기서, CPU(core)는 한번에 하나씩의 일만을 처리할 수 있기 때문에, 여러개의 일을 동시에 처리하는 것처럼 보이게하기 위해서 번갈아가면서 일을 처리한다. 그래서 쓰레딩의 개수와 성능이 비례하지 않는다.
멀티코어는 한번에 하나씩만 일을 처리할 수 있는 이 코어가 여러개 있다는 말이다. 그래서 코어마다 여러 개의 작업을 나누어 배분하는 병렬처리가 가능하다.
멀티 태스킹을 하게되면, 싱글 코어에서는 병행적으로 처리한다. (번갈아가면서)
하지만 멀티 코어에서는 스레드가 각 코어로 배분되어 병렬적으로 처리가 가능하다.
쓰레드를 생성하는 방법은 두가지가 있다.
쓰레드 클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, 보통 인터페이스 구현을 한다.
쓰레드를 생성할때는 start()를 호출해야 쓰레드가 실행된다.
start()를 호출하면, 일단 실행대기 상태에 있다가 자신의 자례에 실행된다.
그리고 한번 실행이 종료된 쓰레드는 다시 실행될 수 없다. 만일 하나의 쓰레드를 두번 이상 호출하면 IllegalThreadStateException이 발생한다.
run()은 쓰레드를 실행시키는 것이 아니라, 클래스에 선언된 메소드를 호출시키는 것이다.
start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한다음에 run()을 호출하여 생성된 호출스택에 올린다.
스케줄러는 우선순위를 고려하여 실행순서와 실행시간을 결정한다. 주어진 시간에 작업을 마치지 못한 쓰레드는 다시 대기상태로 올라간다. 수행이 종료된 쓰레드는 호출스택이 비워지고 사라진다.
이때, main이 종료되어도 쓰레드가 남아있다면 프로그램이 종료되지 않는다. 즉, 프로그램이 종료된다는 것은 쓰레드가 없다는 것이다.