Node.js

21.02.16 스레드, 작업 처리 방식

슈팅스타제제 2021. 2. 16. 23:30

어제 스쳐지난 것들이 오늘 수업 내용이 될 줄이야...

덕분에 스레드 개념과 운영체제 작업 처리 방식에 대해서 깊이 탐구할 수 있었다. 

 

Synchronous, Asynchronous

-동기 처리 방식 : 작업을 순차적으로 처리하는 것

-비동기 처리 방식 : 순차적 X

 

✔ 여기서 생각해봐야 할 것은 융통성 있어 보이는 비동기 처리가 항상 좋은 것인가이다.

비동기적 처리에 있어서 가장 주의해야 할 점은 각 작업 단계의 순서를 보장할 수 없다는 것이다.

만약 1단계의 데이터가 2단계에서 사용된다면 1단계의 작업이 완료되기 전까지 2단계 작업이 호출되더라도 작업을 제대로 수행할 수 없다.

 

 비동기적 처리의 문제점을 약간 해결?

콜백 함수를 중첩시켜서 비동기적 함수 구조를 하나로 묶을 수 있고 각 작업들을 순서대로 실행하게 할 수 있다.

 

 동기적 처리가 가지는 이점!

동기적 처리는 변수나 다음 단계에서 이루어질 작업 상황을 쉽게 파악할 수 있다.

그리고 코드 작성 및 디버깅이 쉽다는 이점이 있다.

 

Blocking, Non-Blocking

-블로킹 : 이벤트 루프가 javascript가 아닌 작업을 하는 동안 nodejs 프로세스에서 javascript 실행을 막는 것

-논블로킹 : 막는 것 X

 

Nodejs는 싱글 스레드이므로 다른 작업이 완료된 후에 이벤트 루프가 javascript의 콜백 함수를 실행하게 한다. 그 외 javascript 가 아닌 작업이 일어나는 동안 동시에 실행되어야 하는 (비동기적 처리방식이라면) 작업을 수행하는 동안에는 이벤트 루프가 계속 실행된다.

 

Process, Thread

-Process : 프로그램이 실행되는 단위

-Thread : 프로세스 내에서 실행되는 세부 작업들의 단위

 

✔ CPU thread software thread를 구분하여 사용하자. CPU thread 수는 정해져 있지만 메모리가 허용하는 선에서 softwarethread수는 얼마든지 많아질 수 있다. 여기서 언급한 software thread이다!

 

Processthread의 가장 큰 차이점은

프로세스 자원을 공유하고 있는지에 대한 것이다. 하나의 프로세스 안에 있는 스레드는 프로세스 자원 즉, 프로세스 메모리, 신호, 다른 스레드 등을 공유하기 때문에 접근할 수 있다. 하지만 다른 프로세스 간에는 자원을 공유할 수 없다.

 

Single Thread, Multi-Thread

멀티스레드는 deadlock 방지(하나의 작업에 오류가 났을 때 이것 때문에 전체 작업이 중단되는 것을 방지!), race condition, visibility issue 등에 신경 써야 한다.

 

하나의 스레드로 두 가지 작업을 수행한 시간보다 두 개의 스레드로 두 가지 작업을 수행했을 때 걸리는 시간이 더 길 수 있다. 그 이유는 스레드 간의 작업 전환을 할 때도 시간이 걸리기 때문이다. 그렇기 때문에 작업 전환에 걸리는 시간까지 고려해야 한다. 또한, 스레드 작업 전환보다 프로세스 작업 전환은 더 긴 시간이 걸린다!!

 

CPU 만을 이용하는 계산 작업이라면 싱글스레드, CPU 이외의 자원(사용자로부터 데이터를 입력 받는다든지 네트워크에서 파일을 주고받는다든지 이런 외부기기와의 입출력을 필요로 하는 작업)을 이용하는 작업이라면  멀티 스레드가 유리하다.