동시성(Concurrency)과 동기(Synchronous)의 차이

infoqoch·2021년 4월 28일
1

개발

목록 보기
4/6

들어가며

컴퓨터 사이언스, AJAX, 멀티스레드 등 공부를 하면 동시성(Concurrency), 동기성(Synchronous)에 대한 이야기가 나온다. 처음에 봤을 때 두 개는 같은 의미라 생각했다. 같은 것으로 이해하다 보니까 정보가 뒤죽박죽이었다. 그래서 이번 기회에 정리해봤다.

동시성이란? 스레드와 cpu의 입장에서 보자.

  • 직렬 Serial : 스레드가 하나일 때
  • 병렬성 Parallelism : 다수의 스레드가 동시에 작동할 때 : 멀티 스레드 + 멀티 프로세서(cpu)
  • 동시성 Concurrency : 하나의 cpu에 다수의 스레드가 작동할 때. 시분할.

동기성, 비동기성이란? chain 관계를 생각하자.

  • 일단, 다음의 영상을 보는 것을 추천한다. https://www.youtube.com/watch?v=m0icCqHY39U&feature=em-comments
  • 영상의 예에서 나오는 것처럼 동기란 일종의 절차를 중시하는 행위이다. 예를 들면 나는 집에서 청소를 할 때 물건을 정리하고 -> 큰 쓰레기를 버리고 -> 진공 청소기로 밀고 -> 걸레로 닦는다. 만약 어떤 사람이 자신이 걸레를 빨았다고, 청소기를 밀기 전에 걸레로 닦아 버리면 어떻게 될까? 일단 걸레에 너무 많은 쓰레기가 묻을 것이고, 진공청소기는 흠뻑 젖어서 어떤 먼지도 빨아드릴 수 없을 것이다.
  • 동기적 방식의 종료는 다른 작업으로 연계된다. 물건을 정리하면 쓰레기를 버린다. A.시작 -> A.종료 -> B.시작. 그러므로 동기가 "요청"과 "응답"의 시기가 일치함을 이해할 수 있다. 요청과 응답 과정은 하나의 과정이므로 분해될 수 없다. 그리고 응답이 있어야지 다른 요청으로의 작업이 계속 진행 가능하다.
  • 한편, 요리를 할 때는 매우 부산스럽게 한다. 먼저 밥이 가장 오래걸리므로 밥을 씻고 안친다. 밥이 되는 동안 식재료를 다듬고 국을 만들거나 요리를 한다. 내가 하는 요리와 국에 따라 밥이 먼저 될 수도 있도 있고 아닐 수도 있다. 어찌됐든 밥은 밥대로 국은 국대로 각자 작업을 한다. 그러므로 비동기성은 멀티스레드와 연관된다.
  • 비동기성이란 다수의 작업이 동시에 일어날 수 있다는 의미이며, 각 작업의 절차가 그렇게 중요하지 않는다. 영상에서 나오는 것처럼 작업이 끝나면 그것은 일종의 "메시지"와 함께 종료한다.
  • 결론적으로 동기성과 동시성은 전혀 다른 의미이다. 동시성은 다수의 스레드가 작동함을 의미하기 때문에 오히려 비동기성과 유사하다고 볼 수 있다.

블락과 논블락? 스레드의 작업에 영향을 미치는가?

  • 동기와 블락이 섞이면 어떻게 될까? 절차적 작업이 다른 작업으로부터 방해받지 않는다. 공부를 할 때 방문을 잠그고 귀에 노란색 귀마개를 끼고 공부를 할 수 있을 테다.
  • 동기와 논블락이 섞이면 어떻게 될까? 논블락은 다른 작업을 막지 않는다는 의미이다. 어떤 사람은 공부를 할 때 카카오톡도 보고 이어폰으로 음악도 듣는다. 그러나 공부라는 절차는 훼손되지 않고, 책을 읽고 -> 문제를 풀고 -> 오답을 체크하는 과정은 유지될 것이다.
  • 비동기와 논블락이 섞이면 어떻게 될까? 오늘 책상에서 해야할 일이 친구와 약속을 잡는 것과 정보처리기사 모의고사 1회를 푸는 것이이라 가정하자. 먼저 친구에게 약속날을 잡고, 모의고사를 풀다가, 친구에게 연락이 오면 답장을 했다가, 모의고사 푼 것과 해답을 비교한다. 둘 중 무엇이 끝나도 상관 없다. 어찌 됐든 두 작업이 끝나면 책상에서 오늘 해야할 일은 끝난다.

첨언... 나에게 AJAX란?

  • 나에게 AJAX란 싱글페이지를 구현하기 위한 도구였다. 새로고침 없이 REST API를 통해 데이타를 가져오니까. 나는 이런 싱글페이지가 비동기라고 이해했다. 그러나 그렇지 않았다.
  • 자바스크립트의 경우 멀티스레드를 지원하지 않는 유일한 하나의 스레드만 존재한다. 하지만 WebAPI의 경우 멀티스레드를 지원한다. AJAX는 WebAPI를 활용하여 비동기식 작업을 할 수 있도록 도와준다. 이러한 함수를 콜백함수라 한다. 그러므로 싱글 페이지는 비동기라 볼 수 없다. 그냥 클라이언트 사이드 렌더링이라 봐야 할거다.

참고 자료 :
https://medium.com/@ahaljh/%EB%8F%99%EC%8B%9C%EC%84%B1-%EA%B4%80%EB%A0%A8-%EA%B0%9C%EB%85%90-d2f3e6a62b99 sync의 어원부터 살펴봐서 이해하기 좋았다.
https://www.youtube.com/watch?v=m0icCqHY39U&feature=em-comments 동기성 / 비동기성에 대해 알 수 있어서 좋았다. 자바스크립트의 스레드, web api의 멀티스레드 개념이 다르다는 것을 알게 됐다. promise, 콜백함수가 뭔지도 이해할 수 있었다. 매우 유익했다.

profile
JAVA web developer

0개의 댓글