JavaScript EventLoop 에 대해 알아보다가 결국 운영체제의 Process, Thread 개념까지 와버렸다.. 알고 가야 이해가 될 것 같아서 정리해본다. 그 전에 프로세스와 스레드가 무엇인지에 대해 알려면 관련 용어들을 정리할 필요가 있다.
파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것을 말한다.
프린터, 키보드, 마우스 등 과 같은 입출력 장치와 데이터를 주고받는 것을 말한다..
=> CPU의 사용률이 좋지 않다.
이를 해결하기 위해 여러 개의 프로그램을 메로리에 올려놓고 동시에 실행시키자 라는 해결책이 나오게 되었다.
하나의 프로세스에 대해 IO 작업이 발생하면 대기하고 있던 다른 프로세스가 CPU에서 실행된다는 해결방안 인 것이다.
이 해결책에 대한 예를 들어보자.
p1, p2 라는 프로세스가 있다고 가정하자. CPU에서 p1이 실행되다가 p1이 IO 작업을 해야되는 상황이 오면 CPU는 다른 프로세스 p2를 실행시킨다. 이 때 또 p2가 IO작업을 해야하는 상황이 왔다. p1의 IO 작업이 끝났다면 다시 p1을 실행시키고 p1, p2 둘다 IO 작업을 수행중이라면 CPU는 아무것도 하지 않게 된다. 기존의 단일 프로세스 시스템보단 CPU의 사용률이 올라갔다고 볼 수 있다!
CPU의 사용시간이 길어지면 다른 프로세스는 계속 대기하게 된다.
위의 예를 들어보자
=> p1 이라는 프로세스가 CPU를 점유하고 계속 실행 중 이다. 위에서 언급했던 멀티프로그래밍, 단일프로세스 개념으로 접근해보면 프로세스가 IO 작업을 수행하러 가거나 실행이 끝났을 경우, 즉, CPU 점유가 없을 경우, 다른 프로세스가 실행 가능하다. 그러므로 p2라는 p1과 다른 프로세스는 계속 대기를 할 수 밖에 없는 것이다.
=> 하나의 CPU에서 만약 하나의 프로세스가 계속 실행중이라면 다른 프로세스는 계속 실행 대기를 할 수 밖에 없다.
위와 같이 CPU의 시간을 쪼개는 것을 멀티태스킹 이라고 한다.
멀티 프로그래밍과 같이 여러 프로그램을 실행 시킨다는 것과는 유사하지만 CPU 시간을 잘게 쪼개서 프로세스를 실행시킨다는 것과는 다른점이있다.
멀티 태스킹은 프로세스의 응답시간을 최소화 시키는데에 목적이 있다.
사용자의 입장에서는 동시에 여러프로그램을 실행시킨다는 생각을 줄 수 있다.
물론 여러 프로세스를 만들어서 실행시킬 순 있겠지만 프로세스의 컨텍스트 스위칭은 아주 무거운 작업이다.
또한 프로세스끼리는 데이터 공유가 까다롭다.
왜냐하면 프로세스는 독립적인 메모리 공간을 가지기 때문이다.
=> 위의 에로사항을 고려해서 나온 것이 바로 스레드(Thread) 이다!
CPU에서 실행되는 단위이다.
예전에 CPU에서 실행되는 단위는 프로세스 였다.
같은 프로세스의 스레드들끼리는 컨텍스트 스위칭이 가볍다.
같은 프로세스의 스레드끼리 데이터(메모리 영역) 공유가 가능하다.
프로세스는 한 개 이상의 스레드를 가질 수 있다.
=> 스레드는 한 프로세스 안에서 동시의 작업을 위해 등장하였기 때문에 프로세스는 한 개 이상의 스레드를 가지는것이 당연하다!
=> 스레드의 메모리 영역을 살펴보면 다음과 같이 나뉘어져 있다.
=> 다음번에 실행되야 될 명령들의 메모리의 주소를 가리킨다.
=> 일상생활과 대조하면 어떤 회사의 작업자 라고 생각하면 편할 것 같다!
만약 단순 무식하게 코어는 많을 수록 좋지 하고 4개, 5개 이상 적재된 PC를 샀다고 가정해보았을 때, 그 PC로 하는 작업이 단순 게임, 문서 작업이라면 인건비 낭비 라고 생각하면 이해가 쉬울 것 같다!