[TIL] 20220124

박창현·2022년 1월 24일
0

TODAY I LEARNED

목록 보기
53/53

노드

자바스크립트 원리

호출스택, 이벤트 루프 태스크 큐, 백그라운드.

기본적으로 런타임 구조는
호출스택 | 백그라운드 | 태스크 큐 | 이벤트 루프로 이루어져있다.

호출스택은 LIFO 구조로 annoymous라는 전역 컨텍스트가 제일 먼저 쌓이고 그다음부터 코드들이 쌓인다. 그리고 실행은 역순으로 진행된다.
그리고 비동기로 작동할때에는 백그라운드에서 이벤트가 발생하고, 이벤트에 조건이 만족되어 콜백함수가 실행되면 이때 태스크 큐로 보낸다. 태스크 큐에서는 호출스택에 아무것도 없으면 이벤트루프를 통해 호출 스택으로 이동해 실행된다. 이로인해 호출 스택에 무언가 있다면 그 함수들이 모두 실행되야 이벤트루프를 통해 전달된다는 특징이 있다. 그렇기에 만약 setTimeout(~~~,3000)를 실행하더라도 완벽히 3000밀리세컨드 후에 실행된다는 보장을 할 수없다.

논 블로킹 I/O

논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음작업을 수행하는 것이다.
자바스크립트상에서 돌아가는 것이 아닌 I/O 작업은 동시에 처리될 수 있다.
하지만 블로킹이 가능한 작업이더라도, 논 블로킹 방식으로 처리하지 않으면 블로킹 방식으로 처리되기에 이를 유의하여 코딩해야한다.

블로킹 형식

function longRunningTask(){
  //오래걸리는 작업~~
  console.log("done");
}

console.log("start");
longRunningTask();
console.log("END");
결과는
----------------
start
done
END

논 블로킹 형식

function longRunningTask(){
  //오래걸리는 작업~~
  console.log("done");
}

console.log("start");
setTimeout(longRunningTask, 0);
console.log("END");
결과는
----------------
start
END
done

즉, setTimeout(콜백함수, 0)을 이용해 논 블로킹을 만드는 방법중 하나이다.
(setTimeout의 딜레이값을 0 으로 설정하더라도, 기본적인 지연시간이 있다. HTML5 브라우저는 4ms, node에서는 1ms)

논 블로킹 개념을 보면서 이전에 얼핏 학습한 동기 비동기가 떠올라서 차이점에 대해 알아봤다.
[논 블로킹, 블로킹 | 동기, 비동기 ] 이 4가지의 차이점에 대해서는
https://cotak.tistory.com/136, https://evan-moon.github.io/2019/09/19/sync-async-blocking-non-blocking/#동기-방식--논블록킹-방식 두 개의 블로그를 읽으면서 어렴풋이 이해했다.

블로그 내용을 간단히 요약해서 내 해석대로 풀어내자면
개념적인 측면으로 봤을때 블로킹, 논 블로킹은 프로세스의 사용권(?)과 관련되어있고 동기, 비동기는 수행순서와 관련이 있다.
두 블로그에서 야자감독과 학생, 사장과 직원의 입장에서 풀어냈는데, 난 야자감독과 학생의 입장에서 정리.

동기 + 블로킹 => 감독과 학생이 동시에 들어오고 야자가 끝날때까지 감독은 학생들의 야자시간이 끝났나 안끝났나만 계속 확인한다. 그리고 야자시간이 끝나면 퇴근한다. (여기서 감독은 시간을 확인하는 것 외에는 아무것도 할수없는 즉, 관리감독말고는 다른 행동을 할수 있는 권리(표현이 이상하긴 하지만 프로세스의 사용권이 뺏겼다는 것을 뜻함)가 없다.

동기 + 논 블로킹 => 감독과 학생이 동시에 들어오고 야자가 끝날때까지 감독은 핸드폰도 보고 밖에도 나가는 등 자기가 원하는 걸 모두 할 수 있다.
하지만 계속 야자가 끝났는지는 확인을 해야하고, 야자가 끝나야지만 퇴근이 가능하다.

비동기 + 논 블로킹 => 야자가 시작하면 학생들은 들어와서 공부를 한다. 감독은.. 자기가 감독이 맞나싶을정도로 무책임하게 출석만 부르고(아니면 출석조차도 안부르고) 퇴근한다. 야자가 진행중인지 끝났는지 관심도 없다.

이렇게 분류할 수 있다.

(https://nodejs.org/ko/docs/guides/ 의 내용도 시간나면 보자.)
(http://latentflip.com/loupe/ 이벤트루프 시각적으로 표현)

profile
개강했기에 가끔씩 업로드.

0개의 댓글