Dart나 JavaScript 같은 언어는 async, await라는 키워드를 가지고 있다.
처음 이 async라는것을 보고 멀티스레드와 동일한 개념인 줄 알았다.
계속 공부해보니 뭔가 잘못됐다는 느낌이 들어 이번기회에 제대로 공부하고 이해하였다.
아주 간단한 비유
간단히 말하면 aysnc는 task(일)의 순서에 관한 일이고 멀티스레드는 worker(작업자) 라고 생각하면 편하다!
먼저 알아야 할 사실
비동기 작업이라 하면 항상 나오는 작업들이 있다. 네트워크 요청, 파일시스템 reading, DB조회등 이런놈들은 CPU 자원 외에 다른 자원을 사용한다. 이 사실을 모르고 이해하려 하니 계속해서 이해를 하지 못했다.
아래는 GPT답변..
cpu자원말고 다른 자원들이 있었던거야? 네, CPU 자원 이외에도 컴퓨터 시스템에서 사용되는 다양한 자원들이 있습니다. 대표적인 예로는 다음과 같습니다. 메모리: 프로그램이 실행되는 동안 필요한 데이터와 코드를 저장하는 공간입니다. 메모리 자원은 CPU 자원과 함께 프로그램의 실행 속도에 영향을 미칩니다. 디스크: 데이터를 저장하는 데 사용되는 자원입니다. 디스크 자원은 파일 입출력 작업과 같은 I/O 작업을 수행할 때 사용됩니다. 네트워크: 컴퓨터 간에 데이터를 주고받는 데 사용되는 자원입니다. 네트워크 자원은 데이터 전송 속도와 지연 시간 등에 영향을 미칩니다. 그래픽 카드: 그래픽 처리를 담당하는 자원입니다. 게임이나 그래픽 프로그램 등에서 사용됩니다. 입출력 장치: 키보드, 마우스, 프린터 등과 같은 입출력 장치는 사용자와 컴퓨터 간의 상호작용을 위해 사용됩니다. 이러한 자원들은 각각의 특성에 따라 프로그램의 실행 속도와 성능에 영향을 미칩니다. 따라서, 프로그램을 개발할 때에는 이러한 자원들을 효율적으로 사용하는 것이 중요합니다. |
비동기란 무엇인가
다음과 같은 하루 일과가 있다고 하자
- 배달음식 시켜서 밥먹기(도착 30분, 밥먹기 1분)
- 집청소 하기(30분)
그리고 사람을 스레드로 비유하자
여기서 코드가 sync하게 동작한다면 다음과 같다
음식 도착 30분을 기다리고 밥을 1분동안 먹고 청소를 30분 한다. => 총 소요시간 61분
그런데 음식이 배달올 때 까지 기다릴 필요가 있나? 배달오는동안 청소를 하면 그만아닌가?
배달음식 시키지마자 청소시작, 그리고 도착하면 밥먹기 => 총 소요시간 31분
이것이 바로 비동기이다. 오래걸리는 일을 기다리지 않고, 바로 다음 작업을 하는것
단! 여기서 조건이 있다. 오래걸리는 일을 cpu가 아닌 다른 자원들이 해 주어야 한다.
배달은 배달원(외부자원)이 한다. 즉 내가(스레드, cpu자원) 하지 않는다. 그러기에 다른 작업을 바로 시작할 수 있는거다.
가령 자바스크립트에서 async 함수에 네트워크 요청(외부자원 사용)이 아닌, 복잡한 수학계산식(cpu자원 사용)을 넣으면 sync하게 동작한다!
멀티스레드란 무엇인가
집청소가 너무 힘들어서 친구 2명을 불러 총 3명이서 동기적으로 일을 한다고 하자.
위 상황은 멀티스레드이며 동기적이다.
1. 각자 배달음식을 시켜먹는다.
2. 청소를 나눠서 한다
각자 배달음식을 먹는데 31분, 청소를 세명이서 나눠서하니 10분. 총 41분이 걸렸다.
동기적으로 멀티스레드로 해버리니 한명이서 비동기로 하는것보다 못한 결과가 나와버렸다!
'기술면접' 카테고리의 다른 글
싱글톤 패턴이란 (0) | 2021.04.17 |
---|---|
파이썬 GIL 이란? (0) | 2021.04.17 |
[기술면접] CS기술면접 기초 질문들 모음 (0) | 2021.04.17 |
[기술면접] 프로세스와 스레드, 세마포어와 뮤텍스 차이 (0) | 2021.04.17 |
[기술면접] MVC 패턴이란 (0) | 2021.04.14 |
댓글