分享

分散聚合IO

 studydoer 2020-07-12

    分散/聚合I/O是一种可以在单次系统调用中对多个缓冲区输入输出的方法,可以把多个缓冲区的数据写到单个数据流,也可以把单个数据流读到多个缓冲区中。其命名的原因在于数据会被分散到指定缓冲区向量,或者从指定缓冲区向量中聚集数据。这种输入输出方法也称为向量I/O(vector I/O)。与之不同,标准读写系统调用(read,write)可以称为线性I/O(linear I/O)。

    与线性I/O相比,分散/聚合I/O有如下几个优势:

1)编码模式更自然

如果数据本身是分段的,向量I/O提供了直观的数据处理方法。

2)效率更高

单个向量I/O操作可以取代多个线性I/O操作。

3)性能更好

除了减少了发起的系统调用次数,通过内部优化,向量I/O可以比线性I/O提供更好的性能。

4)支持原子性

和多个线性I/O操作不同,一个进程可以执行单个向量I/O操作,避免了和其他进程交叉操作的风险。

函数原型:

#include <sys/uio.h>ssize_t readv(int fd, const struct iovec *iov, int iovcnt);ssize_t writev(int fd, const struct iovec *iov, int iovcnt);ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);

分散输入(scatter input)-聚合输出(gather output)。

struct iovec{    void *iov_base;  /*Starting address,向量缓冲区地址*/
    ssize_t iov_len;      /*Number of bytes to transfer,向量缓冲区大小,单位字节*/}

示例代码:

#include <sys/uio.h>#include <stdio.h>#include <unistd.h>#include <string.h>int main(){ char *str0 = "hello";  char *str1 = "world\n";  struct iovec iov[2];  ssize_t nwritten;    iov[0].iov_base = str0;  iov[0].iov_len = strlen(str0);  iov[1].iov_base = str1;  iov[1].iov_len = strlen(str1);    nwritten = writev(STDOUT_FILENO,iov,2); return 0;}

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多