도당탕탕

Sync와 Async 그리고 Blocking과 Non-Blocking 본문

CS

Sync와 Async 그리고 Blocking과 Non-Blocking

backlo 2020. 1. 16. 01:18

Intro

  1. MultiThread 문제점에 대하여
  2. Synchronous vs Asynchronous
  3. Blocking vs Non-Blocking
  4. Non-Blocking vs Asynchronous
  5. Synchronous vs Blocking

MultiThread 문제점

  • MultiThread
    • 전체 프로세스의 영향을 줄 수 있다.
    • 성능 저하가 동반된다.
    • 동기화의 주의를 해야한다.
    • 교착 상태가 발생 할 수 있다.
    • 각 쓰레드가 효율적으로 고르게 실행될 수 있도록 해야 한다.

Synchronous vs Asynchronous

  • 통신 매커니즘을 설명한다.
  • System call의 완료를 기다리면 synchronous 이다.
    • 어떠한 것도 리턴하지 않는다. 즉 함수에서 해당 결과 값이 나올 때까지 기다려야 한다.
    • Synchronous는 api call을 보낸 후 응답을 받을 때까지 대기 상태에 있다 응답을 받은 후 종료한다.
  • System call의 완료를 기다리지 않으면 Asynchronous 이다.
    • 결과값이 어떠하든 바로 리턴을 한다. 그 이후에 함수가 처리가 되면 콜백 함수 또는 다른 방법을 사용하여 최종 결과 값을 다시 알려준다.
    • Asynchronous는 api call을 보낸 후 실행 여부에 관계없이 응답을 받는다.
    • 톰캣 쓰레드 풀 외의 다른 쓰레드 풀을 만들어 다르 쓰레드 풀에게 작업을 위임한다.
  • 예시) 하나의 task를 처리할 때 데이터베이스에 저장하는 시간 0.5초 걸리고 2초동안 메일을 발송한다.
    • 동기 처리 : 일이 하나씩 끝나고 작업을 해야 하기 때문에 2.5초가 걸린다.
    • 비동기 처리: 다른 쓰레드에게 위임해 각자 처리 하게 한다. 즉 0.5 + a 가 걸릴 것이다.

Blocking vs Non-Blocking

  • I/O를 담당하는 함수를 호출 했을 때 바로 리턴하느냐 마느냐가 관심사이다.
    • 동기/비동기와 다른 문제이다.
  • Blocking/Non-Blocking의 동기/비동기 개념
    • 데이터의 송수신을 누가 하느냐에 따라 나눠진다.
    • 인풋과 아웃풋에서의 사용한다.
    • Sync
      • 클라이언트가 매번 서버에게 요청
      • 주도권은 클라이언트
    • Async
      • 이벤트가 일어날 때 클라이언트에게 줌
      • 주도권은 서버
      • 커널이 데이터를 송수신 완료된 시점에 클라이언트에게 주는게 async
  • Blocking
    • 데이터가 수신되고 응답하는 것
    • 애플리케이션 실행 시 운영체제 대기 큐에 들어가면서 요청에 대한 system call이 완료된 후에 응답을 보낼 경우 blocking 이다.
  • Non-Blocking
    • 데이터가 수신 되지 않아도 바로 응답을 하게 되는 것
    • 애플리케이션 실행 시 운영체제 대기 큐에 들어가지 않고, 실행 여부와 관계없이 바로 응답을 보낼 경우 non-blocking 이다.
  • I/O 멀티 플렉싱
    • 하나의 쓰레드에서 다수의 클라이언트에 연결된 소켓을 관리한다.

Non-Blocking vs Asynchronous

  • System call이 반환될 때 실행된 결과와 함께 반환될 경우 non-blocking 이다.
  • System call이 반환될 때 실행된 결과와 함께 반환되지 않을 경우 Asynchronous 이다.
  • Asynchronous는 요청에 대해 처리 완료의 여부와 관계없이 바로 응답
  • 이후 운영체제에서 응답할 준비가 완료되는 시점에 응답한다.
    • 예를 들어 네트워크로부터 데이터를 받는 요청의 경우 데이터가 준비되는 경우
  • Non-Blocking은 요청에 대해 바로 응답할 수 있는 경우 응답을 한다.
  • 바로 응답하기 힘든 경우 에러를 반환한다.
  • 에러를 받을 경우 데이터를 정상적으로 받을 때까지 계속해서 요청을 다시 보낸다.
  • 우리들이 흔히 이야기하는 polling 방식의 구조를 생각하면 된다.

Synchronous vs Blocking

  • 시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수가 아니면 synchronous 이다.
  • 시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수이면 blocking 이다.

그이

  • 아직 확실하게 개념이 잡히지 않아 부정확한 내용이 있을수 있다.
  • 나중에 내용 보충을 해야겠다.

'CS' 카테고리의 다른 글

Thread와 Process  (0) 2020.01.16
Comments