오늘은 동기와 비동기에 대해 알아 볼 건데, 시작하기에 앞서 본 글은 내가 이해한 걸 토대로 작성했기 때문에 뇌피셜이 상당히 많이 들어가 있음을 알린다.
우선 동기와 비동기의 정의를 알아 보자.
동기(Synchronous)
여러 개가 있을 때 서로 시간적인 관계가 일치해 있는 것을 표시한다.
비동기(Asynchronous)
규칙적인 시간 관계가 없는 것으로, 랜덤한 사상(事象)의 출현을 말하고, 프로그램 실행에서는 명령 순서 예측이 불가능한 것.
이렇게 정의만 보면 그게 뭔데 이놈아! 싶지만 생각보다 엄청 쉽게 정리할 수 있다.
나도 좋아하고 모두가 좋아하는 한 줄 요약으로 설명해 보자면,
동기는 스레드에게 작업을 시키고 끝날 때까지 기다렸다가 작업이 끝나면 다음 일을 진행하고,
비동기는 작업이 끝나는 걸 기다리지 않고 다음 일을 진행하는 매정한 놈이란 거다.
흔하게 쓰이는 예로 설명하자면, 동기는 카페에서 커피를 주문할 때 한 줄로 서서 한 번에 한 사람만 주문 가능한 것에 비유할 수 있다.
이 때 뒷사람은 앞사람의 커피가 나올 때까지 주문도 못 하고 그냥 가만히 서서 기다리기만 해야 한다.
…이 방식은 너무 답답하고 오래 걸려서 좀 비효율적인 것 같다.
그럼 비동기는 어떨까?
비동기는 현실 세계에서의 카페와 유사하다.
손님에게 주문을 받으면 결과를 진동벨로 알려주는 것이다. 그럼 손님은 알림을 받기 전까지 자유롭게 움직이면서 기다릴 수 있고, 뒷사람은 그동안 기다릴 필요가 없다. 또한, 직원이 여러명이라면 손님의 주문 순서와 상관없이 먼저 제조한 음료를 전달할 수 있을 것이다.
이렇게 일을 순차적으로만 처리할 수 있는 것을 동기라고 하고
순서 상관없이 한 번에 여러가지 일을 할 수 있는 걸 비동기라 한다.
그럼 비동기가 곧 멀티스레딩 아닌가? 하는 생각도 들 수 있을 것이다.
하지만 그건 아니다.
멀티스레딩은 비동기 프로그래밍 방식의 한 종류다.
즉, 멀티스레딩이 비동기 프로그래밍 방식(여러 작업을 동시에 실행)에 포함되어 있기 때문에 같다고 느껴지는 것이다.
결론을 말하자면 유사하긴 하나 완전히 같은 건 아니라는 거다.
그럼 비동기 프로그래밍을 멀티스레드로 처리할 경우 어떻게 될까?
그럴 경우 context switching 비용이 증가하고 race condition이 발생할 것이다.
그래서 이를 잘 조절해야 될 것이다.
멀티스레드와 달리 한 놈이 여러 일을 하는 걸 non-block I/O라고 한다.
Blocking: 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것.
Non-blocking: 작업이 끝날 때까지 기다리지 않는 것. (다른 주체의 작업에 관련없이 자신의 일을 한다.)
Blocking과 Non-blocking, Sync와 Async의 개념이 비슷해서 좀 헷갈리는데, Blocking 쪽은 제어의 관점에서 바라보는 것이고, Sync 쪽은 순서와 결과(처리)의 관점에서 바라보는 것이라고 생각하면 이해하기 쉬워진다.
즉, non-block I/O로 처리하면 스레드를 적게 쓰면서도 효율적인 프로그래밍을 할 수 있다는 소리다.
앞서 내가 동기는 답답하고 느리다 했는데, 이것은 곧 자원을 비효율적으로 쓴다는 말과 같다.
하지만 동기에게도 장점은 있다. 설계가 단순하다는 것이다.
반대로 비동기는 자원을 아주 효율적으로 쓰는 대신 설계가 어렵고 복잡하다.
결국 동기와 비동기는 누가 더 좋다 나쁘다가 아니라, 프로램을 짤 때 적절한 상황에 따라 골라 쓸 수 있는 하나의 “방법”일 뿐이다.
결과를 받을 때까지 기다려야 할 때(계좌 이체 등)도 있을 것이며 기다리지 않아도 될 때(비대면으로 배달한다든가)가 있을 것이다.
그러므로 무조건 동기를 써야 한다!! 비동기를 써야 한다!! 이럴 필요 없이 그냥 알아서 잘 골라 쓰면 되겠다.
이건 그냥 개인적으로 궁금했던 건데, 본 글을 정리하면서 그럼 동기와 동기화는 같은 걸까? 라는 의문이 들었다.
찾아보니 동기화(Synchronization)는 서로 다른 상태를 같게 만드는 것이라고 한다.
아이튠즈로 아이폰 동기화하는 그런 거 말이다.
결국 동기 안에 동기화가 있는 것이기 때문에 동기가 더 넓은 의미를 가진다.
비동기 안에 멀티스레딩이 포함된 것처럼.
결론은… 같지 않다는 거다. 포함은 되어있지만 엄연히 다른 용어다. 혼동하지 말자!
+) 22. 07. 04.
추가로 공부하다 수정한다.
동기 안에 동기화가 포함되어 있는 건 맞다.
하지만 둘은 다른 게 아니라 같은 거다!! 내가 잘못 알고 있었다.
Synchronization은 Synchronous한 상태이기 때문에 동기와 동기화는 근본적으로 같은 뜻이라고 한다.
한국어로 보면 다른 것 같지만… 영어로 보면 그저 명사와 형용사의 차이일 뿐이다. 고로 둘은 같은 것을 뜻하는 게 맞다. 다만 한국어로 표현하는 과정에서 조금의 차이가 있을 뿐…
잘 알아두자.
➡️ 해당 내용은 여기를 참고했다.
참고 자료
우아한Tech, “멍토의 Blocking vs Non-Blocking, Sync vs Async”, https://youtu.be/oEIoqGd-Sns
짐코딩의 CODING GYM, “동기 비동기 차이”, https://youtu.be/sN4E9_u7xQk
쉬운코드, “비동기 프로그래밍, 비동기 I/O, 비동기 커뮤니케이션..”, https://youtu.be/EJNBLD3X2yg
iOS개발자 앨런, “프로그래밍에서 동기/비동기 개념에 대한 가장 직관적인 이해”, https://youtu.be/zRJOte7TaPw
1과목 3장까지 했다... 양이 왜 이렇게 많은 거지...?
2022년 04월 24일 기출문제
경과시간 : 00시간 55분 38초
1점 차이로 불합격인 거 실화냐 ㄱ-
+) 22. 07. 02. 정리한 지는 꽤 됐는데 뒤늦게 업데이트;;
day15 🌕 에 올렸다!!
+) 22. 06. 28. 추가
day15 🌕 에 수정한 코드 올렸다.
+) 22. 06. 28. 추가
분명 1문제만 풀려 했는데 정신 차리고 보니 GROUP BY 1문제까지 풀어버렸음... 어쩐지 안 끝나더라... 다 끝나야 한 문제 끝나는 건 줄 알았어 ㄱ-;;
SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID;
SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick'
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE NOT INTAKE_CONDITION = 'Aged';
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID
SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME, DATETIME DESC;
SELECT NAME FROM ANIMAL_INS WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
SELECT DATETIME FROM ANIMAL_INS WHERE DATETIME = (SELECT MAX(DATETIME) FROM ANIMAL_INS)
SELECT DATETIME FROM ANIMAL_INS WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
SELECT COUNT(*) FROM ANIMAL_INS
SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL
SELECT ANIMAL_TYPE, COUNT(*) FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE