개요
네트워크 프로그래밍은 컴퓨터 네트워크를 사이에 두고 프로세스가 서로 통신하는 것을 말한다.
통신이란 2개 또는 그 이상의 프로세스가 서로 데이터를 주고받는 것을 말한다.
데이터를 주고 받는 것은 I/O 연산을 통해서 이루어진다.
I/O 연산은 모든 분산 프로그램의 네트워크 구조에서 빼놓을 수 없는 중요 연산이다.
I/O 연산은 데이터 교환과 직접 관련된 기능이며, 데이터를 읽을때는 입력, 보낼때는 출력 연산을 사용한다.
동기 I/O 연산
동기 연산을 하면 I/O 연산을 호출한 스레드를 멈추게 하며, 연산이 끝날 때 풀어준다.
통신에 시간이 많이 걸리지 않는 데이터를 연산을 한다면 괜찮겠지만, 크기가 큰 데이터나 엄청 잦은 데이터 처리를 요구한다고 하면 연산을 처리하는 동안 해당 스레드를 사용할 수 없다.
하지만 연산 데이터의 순서가 필요하다면 동기 연산의 경우 데이터의 순서를 지킬 수 있다는 장점이 있다.
비동기 I/O 연산
비동기 연산은 백그라운드에서 진행되므로 실행 하는 동안 스레드가 멈추지 않는다.
따라서 연산을 진행하는 동안 매우 유연하게 작업을 처리할 수 있다는 장점이 있다.
다만, 연산이 마쳤을 경우 콜백 함수를 통해 연산이 끝났다는 표시를 해주어야 한다.
따라서 동기 연산에 비해 코드의 복잡도가 높아질 수 있다는 단점이 있다.
하나 또는 그 이상의 비동기 연산이 시작되면, 프로그램은 자신의 실행 스레드들 중 하나를 라이브러리로 전달한다.
전달된 스레드는 이벤트 루프를 돌면서 비동기 연산이 끝나면 프로그램이 제공한 콜백 함수를 호출한다.
추가 연산
비동기 연산을 중간에 취소하거나, 소켓을 중단하거나, 닫는 등과 같은 연산이 있다.
이미 진행중인 비동기 연산을 취소하는 기능은 매우 중요하다, 그래야만 백그라운드에서 진행 중이던 연산이 이제는 필요 없다는 것을 알 수 있고, CPU 및 메모리를 아낄 수 있다.
취소할 수 없다면 자원을 계속 소모하며 백그라운드에서 작업이 진행되기에 자원이 낭비되는 것을 막을 수 없다.
소켓을 중단하는 기능은 더 이상 통신할 것이 없다는 것을 알릴 때 유용하게 쓸 수 있다.
이 방법을 통해 어플리케이션의 계층 프로토콜에서 메시지의 끝을 알릴 다른 방법을 제공하지 않아도 된다.
다른 운영체제 자원들 처럼 소켓도 더 이상 쓰지 않는다면, 운영체제로 되돌려줘야 한다.
소켓을 닫는 순간 운영체제로 자원이 되돌아간다.
'네트워크 통신 > Boost' 카테고리의 다른 글
Boost.asio I/O 가변 크기 버퍼, 스트림 버퍼 (0) | 2024.11.08 |
---|---|
Boost.asio I/O 고정 크기 버퍼 (0) | 2024.11.08 |
Boost.asio 소켓 연결 수락 (0) | 2024.11.07 |
Boost.asio 소켓 연결 요청 (2) | 2024.11.07 |
Boost.asio 소켓 바인딩 (0) | 2024.11.07 |