[OS] 동기 / 비동기, blocking / non-blocking

mallin·2022년 6월 27일
0

OS

목록 보기
1/1
post-thumbnail

한줄 요약
sync, async 👉 현재 작업의 응답과 다음 작업의 요청이 동시에 일어나는가
blocking, non-blocking 👉 호출된 함수가 제어권을 바로 주는가

개발을 하다보면 동기, 비동기라는 말에 대해서 많이 듣게 된다.
하지만 들을 떄마다 그게 뭐더라 ... 하고 개념을 혼동하거나 헷갈릴 때가 진짜 너무너무 많은데, 그래서 동기와 비동기 그리고 함께 빼놓을 수 없는 blocking 과 non-blocking 에 대해서 알아보려고 한다.

https://media.giphy.com/media/l378rhA6c1QhJDgbu/giphy.gif

동기(Synchronous), 비동기(Asynchronous)

동기를 Synchronous 의 앞글자를 따서 Sync,
비동기를 Asynchronous 의 앞을 따서 Async 라고 한다.

동기 (Synchronous)


Synchronous 의 뜻을 검색해봤을 때 네이버에 검색해봤을 때 동시 발생[존재] 하는 으로 나온다.
그렇다면 어떤게 동시에 일어나는지가 중요한데, 컴퓨터 공학에서는 현재 작업의 응답과 다음 작업의 요청을 말한다.
즉, 컴퓨터 공학에서 동기는 현재 작업의 응답과 다음 작업의 요청이 동시에 일어나는 것이다.

동작하는 과정

  • 작업1 이 프로세스를 수행하는 동안 다른 작업은 실행되지 않고 작업1 이 끝날 때까지 기다린다
  • 작업1 이 모든 프로세스를 끝낸 경우 다른 작업을 실행한다
  • 작업의 수행 결과 및 종료를 작업1 이 신경쓰고 끝난 경우 작업2 에 작업을 하라고 알려준다

비동기 (Asynchronous)

그러면 비동기는 무슨 의미일까 ?

Asynchronous 의 뜻을 검색해봤을 때에는 synchronous 와 반대로 동시에 존재[발생]하지 않는 인걸 알 수 있다.
동시에 존재하지 않는 걸 현재 작업의 응답과 다음 작업의 요청이라고 했을 때
컴퓨터 공학에서 비동기는 현재 작업의 응답과 다음 작업의 요청이 동시에 일어나지 않는 것 즉, 동기의 반대 의미를 가지고 있다.

동작하는 과정

  • 동기와는 다르게 작업1 이 프로세스를 수행할 때 작업2 도 동시에 프로세스를 수행할 수 있다
  • 작업은 로직이 완료되었는지 혼자 신경쓰고, 처리한다

blocking, non-blocking

blocking과 non-blocking은 주로 IO의 읽기, 쓰기에서 사용된다.

blocking

블로킹, 저지 현상 이라는 의미를 가지고 있다.
이걸 조금 더 길게 풀어보자면 행위자가 취한 행위 자체가 또는 그 행위로 인해 다른 무엇이 막혀버린, 제한된 상태라고 할 수 있는데, 이걸 컴퓨터 공학의 측면에서 보면 다른 함수가 작업을 하지 못하도록 제어권을 계속 가지고 있는 것 이다.

동작하는 과정

  • 호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고 호출한 함수에게 바로 돌려주지 않는다
  • 호출한 함수는 호출한 함수가 작업을 모두 마칠 때까지 계속 대기
  • return 값을 받아야 다음 작업을 할 수 있음
  • Thread 관점으로 본다면, 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용 / 대기

non-blocking

blocking 과 반대의 개념을 가지고 있으며,
호출된 함수가 자신의 할일을 모두 마치지 않더라도 바로 제어권을 리턴해주는 것 이다.

  • 호출된 함수가 자신이 할 일을 채 마치지 않았더라도 바로 제어권을 건네주어(return) 호출한 함수가 다른 일을 진행할 수 있도록 해준다
  • 요청한 작업을 즉시 마칠 수 없다면 즉시 return 한다.
  • Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.

sync, async vs blocking, non-blocking

위에서 sync, async, blocking, non-blocking 에 대한 개념을 알아봤는데, 보면서 드는 의문이 있다.

엥 ? 그래서 sync, blocking / async, non-blocking 차이가 뭔데 ?

각각은 관점으로 차이가 나누어 진다.
sync, async 👉 현재 작업의 응답과 다음 작업의 요청이 동시에 일어나는가
blocking, non-blocking 👉 호출된 함수가 제어권을 바로 주는가

사실 나도 진짜진짜 엄청엄청 헷갈렸는데 이미지 연상법을 사용하면 좀 잘 기억할 수 있다.

sync는 싱크로나이즈드

  • 앞에 사람이 동작을 끝내고 그 다음 사람이 동작을 해야하고
  • 순서대로 이루어져야 하기 때문

https://media.giphy.com/media/pDWtwK7D2IlFu/giphy.gif

blocking 은 농구 blocking

  • 공을 패스하거나 뺏기면 제어권이 상대에게로 넘어감

https://media.giphy.com/media/wk8scedJ5erFC/giphy.gif

으로 생각하면 좀 쉽게 이해할 수 있다 !

표로 간단하게 나타내보면 아래와 같다 ⬇️

sync & blocking
: 제어권이 넘어갔고, 순서대로 진행되어야 하기 때문에 대기 시간 발생
: Spring 은 기본적으로 해당 방법으로 동작

sync & non-blocking
: 제어권이 넘어가진 않았지만, 순서대로 진행되어야 하기 때문에 계속적으로 완료확인

async & blocking
: 순서대로 진행되지 않아도 되지만 제어권이 넘어갔기 떄문에 대기 시간 발생

async & non-blocking
: 제어권이 넘어가지 않았고, 순서대로 진행되지 않아도 되기 때문에 호출하고 작업을 하고 있다가 완료 시 콜백

레퍼런스

1개의 댓글

comment-user-thumbnail
2023년 6월 28일

와.... 말린님 블로그 정말 잘 보고 있습니다.
제어권 그림 설명이 대박이네요.. 바로 이해갔어요 ㅎㅎ

답글 달기