NAME
       readv, writev - read or write data into multiple buffers

SYNOPSIS
       #include <sys/uio.h>

       ssize_t writev(int fd, const struct iovec *iov, int iovcnt);

소스코드 출처 : http://www.ccplusplus.com/2012/02/writev-example-linux.html

---------------------------------------------------------

 

#include 
#include 
#include 
#include 
#include 
#include "sys/uio.h"

int main(int argc,char **argv) {
    static char part2[] = "THIS IS FROM WRITEV : http://www.ccplusplus.com/";
    static char part3[] = "]\n";
    static char part1[] = "[";
    struct iovec iov[3];

    iov[0].iov_base = part1;
    iov[0].iov_len = strlen(part1);

    iov[1].iov_base = part2;
    iov[1].iov_len = strlen(part2);

    iov[2].iov_base = part3;
    iov[2].iov_len = strlen(part3);

    writev(1,iov,3);

    return 0;
}
수행결과 화면

$ ./a.out 

[THIS IS FROM WRITEV : http://www.ccplusplus.com/]

---------------------------------------------------------

내용 출처 : http://blog.naver.com/playboy999/140117532970

writev 함수는 여러 개의 packet을 쪼게 거나 또는 나누어서 송, 수신한다.

즉 함수의 호출 횟수가 줄어든다. 그러면 성능상의 효율성이 높아진다.

일반적으로 함수의 호출이 일어날 경우 각각의 호출이 stack에 저장되고 함수의 실행이 끝나면 stack에서 pop이 된다. 그럼으로 이러한 stack의 사용의 횟수가 적어짐으로 이점이 발생한다.
그러나 이 부분 보다 전송되는 packet의 수를 줄일 수 있다는 것이 더 큰 이유가 된다.

예를 들어 Nagle algorithm이 off 일 경우를 생각해 보자.

  

   

Nagle algorithm이 off 인 경우 출력 buffer에 data가 들어오자 마자 data를 블록화 하여 전송하기 때문에 각각의 data가 packet화 하여 전송된다. 한번에 블록화 하여 전송할 수 있는 data를 여러 개의 packet으로 나누어 전송한 상황이 된다. 이러한 전송은 전송되는 packet이 적을 경우 문제가 되지 않지만 packet이 많아질 경우 전체 network에 영향을 끼치게 된다.

같은 양의 data를 전송하더라도 여러 packet으로 나누어 전송하면 각각의 packet에 header의 수가 증가함으로 network 입장에서는 traffic의 증가와 수신하는 호스트 입장에서는 처리해야 하는 packet의 수가 증가하는 꼴이 된다.

이러한 경우에 기존의 write함수보다 writev함수를 사용하면 높은 buffer에 저장되어 있는 data를 하나로 블록화하여 전송할 수 있다.

 

 

반응형

'Language > C' 카테고리의 다른 글

getutxent 함수 예제  (8) 2012.08.13
strtok 함수 예제  (7) 2012.08.06
readv 함수 예제  (8) 2012.07.30
poll 함수 예제  (8) 2012.07.26
GCC 컴파일러 에러 메세지 리스트(Error Message List)  (6) 2012.07.24

+ Recent posts