회사에 Toby님이 오셔서 "Async @Spring"에 대한 주제로 강의를 해주셨다.
강의 중간에 동기(Synchronous)와 비동기(Asynchronous), 블로킹(blocking)과 논블로킹(non-blocking)에 대한 내용이 있었는데
이해를 하고 있다고 생각했지만, 조금 내용을 꼬아서 복잡하게 생각을 하면 설명하기 어려운 난해한 부분들이 있었다.
그래서 다시 정리를 할 필요가 있다고 생각되었다. 찾아보니 이 주제와 관련된 글이 많이 있다.
비동기 (Asynchronous, 非同期: 같은 시기가 아닌)
동시에 일어나지 않는다는 의미
바로 요청과 그 결과가 동시에 일어나지 않음
- 네트워크 프로그래밍에서 비동기
비동기 read함수를 호출하면 바로 return이 됨
비동기 함수를 호출할 때는 작업이 완료가 될 때 알려줄 수 있는 event나 callback함수를 설정하게 됨
어플리케이션이 커널에게 "읽을게 있으면 나에게 알려주던가(event) callback함수를 호출해~" 라고 하는 것
어플리케이션에서 aio_read를 호출하고 바로 return을 받게 됨
커널은 데이터가 들어오면 event를 발생시키거나 callback함수를 호출
비동기 네트워크 프로그래밍을 할 때, event나 callback함수를 사용하게 됨
non-blocking처럼 지속적으로 관찰하지 않고 작업을 걸어 두고 다른 작업을 진행한다가 어떠한 신호나 작업이 들어올 경우 걸어둔 작업을 진행
동기 (synchronous, 同期: 같은 시기)
요청과 그 결과가 동시에 일어남
요청을 하면 그 요청한 곳에서 바로 결과가 주어짐(시간 제약 없음)
요청과 결과가 동시에 일어나지만 속도가 느리면 무한정 기다려야 함
블로킹(봉쇄, Blocking)
작업이 중단
네트워크 통신에서 요청이 발생하고 완료될 때까지 모든 일을 중단한 상태로 대기해야 하는 것
블로킹 방식의 소켓통신은 결과가 올 때까지 다른 작업을 중단하고 기다림
blocking when an application issues a blocking system call, the execution of the application is suspended. The application is moved form the operating system's run queue to a wait queue. After the system call completes, the application is moved back to the run queue.
- 네트워크 프로그래밍에서 비동기
소켓이 blocking일 경우 Server가 Client의 메시지 요청을 받기 위해 read에서 기다림
Client가 write하기 전에는 read에서 빠져나오지 못함
논블로킹(비봉쇄, Non-blocking)
중단되지 않음
A nonblocking system call does not half the execution of the application for an extended time. Instead, it returns quickly. with a return value that indicates how many bytes were transferred.
- 네트워크 프로그래밍에서 논블로킹
blocking형태의 프로그래밍을 하다보면 서버 프로그램 입장에서는 여러 클라이언트의 처리가 어려움
대안 : 클라이언트 접속 별로 쓰레드를 생성하여 클라이언트별 read 함수를 호출 하는 것인데
대안의 문제점 : 대규모 처리시 context switching 발생 비용으로 프로그램 성능 하락
위 대안의 문제를 개선한게 논블로킹(non-blocking)
non-blocking은 위의 그림처럼 시스템 함수 호출 후 멈출 필요가 없음
읽을 데이터가 있으면 읽고, 없으면 넘어감
Thread에서 동기(synchronous)와 비동기(asynchronous)
synchronous와 blocking은 같은 개념
synchronous(또는 blocking)는 api call을 보낸 후 응답을 받을 때까지 대기 상태
응답을 받은 후 종료, asynchronous는 api call을 보낸 후 실행 여부와 관계없이 바로 응답을 받음
Synchronous thread
부몬 thread가 자식 thread 생성 후 자식 thread 종료까지 대기
자식 thread 종료 후 부모 thead 진행
Asynchronous thread
부모 thread가 자식 thread 생성 후 부모 자식 thread 모두 동시 진행
애플리케이션에서 OS 시스템 콜, IO에서의 개념 비교
blocking vs non-blocking
애플리케이션 실행 시 운영체제 대기 큐에 들어가면서 요청에 대한 system call이 완료된 후에 응답을 보낼 경우 blocking
애플리케이션 실행 시 운영체제 대기 큐에 들어가지 않고, 실행 여부와 관계없이 바로 응답을 보낼 경우 non-blocking
|
blocking |
non-blocking |
대기큐에 |
들어감 |
들어가지 않음 |
리턴이 시스템 콜 |
완료 후에 옴 |
완료되지 않아도 빠르게 옴 |
non-blocking vs asynchronous
system call이 반환될 때 실행된 결과와 함께 반환될 경우 non-blocking
system call이 반횐될 때 실행된 결과와 함께 반환되지 않는 경우 asynchronous
|
non-blocking |
asynchronous |
시스템 콜이 즉시 리턴될 때 |
데이터와 함께 옴 |
데이터와 함께 오지 않음 |
asynchronous는 요청에 대해 처리 완료의 여부와 관계없이 바로 응답함
이후 운영체제에서 응답할 준비가 완료되는 시점(예를 들어 네트워크로부터 데이터를 받는 요청의 경우 데이터가 준비되는 경우)에 응답함
non-blocking은 요청에 대해 바로 응답할 수 있는 경우 응답을 하고, 바로 응답하기 힘든 경우 에러를 반환함
에러를 받을 경우 데이터를 정상적으로 받을 때까지 계속해서 요청을 다시 보냄 (polling 방식 구조)
Blocking / Non-Blocking 글을 보면 asynchronous에 대해 다음과 같이 설명
이와 반대로 비동기형 통지모델은 일단 커널에게 I/O작업을 맡기면 커널의 작업 진행사항에 대해서 프로세스가 인지할 필요가 없는 상황을 말한다. 유저의 프로세스가 I/O 동기화를 신경쓸 필요가 없기에 비동기형이라고 부를 수 있다. 따라서 비동기형 통지모델에서 Notify의 적극적인 주체는 커널이 되며, 유저 프로세스는 수동적인 입장에서 자신이 할일을 하다가 통지가 오면 그때 I/O 처리를 하게 된다.
Asynchronous
An alternative to a nonblocking system call is an asynchronous system call. An asynchronous call returns immediately. without waiting for the I/O to complete.
Difference
The difference between nonblocking and asynchronous system call is that a nonblocking read() returns immediately with whatever data are available - the full number of bytes requested, fewer, or none at all. An asynchronous read() call requestes a transfer that will be performed in its entirety but will complete at some future time.
synchronous vs asynchronous
system call의 완료를 기다리면 synchronous
system call의 완료를 기다리지 않으면 asynchronous
synchronous vs blocking
시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수가 아니면 synchronous
시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수이면 blocking
| synchronous | blocking |
시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수 | 필수가 아님 | 필수 |
Question
I am reading 'Operation system concepts with java'. I am quite confused by the concept of blocking and synchronous, what are the differences between them?
Answer
Synchronous means an activity that must wait for a reply before the thread can move forward. Blocking refers to the fact that the thread is placed in a wait state. A synchronous call may invole blocking behavior or may not, depending on the underlying implementation(i.e. it may also be spinning, meanning that you are simulating synchronous behavior with asynchronous calls).
Summary
|
synchronous |
blocking |
asynchronous |
non-blocking |
waiting for system call's completion |
O |
O |
|
|
immediate return |
|
|
O |
O |
return with data |
O |
O |
|
O |
waiting in a waiting queue |
|
O |
|
|
Reference
[1] sync와 async, blocking과 non-blocking 차이점은? (https://slipp.net/questions/367)
[2] synchronous vs asynchronous, blocking vs non-blocking (https://www.daniweb.com/programming/computer-science/threads/384575/synchronous-vs-asynchronous-blocking-vs-non-blocking)
[3] asynchronous vs non-blocking (http://stackoverflow.com/questions/2625493/asynchronous-vs-non-blocking)
[4] 네트워크 프로그래밍에서의 blocking, non-blocking, syncronous, asyncronous(http://devsw.tistory.com/142)
[5] Sync async-blocking-nonblocking-io (http://www.slideshare.net/unitimes/sync-asyncblockingnonblockingio)
[6] Tcp ip & io model(http://www.slideshare.net/namhyeonuk90/tcp-ip-io-model)
[7] 동기와 비동기, 블로킹과 논블로킹 (http://nsinc.tistory.com/108)
[8] 네트워크 프로그래밍에서의 blocking, non-blocking, syncronous, asyncronous (http://devsw.tistory.com/142)
'Devlopment > Reactive, Concurrency' 카테고리의 다른 글
리액티브란 무엇인가? (What's in a Name : Reactive) (0) | 2017.01.10 |
---|---|
리액티브 프로그래밍 대 리액티브 시스템 (Reactive Programming vs Reactive Systems) (0) | 2017.01.09 |
리액티브 스트림(Reactive Streams) (0) | 2017.01.04 |
데이터 스트림 (0) | 2016.12.29 |
동시성 관련 분류 (0) | 2016.12.27 |
vert.x VS Akka (0) | 2016.11.22 |
리액티브 프로그래밍이란 무엇입니까? What is reactive programming? (0) | 2016.11.21 |
1. 소프트웨어 패러다임 - 성능 그리고 동시성 (0) | 2016.11.17 |
동시성(Concurrency) vs 병렬성(Parallelism) (0) | 2016.11.17 |
Rx-Java와 Java8에서의 반응형 프로그래밍 (Reactive Programming in Java 8 with Rx-Java) (0) | 2016.10.31 |