동기와 비동기
모르는 개념을 검색하면 자꾸 동기 비동기라는 용어가 나와서 공부해봤다.
동기 비동기?
동기 : 요청과 그 결과가 동시에 일어난다.
비동기 : 요청과 결과가 동시에 일어나지 않는다.
동기와 비동기는 어떤 작업을 처리할 때, 시각의 차이라고 할 수도 있다.
동기는 같은 목적의 행위가 동시에 이루어지며 (ex. 계좌이체에서의 출금과 입금)
비동기는 목적도 다르고 동시에 이루어지지도 않는다.
(ex. 나는 반죽을하고, 오븐은 구워서 빵을만든다.)
(ex 빵이 구워질때까지 가만히 기다린다면 나는 블록상태이다.)
(ex 빵이 구워지는 동안 다른요리를 한다면 나는 논블록 상태이다.)
Non-Blocking I/O 란?
자바스크립트는 기본적으로 싱글쓰레드 방식을 채택중입니다.
이 때 비동기적 처리(Asyncronous Processing)의 태스크들을 호출 스택에서 태스크 큐로 보내거나 태스크 큐로 부터 이벤트 루프를 통해 다시 스택으로 가져오는 I/O의 형태를 Non-Blocking 이라고 하죠.
이에 따라 실행 순서에 영향을 미치는 행위를 Non-Blocking I/O 라고 간단히 말할 수 있을 것 같습니다.
반대로 Blocking 의 경우 동기적 처리(Syncronous Processing)들에 대해 뒤에 작업들이 해당 작업으로 인해 지연되는 현상을 이야기 합니다.
이벤트 루프
-
자바스킙트의 런타임환경에서는 처리해야하는 Task들을 임시 저장하는 대기 큐가 존재한다.
이를 태스크큐(Task Queue)라고한다.
그리고 콜스택(Call Stack)이 비어졌을 때 태스크큐에 들어온 순서대로 수행한다. -
자바스크립트에서 비동기로 호출되는 함수들은 Call Stack에 쌓이지 않고 Task Queue에 enqueue된다.
예를들어 이벤트에 의해 실행되는 함수인 핸들러는 (당연히) 비동기로 실행되는데
핸들러는 콜스택이아닌 태스크큐에 들어가고, 콜스택이 비어있게 된 후에야 실행된다.
(콜스택이 비어있게 되면, 이벤트 루프에의해 하나의 이벤트가 dequeue된 다음 콜스택으로 들어가서 실행된다.)
따라서 이벤트에 걸려있는 핸들러는 절대 먼저 실행될 수 없다.
while(queue.waitForMessage()){
queue.processNextMessage();
}
이벤트루프를 설명하는 가상의 코드이다.
이런식으로 이벤트 루프는 현재 실행중인 태스크가 없는지,
태스크큐에 태스크가 있는지를 반복적으로 확인한다.
queue에 메시지, 즉 처리해야할 이벤트(태스크)가 있으면 while-loop안으로 들어가서 작업을 수행한다.
그리고 다시 queue로 돌아와 새로운 이벤트가 있는지 파악한다.
이처럼 태스크큐에서 대기하고 있는 event들은 한번에 하나씩 call stack으로 호출되어 처리된다.
'개인공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL 21일차_Twittler과제 (0) | 2021.02.08 |
---|---|
TIL 20일차_용어,개념정리 (0) | 2021.02.07 |
TIL 18일차_DOM (0) | 2021.02.05 |
TIL 17일차_알고리즘&CSS (0) | 2021.02.04 |
TIL 16일차_알고리즘 (0) | 2021.02.03 |