ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Blocking/Non-Blocking Sync/Async
    개발/컴퓨터사이언스 2023. 1. 26. 17:28

    Blocking/Non-Blocking

     

    Blocking, Non-Blocking은 제어권을 처리하는 방법론이다. Blocking은 현재의 작업이 모두 끝난후에 다음 작업에게 제어권을 넘겨준다. 예를 들어 Blocking 방식으로 CPU가 I/O 작업을 처리한다면 CPU는 I/O 작업이 완료 될 때까지 다른 업무를 하지 않는다. Non Blocking은 이와 반대다. 현재 작업이 모두 끝나지 않더라도 다른 작업에게 제어권을 건네줄 수 있다. CPU가 I/O 작업을 모두 처리하지 않더라도 다른 작업에게 제어권을 넘겨준다면 Non-Blocking이다.

     

    Sync/Async

     

    작업의 결과값을 신경 쓰느냐 쓰지 않느냐와 관련 있다. Sync는 호출된 함수의 결과를 호출한 함수가 신경 쓴다. 함수의 리턴 값이 필요한 경우가 대표적이다. async는 호출된 함수의 결과를 호출한 함수가 신경 쓰지 않는다. 쓰레드나 별도의 핸들러를 이용해 동시에 작업을 처리하는 경우가 async의 예다.

     

    이전 가격보다 10% 올리고 싶다면 이전 가격을 먼저 받아온 후 가격을 업데이트 해야한다. 이런 경우가 sync다.

    const price = await getPrice()
    console.log('done...') // getPrice() 완료 후에 실행 된다.
    updatePrice(price * 1.1)
    

    이전 가격과 상관 없이 가격을 300으로 바꾸고 싶다면 getPrice() 함수의 결과 값은 필요 없고 비동기로 호출해도 상관 없다. 이런 경우 async다.

    const price = getPrice()
    console.log('done...') // getPrice() 완료 전에 실행될 수도 있다
    updatePrice(300)
    

     

    오해

     

    많은 사람들이 Async = Non blocking, Sync = Blocking으로 오해하는 경우가 있는데 각각 별개의 개념이다. Blocking/NonBlocking 은 자원을 배분하는 하드웨어 관점이라면 Sync/Async는 작업처리와 관련된 소프트웨어 관점으로 바라보면 이해가 쉽다. 구현 방식에 따라 Async와 Blocking을 조합하기도 하고 Sync 와 Non-Blocking을 조합하기도 한다.

     

    예제

    참고 사이트에 있는 케이스 스터디를 살짝 바꿔봤습니다

      Sync Async
    Blocking 나: 엄마 밥해주세요
    엄마: 밥 할거야. 여기서 기다려
    나: (어차피 밥먹고 코딩해야하기 때문에 엄마 밥하는거 구경중…)
    엄마: 밥 다했어
    나: 잘먹겠습니다.
    나: 엄마 밥해주세요
    엄마: 밥 할거야. 여기서 기다려
    나: (코딩해야하는데 엄마 밥하는거 구경중…)
    엄마: 밥 다했어
    나: 잘먹겠습니다.
    Non-Blocking 나: 엄마 밥해주세요
    엄마: 밥 할거야. 할거 하고 있어
    나: 엄마 밥 다했어요? 밥먹고 코딩해야해요
    엄마: 아니
    나: 엄마 밥 다했어요? 밥먹고 코딩해야해요
    엄마: 아니
    나: 엄마 밥 다했어요? 밥먹고 코딩해야해요
    엄마: 응
    나: 엄마 밥해주세요
    엄마: 밥 할거야. 가서 볼일 봐
    나: (코딩하러감)
    엄마: 밥 다했어
    나: 잘먹겠습니다.

     

    Non-Blocking의 경우 '나'에게 제어권이 돌아오지만 Blocking의 경우 '엄마'의 밥하기가 끝날 때까지 '나'에게 제어권이 돌아오지 않고 지켜만 봐야한다. Sync의 경우 '나'는 밥을 다 먹고나서 코딩을 해야하지만 Async의 경우 밥을 먹지 않아도 코딩을 할 수 있다. 내게 제어권이 돌아 오느냐, 결과 값을 신경 쓰느냐에 따라서 각각 나눠진다. 

     

     

     

    https://musma.github.io/2019/04/17/blocking-and-synchronous.html

     

    동기와 비동기, 그리고 블럭과 넌블럭

    무릇 모든 개발자들, 아니 비단 개발자가 아니라 할지라도 컴퓨터 관련 산업계 종사자들이라면 오다 가다 한 번씩은 꼭 들어보고, 또 익혔음직한 내용이겠습니다. 이름하야, 동기(Synchronous)와 비

    musma.github.io

     

    '개발 > 컴퓨터사이언스' 카테고리의 다른 글

    멀티쓰레드 동시성  (0) 2021.06.05
    프로스세와 스레드  (0) 2021.06.05
    스핀락, 뮤텍스, 세마포어  (0) 2018.11.07
    RCU (Read-Copy Update)  (0) 2018.10.30
    Cgroup (Control Group)  (0) 2018.09.15

    댓글

Designed by Tistory.