-
asynchronous-synchronous programmingTodayILearned/TILWIL 2022. 5. 2. 02:31
노드의 동기, 비동기, 블로킹, 논블로킹 개념은 엄청 기본적인 상식이다.
하지만 잠깐 외웠다가도 금방 헷갈리는 개념이었는데,
동기, 비동기는 무엇과 동기되고 비동기된다는 뜻일까?
스레드*의 흐름이 공통자원의 데이터와 동기, 비동기 된다고 생각하면 될 것 같다.
동기라는 단어는 운영체제 강의에서 자주 들어본 단어이다.
운영체제에서 동기화에 대해서는 이렇게 설명한다.
공통 자원에 여러명이 동시에 접근할 때, 임계구역 문제가 발생한다.
이것을 해결하기 위해 프로세스/스레드를 동기화하는데 이 때 동기화 도구로 세마포어가 있다.
세마포어는 공통된 자원에 접근하는 여러 프로세스들을 관리하는 것인데,
예를들어 내 은행계좌(인데 천만원이 있는) 에서 A가 천만원을 빼간 후, B가 동시에 천만원을 또 출금하겠다고하면
은행앱은 당연히 둘 중 한명의 천만원만 빼주겠지만..
A,B 두개의 프로세스가 관리되지않는다면, 문제가 일어날 것이다.
세마포어는 이 프로세스들을 관리한다.
하나의 공통 자원에 하나의 프로세스의 출입을 허락하는 것이다.
동기화는 공통 자원에 대한 프로세스의 순서 제어라고 봐도되는 것 같다.
그럼 node.js에서의 동기화는 어떻게 받아들이면 좋을까.
node.js에서 실행되는 코드들은 이벤트루프의 큐를 이용해 이런 동시성 문제를 해결한다.
(자바스크립트가 싱글 스레드인 것과는 별개로)
코드 내에서 실행되는 호출 스택은 하나의 공통자원이다.
이벤트루프는 스택이 텅 빌 때까지 기다렸다가 큐에 쌓인 메세지들을 순서대로 스택에 쌓는다.
호출 스택을 여러개의 스레드가 동시에 접근하려고 한다면, 예를들어 스택에 A함수의 결과가 저장되지 않았는데
B함수가 스택에 접근해서 실행되려한다면 당연히 B함수가 문제를 일으킬 것이다.
아까 얘기한 은행 이야기와 비슷하다.
node.js에서의 동기화도 스레드와 프로세스의 동기화와 다르지 않은 것 같다.
공통자원인 스택에 접근하는 것을 관리하는것을 동기
그렇게 하지 않아도 되는 경우는 비동기라고 생각하면 될 것 같다.
그러니까,, 동기, 비동기의 개념에 대해 설명할 때 보통 블로킹, 논블로킹과 함께 설명되었던 이유도
이제는 좀 알 것 같은.. 하지만 굳이 묶어 설명이 되어야했나? 싶기도 하고..
이렇게.. ~같다 라고 쓰는 표현을 좋아하지 않지만, 어디서 명확하게 이게 맞다!
고 하는 글을 본 적이 없고, 컴퓨터 공학에서 사용되는 동기화에 대한 의미에 맞추어 생각한 내용이기 때문에
만약 이 글을 읽는 사람이 있다면 백프로 믿지 마시고 의심에 의심을 거치시길 바랍니다..
스레드 : 프로그램 내부에 흐르는 맥
https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop
'TodayILearned > TILWIL' 카테고리의 다른 글
Nest Cache (0) 2022.09.28 gRPC 동작순서 (0) 2022.08.12 왜 타입스크립트 마이그레이션을 해야할까 (0) 2022.05.01 클래스 개념과 프로토타입 개념 (0) 2021.12.15 백엔드 / 프론트 분리하면서 배운 것 (0) 2021.11.17