bdfgdfg

비동기&동기 / 블로킹&논블로킹 IO 본문

웹프로그래밍/Java

비동기&동기 / 블로킹&논블로킹 IO

marmelo12 2023. 7. 26. 00:41
반응형

다시 개념을 정리해보기 위한 글 쓰기..

 

우선 비동기/동기와 블로킹/논블로킹을 쉽게 이해할려면 관점을 분리해야한다.

동기/비동기 : 작업(Task)의 관점. (작업의 순서와 결과)

블로킹/논블로킹 IO : 쓰레드(Thread)의 관점.

블로킹/논블로킹은 쓰레드의 관점에 가깝다.

어느 파일 I/O, 소켓 I/O등 I/O 함수를 호출 시 쓰레드가 제어권을 계속해서 넘겨주느냐, 바로 반환받느냐의 차이.

 -> 즉 그 함수가 바로 리턴을 하느냐 안하느냐 라는 것

 

블로킹에서 호출된 함수가 동기방식이라면 보통 블로킹방식이기에 제어권을 가져가지만,

별도로 논블로킹 설정이 가능하다면 동기함수를 호출하더라도 제어권을 거의 바로 반환받을 수 있다.

https://velog.io/@gth1123/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0-vs-%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9

위 그림이 가장 적절하게 설명한게 아닌가 싶다.

동기와 비동기는 작업의 관점이기에, 이 작업의 결과물을 어떻게 받아가느냐는 중요하지 않다.

다만 동기와 비동기의 차이는 작업 완료의 순서와, 결과확인 방식에서 차이가 존재한다.

 -> 여기서 성능적인 관점은 가능한 설명x

 

동기 방식

: 작업의 완료가 순서대로 이루어짐(작업이 직렬형태).동기 형태의 메소드 A,B,C,D를 호출 시 순서대로 A,B,C,D 결과를 반환.

  만약 논블로킹일 경우, 위와 동일하지만 결과 확인을 해당 동기함수에 매번 접근을 해야 알 수 있다.

(응답을 받아야 다음 동기처리가 진행 되며, 동기방식은 비동기와 달리 함수의 결과를 따로 알려주지 않기에 직접 접근해야 함.)

 

만약 쓰레드가 멈추지않고 계속 다른 작업까지 진행해야한다면, 논블로킹 설정이 가능할 시 논블로킹-동기모드로 쓰는게 맞다고 보지만 쓰레드가 의미없이 결과 확인을 위해 동기 함수에 접근한다면 블로킹-동기모드가 맞다고 생각한다.

 

비동기 방식

 : 비동기 작업의 요청 시, 작업의 완료는 순서대로 이루어지지 않는다.(작업이 병렬형태) 

작업 완료의 결과 반환을 보통 콜백(Callback)방식이나 이벤트(Event, Signal형태등등)형태로 알려준다.

 

작업이 비동기 방식으로 처리되고, 작업의 결과를 비동기 메소드에서 확인할 필요가없기에 블로킹 형태는 쓰이지 않는다.

 -> 아마도? 쓰이는게 이상함

대부분 논블로킹일것이며, 만약 싱글쓰레드 환경이 강제된다면 동기쪽 방식보다는 비동기 방식을 택하는게 좋을 것.

 

 

위의 정리한 내용은 제가 스스로 정의한 비동기/동기, 블로킹/논블로킹에 대한 의견입니다.

100점짜리 정답은 아니라고 생각하지만 저 스스로 이해하기 쉽게 정리한 내용이며 혹여나 글을 읽으시는분이 계신다면 이 점 참고 부탁드립니다.

반응형

'웹프로그래밍 > Java' 카테고리의 다른 글

제어자, 캡슐화/은닉성  (0) 2023.07.26
package와 import  (0) 2023.07.26
자바의 상속,다형성,인터페이스  (0) 2023.07.26
클래스 초기화  (0) 2023.07.25
자바 & JVM  (0) 2023.07.25
Comments