day14 🌕

장미·2022년 6월 27일
0

오늘의 성과

목록 보기
14/129

동기 비동기 정리 끝내기!!

오늘은 동기와 비동기에 대해 알아 볼 건데, 시작하기에 앞서 본 글은 내가 이해한 걸 토대로 작성했기 때문에 뇌피셜이 상당히 많이 들어가 있음을 알린다.

우선 동기와 비동기의 정의를 알아 보자.

  • 동기(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한 상태이기 때문에 동기와 동기화는 근본적으로 같은 뜻이라고 한다.
한국어로 보면 다른 것 같지만… 영어로 보면 그저 명사와 형용사의 차이일 뿐이다. 고로 둘은 같은 것을 뜻하는 게 맞다. 다만 한국어로 표현하는 과정에서 조금의 차이가 있을 뿐…

잘 알아두자.

➡️ 해당 내용은 여기를 참고했다.


참고 자료

  1. 우아한Tech, “멍토의 Blocking vs Non-Blocking, Sync vs Async”, https://youtu.be/oEIoqGd-Sns

  2. 짐코딩의 CODING GYM, “동기 비동기 차이”, https://youtu.be/sN4E9_u7xQk

  3. 쉬운코드, “비동기 프로그래밍, 비동기 I/O, 비동기 커뮤니케이션..”, https://youtu.be/EJNBLD3X2yg

  4. iOS개발자 앨런, “프로그래밍에서 동기/비동기 개념에 대한 가장 직관적인 이해”, https://youtu.be/zRJOte7TaPw


정보처리기사 공부 (~1과목까지 공부, 기출문제 1회 풀어보기)

1과목 3장까지 했다... 양이 왜 이렇게 많은 거지...?

2022년 04월 24일 기출문제

경과시간 : 00시간 55분 38초

1점 차이로 불합격인 거 실화냐 ㄱ-


알고리즘 - 정렬


운영체제 4챕터

+) 22. 07. 02. 정리한 지는 꽤 됐는데 뒤늦게 업데이트;;
day15 🌕 에 올렸다!!


계산기 🛠🛠

+) 22. 06. 28. 추가
day15 🌕 에 수정한 코드 올렸다.
차밍 어피치 이모티콘


코테 sql문 풀어보기

+) 22. 06. 28. 추가
분명 1문제만 풀려 했는데 정신 차리고 보니 GROUP BY 1문제까지 풀어버렸음... 어쩐지 안 끝나더라... 다 끝나야 한 문제 끝나는 건 줄 알았어 ㄱ-;;

SELECT

  1. 모든 레코드 조회하기
	SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID;
  1. 역순 정렬하기
	SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;
  1. 아픈 동물 찾기
	SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION = 'Sick'
  1. 어린 동물 찾기
	SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE NOT INTAKE_CONDITION = 'Aged';
  1. 동물의 아이디와 이름
	SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID
  1. 여러 기준으로 정렬하기
	SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME, DATETIME DESC;
  1. 상위 n개 레코드
	SELECT NAME FROM ANIMAL_INS WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)

SUM, MAX, MIN

  1. 최댓값 구하기
	SELECT DATETIME FROM ANIMAL_INS WHERE DATETIME = (SELECT MAX(DATETIME) FROM ANIMAL_INS)
  1. 최솟값 구하기
	SELECT DATETIME FROM ANIMAL_INS WHERE DATETIME = (SELECT MIN(DATETIME) FROM ANIMAL_INS)
  1. 동물 수 구하기
	SELECT COUNT(*) FROM ANIMAL_INS
  1. 중복 제거하기
	SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL

GROUP BY

  1. 고양이와 개는 몇 마리 있을까
	SELECT ANIMAL_TYPE, COUNT(*) FROM ANIMAL_INS GROUP BY ANIMAL_TYPE ORDER BY ANIMAL_TYPE
profile
김뉴비

0개의 댓글

관련 채용 정보