반응형

 

Blocking / Non Blocking Synchronous / Asynchronous

 

 

Blocking / Non Blocking

  • Blocking / Non Blocking은 호출되는 함수가 바로 제어권을 리턴 하느냐 마느냐 가 관심사
    • 제어권을 리턴하지 않으면 Blocking
    • 제어권을 리턴하면 NonBlocking
    제어권이 누구한테 있는지?

Synchronous / Asynchronous

  • Synchronous / Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경 쓰냐 가 관심사
    • 호출되는 함수의 작업 완료를 호출한 함수가 확인하면 Synchronous (동기)
    • 호출되는 함수의 작업 완료를 호출된 함수가 확인하면 Asynchronous (비동기)
    호출한 함수의 완료 여부를 누가 확인하는지?
  • 비동기 방식은 멀티 스레드 , 단일 스레드?요점은 비동기 방식은 스레드를 효율적으로 운용하여 반응성을 향상시키는 것비동기 방식 DB I/O가 발생하면 DB I/O는 다른 스레드에게 넘기고, 나머지 작업을 수행
  • 기존 방식 DB I/O가 발생하면 다른 작업을 수행하지 않고, DB데이터가 올 때까지 기다림.
  • 단일 스레드에서도 가능하다고는 하는데, 사실은 다른 프로세스의 스레드를 사용한다.
    다른 스레드 또는 다른 프로세스의 스레드를 사용하므로 결국, 멀티 스레드가 맞다.
  • 동기?
    **작업의 완료 확인 방식에서의 동기(synchronous):** 
    작업을 호출한 쪽이 결과가 반환될 때까지 기다린다는 의미입니다. 
    비동기(asynchronous)는 작업의 완료를 기다리지 않고 다른 작업을 수행하며, 
    작업의 결과는 나중에 돌려받습니다.(콜백, 이벤트, 프로미스 등을 통해).
    
    **쓰레딩과 Race Condition 문맥에서의 동기(synchronization)**: 
    쓰레드 간의 실행 순서나 자원 접근을 조절하는 방식을 의미합니다. 
    즉, 어떤 일련의 작업이 '동기화' 되어 있다면, 그 작업들은 미리 정의된 어떠한 
    순서에 따라 실행되어야 하며, 이를 통해 레이스 컨디션을 방지할 수 있습니다.
    
    **Synchronous (동기):** 시간에 대한 것
    동기 방식은 하나의 작업이 완료되어야 다음 작업이 시작됩니다. 
    여기서는 `시간의 흐름`에 집중이 되어 있습니다.
    **-> 시간**
    
    **Synchronization (동기화):** 상태나 데이터의 일관성 
    여러 프로세스나 쓰레드가 동시에 어떠한 자원을 접근할 때 그 순서와 방식을 
    조절하여 `데이터의 일관성`을 유지하는 것을 의미합니다.
    **-> 상태**
    
  • → 동기가 헷갈리는 이유

 

 

결론

  1. Blocking + Synchronous: 요청을 보내고 응답을 받을 때까지 아무 것도 하지 않는 상태로 대기.이렇게 되면 시스템의 효율성이 떨어짐 긴 대기 시간 동안 다른 중요한 작업을 처리할 수 없게 된다.
  2. Non-Blocking + Asynchronous: 요청을 보내고 바로 다른 작업을 계속 진행. 응답이 오면 해당 응답을 처리하는 콜백 함수나 이벤트 리스너를 통해 처리함 이 방식은 시스템의 효율성, 반응성을 크게 향상 시킬 수 있다.

→ 결국, 작업 시간이 긴 여러 DB I/O, 네트워크 처리는 비동기 방식이 좋다는 내용 👍

 

 


 

예시

프론트

왜 Javascript에서 axios 호출을 비동기식이라고 하는지?

Web APIs Ajax 요청, setTimeout(), 이벤트 핸들러의 등록과 같이 웹 브라우저에서 제공하는 기능들을 말한다.

이러한 요청들의 처리가 JavaScript 엔진의 쓰레드와는 다른 쓰레드들에서 이뤄진다는 점이다.

JavaScript 엔진의 스택에서 실행된 비동기 함수가 요청하는 비동기 작업에 대한 정보와 콜백 함수를 웹 API를 통해

브라우저에게 넘기면, 브라우저는 이러한 요청들을 별도의 쓰레드에 위임 해당 요청이 완료되는 순간 콜백 함수를 JavaScript 엔진의 태스크 큐라는 곳에 집어넣는다.

→ JS가 비동기 함수를 실행하면, JS는 이 함수들에 대해 신경 쓰지 않는다. (비동기)

호출된 함수는 브라우저가 신경 쓰며, 작업을 완료하면 JS에게 Call Back 을 준다.

async function fetchExternalData() {
  const response = await fetch('<http://external-service/data>');
  const data = await response.json();

  // 위 요청-응답을 비동기로 브라우저에게 넘겨 처리하고, 아래 작업을 바로 실행함
  otherWork();

  return data;
}

 

 

백엔드

**WebFlux**는 Spring 5에서 도입된 반응형 프로그래밍 모델로, Non-Blocking + Asynchronous 방식 WebFlux는 Project Reactor를 기반으로 하며, **Mono**와 **Flux**라는 반응형 스트림 타입을 제공

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
public class ExternalService {

    @Autowired
    private WebClient webClient;

    public Mono<String> fetchExternalData() {
        String data = webClient.get()
                        .uri("/data")
                        .retrieve()
                        .bodyToMono(String.class);

				// 위 요청-응답을 비동기로 처리하고, 아래 작업을 바로 실행함
				otherWork();
    }
}

 

 


 

 

! 질문

비동기 방식이 무엇인가?

→ DB I/O, 네트워크 작업 등의 시간 소요가 큰 작업의 완료를 기다리지 않고, 해당 작업 완료 시 콜백을 통해 결과를 받아오면서 동시에 다른 작업을 계속 수행하는 방식을 의미합니다.

WebFlux, axios를 추가로 설명하면 👍

 

(네트워크에서) 동기 방식이 무엇인가?

→ 여러 개의 요청-응답을 순차적으로 처리하여, 실행하는 것입니다.

반응형

'CS > 네트워크' 카테고리의 다른 글

[TCP/IP MODEL]  (0) 2022.08.31
반응형

 

 

 

 

 

1계층 물리 계층

물리적인 매체를 이용해 비트 스트림을 전송

비트 단위 전송 010100

 

 


 

 

2계층 데이터링크 계층

hop to hop 전송 담당

Mac 주소 사용

유선 - 이더넷 MTU 1500byte

무선 - LTE

 

IP주소를 이용해 바로 옆(라우터, Host)으로 전달하는 역할을 하는 계층

 

데이터를 전송하고자 할 때 매체를 타고 전파된다.

매체를 이용하면 브로드캐스트로 전파된다. (사람이 공기를 이용해 말을 하듯이)

여러 노드가 동시에 매체를 이용하게되면, 충돌이 발생한다. 

 

충돌을 해결하기 위해 여러 시도 -> 정해진 시간마다 노드가 데이터를 보내는 방식

현재 사용하는 방식은 임의로 아무때나 Random Access하는 방식을 사용

임의로 아무때나 매체에 접근하므로 충돌은 언젠간 발생하며, 충돌을 해결해주어야 한다.

 

CSMA(carrier sense multiple access)

데이터를 보내기전에 매체를 감지하여 확인 후 전송한다.

 

CD(collision detection)

보낸 데이터의 충돌을 감지하면 전송을 멈춘다.

랜덤 딜레이를 주고 이후에 다시 전송을 시도한다.

 

 

 

스위치 (STAR형)

스위치가 중간에서 순서를 정리

스위치는 네트워크 관점에서 큰 의미 X

단순하게 연결을 위해 사용하는 것

switch table  [destination MAC : port]

 

 


 

ARP(IP를 사용하므로 사실 3계층에 위치)

IP를 이용해 MAC주소를 알아낸다.

 

프레임은 목적지 MAC주소로 데이터를 전송하므로 

목적지의 MAC주소를 알아야 한다.

MAC주소를 알아내기 위해 IP를 이용한다.

 

출발지 노드는 ARP TABLE [IP : MAC] 을 갖고 있다.

테이블에 IP에 해당되는 MAC 주소가 없다면

ARP TABLE을 채우기위해 브로드캐스트로 ARP를 전송

IP에 해당되는 정보를 가진 노드가 응답으로 자신의 MAC 주소준다.

출발지 노드는 목적지 MAC 주소를 채우고 데이터를 전송

 

스위치를 이용할 때는 데이터 링크(MAC)까지 올라가고,

ARP를 이용하려면 라우터 - 네트워크 계층 (IP)까지 올라가야 한다.

 

라우팅 테이블을 만들 때, ARP 테이블도 만든다.

 


 

 

3계층 네트워크 계층

장비: 라우터 - NAT, Forwarding, 방화벽

Host to Host

IP 주소 사용

 

 

라우터 동작 방식: 라우팅 알고리즘 -> 포워딩 테이블 구성 -> 포워딩

 

 

ip를 하나하나 다 저장하면 방대해지므로

서울, 대전, 부산과 같이 크게 묶은 후 라우팅 테이블의 ip range(Network Id)를 본다.

라우터는 라우팅 테이블을 보고 IP의 subnet mask 만큼 네트워크 IP로,

해당되는 라우터로 패킷을 forward (ip range가 가장 길게 매칭되는 곳으로 전송)

서브넷: 같은 prefix를 갖는 집합

 

 

 

라우팅 테이블 구성 방식

(1) Link state - 다익스트라 알고리즘

브로드캐스팅으로 자신의 링크정보를 네트워크에 뿌린다.

각 점은 각자 다익스트라 알고리즘을 수행하여 라우팅 테이블을 구성한다.

범위는 라우터들이 속한 도메인 범위에서 수행

 

(2) Distance vector - 벨만 포드 알고리즘

min(자신의 옆 라우터 이동 비용 + 도착지까지의 비용)

 

 

Fragmentation

IP 패킷을 2계층 이더넷 MTU에 맞게 분리, 조립하는 과정을 거친다.

재조립에 사용되는 식별자(identification), Offset을 헤더에 갖는다. (같은 데이터면 1씩 증가)

 

 

 


 

 

4계층 전송 계층

Process to Process

 

TCP, UDP

헤더에 포트번호를 갖고 있음

 

TCP, UDP 세그먼트도 이더넷 MTU를 따라야하기 때문에 분리한다.

 

 

 

TCP - 신뢰성 있는 통신

3way handshake(TCP Flags [Syn, Ack, Fin])

를 이용해 통신을 성립 후 신뢰성 지향 송수신을 한다.

버퍼를 이용해 흐름제어, 혼잡제어를 한다.

항상 수신측의 상황을 고려한다.

ack로 세그먼트의 시퀀스 넘버를 요청

 

흐름제어

슬라이딩 윈도우로 흐름을 제어한다.

ack를 받으면 ack 이후를 즉시전송 후 슬라이딩 윈도우를 밀고, 다시 전송한 세그먼트들의 ack를 기다린다.

윈도우의 크기는 수신측 상황에 맞춘다.

 

혼잡제어

송신한 세그먼트들이 timeout될 때 까지 지수적으로 증가시켜서 세그먼트를 전송해본다.

timeout이 발생하면 최종 전송 크기의 반으로 감소시켜 진행하고, 이후 가산 증가시키며 전송

 

 

 

 

 

UDP - 신뢰성 없는 통신

오류제어만 수행한다.

오류가 발생하면 해당 패킷은 폐기

헤더가 작아 커스텀하여 사용하기도 한다.

 


 

 

응용 계층

암호화, 실시간 처리 등을 응용계층에서 전담한다. (OSI 7 layer의 세션, 표현 계층의 역할을 포함한다.)

 

TCP socket 또는 UDP socket 을 형성하여 통신한다.

 

여러개의 소켓이 형성

소켓위에서 응용계층 프로세스가 동작한다.

전송계층의 헤더를 보고 맞는 소켓(port)으로 올린다.

 

 

 

 

HTTP 일 경우

헤더와 바디로 구성된 메세지를 전송계층에 데이터로 넘김

 

 

 

 


 

반응형

'CS > 네트워크' 카테고리의 다른 글

Blocking / Non Blocking, Synchronous / Asynchronous  (0) 2023.10.03

+ Recent posts