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

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

编码模式更自然

如果数据本身是分段的(比如预定义的结构体的变量),向量 I/O 提供了直观的数据处理方式。

效率更高

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

性能更好

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

支持原子性

和多个线性 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);

read or write data into multiple buffers.

The  readv()  system  call reads iovcnt buffers from the file associated with the file descriptor fd into the buffers described by iov ("scatter input").
The writev() system call writes iovcnt buffers of data described by iov to the file associated with the file descriptor fd ("gather output").

The pointer iov points to an array of iovec structures, defined in <sys/uio.h> as:

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

示例

           char *str0 = "hello ";
char *str1 = "world\n";
struct iovec iov[];
ssize_t nwritten; iov[].iov_base = str0;
iov[].iov_len = strlen(str0);
iov[].iov_base = str1;
iov[].iov_len = strlen(str1); nwritten = writev(STDOUT_FILENO, iov, );

参考:

1. 分散/聚集 I/O(scatter-gather I/O)

最新文章

  1. activiti入门
  2. equals
  3. Java-利用spring发送邮件
  4. android EditText设置光标、边框和图标
  5. 转载 感受K2.Net 2003工作流解决方案
  6. Socket编程实践(8) --Select-I/O复用
  7. ERROR 1045 (28000): Access denied for user &#39;xxx&#39;@&#39;localhost&#39; (using password: YES)【奇葩的bug】
  8. python实现简单的百度云自动下载
  9. Python学习笔记三
  10. SpringBoot的学习【6.YML 和 Properties 的语法】
  11. Python设计模式 - UML - 活动图(Activity Diagram)
  12. JMeter—后置处理器(十)
  13. Unity shader学习之Forward Rendering Path
  14. 解决php7.1的中遇到的问题
  15. 20172321 2017-2018-2《Java程序设计》第三周学习总结
  16. 31 Godoc: documenting Go code 编写良好的文档关于godoc
  17. UltraEdit-32 查看编码
  18. plan-6.17周末
  19. 2018-2019-2 网络对抗技术 20165202 Exp6 信息搜集与漏洞扫描
  20. scjp考试准备 - 8 - final关键字

热门文章

  1. 如何发布开源自己的框架或类库到CocoaPods - 图文讲解
  2. HDUOJ---1241Oil Deposits(dfs)
  3. HDUOJ----4509湫湫系列故事——减肥记II
  4. HDUOJ-----取(m堆)石子游戏
  5. TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE
  6. Android用shareUserID实现多个Activity显示在同一界面
  7. RMAN备份时报“ORA-19504: failed to create file”和“ORA-27038: created file already exists”
  8. iOS接收null的处理方法
  9. linux shell 删除指定文件夹下面 名称不包含指定字符的文件
  10. 基于PHP规范的自动加载方式(composer配置)