※ 해당 글은 기록용입니다. 부족한 부분이 있을수도있습니다. 고칠점이있다면 댓글로 알려주세요.
무료하게 앉아있는 연말... 새로운 주제를 접하게되어 정리해보려고한다.
시작은 멀티쓰레드와 비동기를 동일시하는 주제에서 시작이다.
결론부터 말하자면 당연히 아니다. 워낙 스레드를 이용해서 비동기/동기개념이 다뤄지고있다보니 처음 접하는 사람은 스레드를 사용해서 해당개념을 이해하려고한다. 이래서 생기는 오류가 아닌가 싶다.
멀티쓰레드는 알다시피 하나 또는 여러개의 프로세스에서 여러 스레드를 사용해서 작업을 처리하는 방식이다.
비동기방식은 일이 들어온 순서에따라 결과도 순서대로 처리되는것이 아니라, 일을 들어온 요청대로 다 받아서, 그냥 완료되면 완료되었다고 보고하는것이다.
잘못된 개념으로는 비동기방식으로 일을 처리하던중, 다른 작업 요청이 오면 그 요청을 실행하면서, Timeout된 요청은 다른 스레드가 받아서 실행한다는 것인데, 이 비유에서 이런 오류가 많이 발생하는것같다.
싱글 스레드 상황으로 가정해보자.
일례로, Node.js는 싱글스레드이면서 비동기작업을 진행한다고한다.
Node.js에서 작업을 실행중에 Timeout요청이 발생했다고 하자.
그럼 이 작업은 libuv(Node.js의 I/O작업 담당 스레드)가 백그라운드로 실행한다.
Node.js는 싱글스레드가 맞긴하다. 이는 근데 관점의 차이다.
Node.js = Node.js + Libuv
Node.js는 이벤트 루프, 자바스크립트 메인 코드 실행을 담당하는 메인스레드가 하나 존재한다. 이 관점으로 보면 맞다.
Node.js는 메인 스레드외에 I/O요청을 담당하는 스레드 풀이 존재한다. 이게 Libuv 라이브러리다.
Libuv 라이브러리는 메인스레드로부터 떨어져나온 작업을 백그라운드로 실행한다. 스레드 4개를 사용한다.
크게 보면 총 5개의 스레드를 사용하기때문에, 엄밀히 말하면 싱글스레드라고 말할수없다.
흔히 싱글스레드라고 말하는건 이벤트루프를 처리하는 메인스레드 하나만 말하는 경우이다.
보통 이렇게 말하는 사람은 다 알고 쓴다... 하지만 나같은 JS가 주언어가 아닌사람은 당연히 모른다.
돌아가서 Node.js에대한 이야기말고, 진짜 스레드가 하나만 있다고 가정하자.
작업 A를 실행중에 Timeout요청을 받고, 작업 B를 실행한다. 남은 작업A는 담당해줄 스레드가 없다. 그럼 이 작업은 그냥 작업B가 끝날때까지 유지되는것인가?
내생각에는 그냥 놔둬도 비동기라는 개념이 맞다고 생각한다. 비동기는 그냥 일을 요청하면 다 받기때문이다. (A -> B -> B완료 -> A완료) 그냥 이렇게 실행해도 비동기기때문.
그래도 진짜 맞는지 조사를 해봤다.
여기서 고려하는 사항은 백그라운드 작업이나, 외부 api를 지원하지않는 상황이다. 이때는 블로킹/논블로킹 관점으로 들어가야할것같다.
여기서부터는 다음에...