프로그래밍의 기초/TCP | IP

readv & writev 입출력 함수

Kim나현 2022. 1. 27. 20:35
반응형
  • readv & wirtev 함수의 사용

- 데이터를 모아서 전송하고 모아서 수신하는 기능의 함수

- 입출력 함수호출의 수를 줄일 수 있음

- writev 함수를 이용해 여러 버퍼에 나뉘어 저장된 데이터를 한번에 전송하고 readv 함수를 이용해 데이터를 여러 버퍼에 나눠 수신

 

  • wirtev
#include <sys/uio.h>
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

- fd: 데이터 전송의 목적지를 나타내는 socket의 file descriptor 전달 (socket에만 제한된 함수가 아니므로 파일이나 콘솔 대상의 file descriptor도 전달 가능)

- iov: 구조체 iovec배열의 주소값, 구조체 iovec의 변수는 전송할 데이터의 위치 및 크기 정보 번달

- iovcnt: 두번째 인자로 전달된 주소값이 가리키는 배열의 길이정보

 

struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
};

- iovec 구조체는 전송할 데이터가 저장된 버퍼의 주소값과 전성할 데이터의 크기정보를 담음

 

writev & iovec

- file descriptor 1이므로 콘솔에 출력이 이뤄짐 

- 세번째 인자가 2이기 때문에 ptr이 가리키는 주소를 시작으로 총 2 개의 iovec 구조체의 변수를 참조하여 변수가 가리키는 버퍼에 저장된 데이터 전송

 

// 실행창

 

  • readv
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);

- fd: 데이터를 수신할 파일(혹은 socket)의 filde descriptor

- iov: 데이터를 저장할 위치와 크기 정보를 담고 있는 iovec 구조체 배열의 주소값

- iovcnt: 두 번째 인자로 전달된 주소값이 가리키는 배열의 길이정보 

 

// 실행창

(readv 함수: fgets 함수 2개를 연이어 호출하는 것과 비슷한 형식으로 동작)

- readv 함수의 두 번째 매개변수에서 데이터의 크기를 5로 지정했기 때문에 buf1의 크기에 상관없이 최대 5바이트만이 저장

- vec[0]의 버퍼에 5바이트가 저장되고 나머지 데이터는 vec[1]에 등록된 버퍼에 저장되므로 iov_len에는 버퍼에 저장할 최대 바이트 크기 정보를 저장해야 함

- readv 함수의 첫 번째 인자가 0이므로 콘솔로부터 데이터 수신

 

  • readv & writev 함수의 적절한 사용

- 전송해야 할 데이터가 여러 개의 버퍼(배열)에 나뉜 경우, 한 번의 writev함수 호출로 가능 -> 효율적

- 입력 버퍼에 수신된 데이터를 여러 저장소에 나눠 읽어 들이는 경우 한번의 readv 함수 호출로 가능 -> 효율적

- 함수의 호출 횟수가 적으면 성능 향상

- 전송되는 packet의 수를 줄일 수 있음

 

- 서버에서 성능 향상을 위해 Nagle 알고리즘을 명시적으로 중지시킨 경우

: 전송할 데이터가 세 곳의 영역에 나뉘어 저장된 상황에서 write 함수를 사용할 경우 세 번의 함수 호출로 세 개의 패켓이 생성되어 전송될 확률이 높다.

: 하지만 writev 함수를 호출할 경우 한 번에 모든 데이터를 출력 버퍼로 넣기 때문에 하나의 패킷만 생성되어 전송될 확률이 높음

 

※ 여러 영역에 나뉘어 있는 데이터를 전송 순서에 맞춰 하나의 큰 배열에 옮기고 한번의 write 함수 호출로 전송을 하면 writev 함수를 호출한 것과 같은 결과를 얻을 수 있음 (

반응형