[운영체제] Synchronous와 Asynchronous , Blocking과 Non-Blocking

hyyyynjn·2021년 9월 9일
0

면접대비

목록 보기
9/31
post-thumbnail
post-custom-banner

Q. 동기와 비동기의 차이

메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기라고 표현하고 그렇지 않은 경우에 대해서 비동기라고 표현한다.
동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 Blocking되어 있다는 것을 의미한다.
비동기의 경우, Blocking되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.

  • 동기/비동기는 두 개 이상의 무엇인가가 시간을 맞춘다/안맞춘다로 구분할 수 있다.
    동기 방식은 메소드 리턴과 결과를 전달받는 시간이 일치하는 명령 실행 방식으로 한 함수가 끝나는 시간과 바로 다음 함수가 시작하는 시간이 같다.
    비동기 방식은 여러 개의 처리가 함께 실행되는 방식으로 동기 방식에 비해 단위시간 당 많은 작업을 처리할 수 있다.
    (CPU나 메모리를 많이 사용하는 작업을 비동기로 처리하면 과부하가 걸릴 수 있고 프로그램의 복잡도도 증가한다)
  • Blocking/Non-Blocking은 동기/비동기와 다른 관점으로, 내가 직접 제어할 수 없는 대상(IO, 멀티스레드)을 상대하는 방법에 대한 분류이다.
    Blocking 방식은 대상의 작업이 끝날 때까지 제어권을 대상이 가지고 있는 것을 의미한다.
    Non-Blocking 방식은 대상의 작업 완료여부와 상관없이 새로운 작업을 수행한다.

✅Blocking vs Non-Blocking

Blocking/Non-Blocking는 Synchronous/Asynchronous와 관점이 다르다.
Blocking/Non-Blocking는 제어권이 어디에 있느냐에 대한 관점이다.
작업을 시킨 주체에게 제어권이 있는지 혹은 작업을 처리하는 주체에게 제어권이 있는지에 대한 것이다.

  • Blocking : 직접 제어할 수 없는 대상의 작업이 끝날 때까지 기다려야 하는 경우
  • Non-Blocking : 직접 제어할 수 없는 대상의 작업이 완료되기 전에 제어권을 넘겨주는 경우

Blocking

직접 제어할 수 없는 대상의 작업이 끝날 때까지 제어권을 넘겨주지 않는 것이다.
예를 들어 호출하는 함수가 I/O 작업을 요청할 때 I/O 처리가 완료될 때까지 아무 일도 하지 못하고 기다리는 것을 말한다.

Blocking은 개발 부서 전체 작업의 제어권을 가진 팀장이 엔지니어 A에게 넘겨주게 된다.
엔지니어 A가 작업을 수행할 동안 개발 부서 전체는 이를 기다리게 된다.
엔지니어 A가 작업을 마치고 팀장에게 알리면서 동시에 제어권도 돌려준다.
👉 제어권이 없는 상태에서는 Blocking이 되며 다른 일을 할 수 없는 상태가 된다.

Non-Blocking

직접 제어할 수 없는 대상의 작업처리 여부와 상관없다.
예를 들어 호출하는 함수가 I/O 작업을 요청한 뒤 I/O 작업에 대한 처리 완료 여부와 상관없이 바로 자신의 작업을 수행할 수 있는 것을 말한다.

Non-Blocking은 제어권을 바로 팀장에게 돌려주기 때문에 개발 부서는 엔지니어 A의 작업을 기다리지 않는다.
즉 다른일을 할 수 있는 상태가 된다.


✅Synchronous와 Asynchronous

Synchronous와 Asynchronous는 작업을 수행하는 주체에 관점을 두는 것이다.

  • Synchronous : 두개 이상의 주체가 작업 시간을 똑같이 맞출 때
  • Asynchronous : 두개 이상의 주체가 작업 시간을 서로 맞추지 않을 때

Synchronous (동기)

두 가지 이상의 대상 (함수, 애플리케이션)이 서로 시간을 맞춰 행동하는 것이다.
예를들어 호출한 함수가 호출된 함수의 작업이 끝나 결과를 반환하기를 기다리거나, 지속적으로 호출된 함수에게 확인을 요청하는 경우가 있다.

A가 끝나는 시간B가 시작하는 시간을 맞추면 Synchronous (동기)이다.
예를 들어 자바의 synchronizedBlockingQueue가 있다.

A와 B가 시작 시간 또는 종료 시간이 일치하면 Synchronous (동기)이다.
예를 들어

  • A, B 스레드가 동시에 작업을 시작하는 경우 (자바의 CyclicBarrier)
  • 메소드 리턴 시점 (A)과 결과를 전달받는 시점(B)이 일치하는 경우

정리

Blocking은 작업이 끝나기를 기다리다가 끝나면 다음 작업을 수행하는 것이고
Synchronous는 두가지 이상의 대상이 서로 시간을 맞춰 행동하는 것이다.
(시작 시간과 끝나는 시간을 같이 맞추거나, A가 끝나는 시간과 B가 시작하는 시간을 맞추는 것이다)

Asynchronous (비동기)

비동기는 작업을 수행하는 주체의 시작시간과 끝나는 시간에 관계없이 각자 별도의 시작 시간, 끝나는 시간을 가지고 있을 경우이다.
두 가지 이상의 대상이 서로 시간을 맞춰 행동하지 않는 것이다.

정리

Non-Blocking은 다른 작업이 끝날 떄까지 기다리지 않는 것이고
Asynchronous는 단지 두가지 이상의 대상이 서로 시간을 맞춰 행동하지 않는 것이다.


✅ Blocking/Non-Blocking 과 Synchronous/Asynchronous 조합

📌Synchronous Blocking I/O

  • Synchoronous
    • Application의 Read() 메소드가 리턴하는 시간과 Kernel에서 read I/O작업 결과가 반환되는 시간이 일치한다.
  • Blocking
    • Application은 Kernel에게 read I/O 작업 요청을 하면서 동시에 제어권을 넘긴다.
    • Application은 Kernel의 I/O 작업이 완료될 때까지 다음 작업을 수행하지 못하고 대기한다.

  • Synchoronous
    프로젝트 팀장은 기능 A가 완성되야 기능 B를 만들 수 있도록 하였다. 그래서 엔지니서 A가 업무를 끝내는 시간이 엔지니어 B가 업무를 시작하는 시간과 일치해야한다.
  • Blocking
    엔지니어 A는 제어권을 가지게 되어 프로젝트 팀장은 다른 일을 못하고 기다리게 된다.

📌Synchronous Non-Blocking I/O

  • Synchoronous
    • Application의 Read() 메소드가 리턴하는 시간과 Kernel에서 read I/O작업 결과가 반환되는 시간이 일치한다.
  • Non-Blocking
    • Application은 Kernel에게 read I/O 작업 요청과 동시에 제어권을 넘기지만, Kernel의 작업 완료 여부와 관계없이 Application에게 제어권이 다시 반환된다.
    • Kernel의 I/O 작업이 완료되면 그 결과를 Application에게 반환한다.

  • Synchoronous
    기능 A가 기능 B보다 우선 개발되어야 하기 때문에 엔지니어 A의 작업 종료 시간에 맞춰 엔지니어 B의 작업이 시작된다.
  • Non-Blocking
    엔지니어 A는 제어권을 받자마자 프로젝트 팀장에게 넘긴다. 프로젝트 팀장은 엔지니어 A의 작업이 종료될 때까지 기다리지 않고 주기적으로 결과를 확인하는 작업 (Polling)을 한다.

📌Asynchronous Non-Blocking I/O (AIO)

  • Asynchronous
    • Application의 Read() 메소드가 리턴하는 시간과 Kernel에서 read I/O작업 결과가 반환되는 시간이 일치하지 않는다.
  • Non-Blocking
    • Application은 Kernel에게 read I/O 작업 요청과 동시에 제어권을 넘기지만, Kernel의 작업 완료 여부와 관계없이 Application에게 제어권이 다시 반환된다.
    • Kernel의 I/O 작업이 완료되면 그 결과를 Application에게 반환한다. Application은 콜백함수를 통해 그 결과를 처리한다.

  • Asynchronous
    엔지니어 A와 B의 시간을 맞추지 않는다. 즉, 기능 A가 기능 B보다 우선 개발될 필요가 없다.
  • Non-Blocking
    기능 A을 개발하는 엔지니어 A는 프로젝트 제어권을 가지지 않는다. 엔지니어 B 또한 마찬가지이다.
    프로젝트 팀장은 엔지니어 A와 B에게 각각 기능 A, B를 맡기고 다른 작업을 수행한다.

📌Asynchronous Blocking

가장 비효율적인 모델이다.
하지만 Asynchronous Non-Blocking 모델 중에서 의도치 않게 Asynchronous Blocking으로 동작하는 경우가 있다고 한다.

  • Asynchronous
    기능 A가 기능 B보다 먼저 개발될 필요가 없다. 즉, 작업의 우선순위가 없다.
  • Blocking
    하지만 프로젝트 제어권을 엔지니어 A가 가지고 있기 때문에 작업 우선순위가 없음에도 불구하고 기능 A 개발이 종료될 때까지 기능 B를 개발할 수 없게 된다.
post-custom-banner

0개의 댓글