分散/聚集 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)

分散/聚集IO(scatter/gather)及iovec结构体的更多相关文章

  1. iovec结构体定义及使用 (转)

    I/O向量(struct iovec) readv(2)与writev(2)函数都使用一个I/O向量的概念.这是由所包含的文件定义的: #include <sys/uio.h> 头文件定义 ...

  2. iovec结构体使用说明

    http://blog.163.com/lichuan0502@126/blog/static/9933534820111033228285/

  3. JAVA NIO Scatter/Gather(矢量IO)

    矢量IO=Scatter/Gather:   在多个缓冲区上实现一个简单的IO操作.减少或避免了缓冲区拷贝和系统调用(IO)   write:Gather 数据从几个缓冲区顺序抽取并沿着通道发送,就好 ...

  4. Linux 内核网络协议栈 ------sk_buff 结构体 以及 完全解释 (2.6.16)

    转自:http://blog.csdn.net/shanshanpt/article/details/21024465 在2.6.24之后这个结构体有了较大的变化,此处先说一说2.6.16版本的sk_ ...

  5. c语言结构体链表

    原文链接:http://zhina123.blog.163.com/blog/static/417895782012106036289/ 引用自身的结构体,一个结构体中有一个或多个成员的基类型就是本结 ...

  6. Java NIO中的通道Channel(二)分散/聚集 Scatter/Gather

    什么是Scatter/Gather scatter/gather指的在多个缓冲区上实现一个简单的I/O操作,比如从通道中读取数据到多个缓冲区,或从多个缓冲区中写入数据到通道: scatter(分散): ...

  7. 《精通并发与Netty》学习笔记(11 - 详解NIO (二) 分散/聚集 Scatter/Gather、Selector)

    一.分散/聚集 Scatter/Gather scatter/gather指的在多个缓冲区上实现一个简单的I/O操作,比如从通道中读取数据到多个缓冲区,或从多个缓冲区中写入数据到通道:scatter( ...

  8. Java基础知识强化之IO流笔记75:NIO之 Scatter / Gather

    1. Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作. 分 ...

  9. 转:Java NIO系列教程(四) Scatter/Gather

    Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作.分散(sc ...

随机推荐

  1. maven仓库介绍 牛人博客

    http://juvenshun.iteye.com/blog/359256 查找jar包方法 http://juvenshun.iteye.com/blog/269094

  2. tomcat使用方法大全

    一.安装tomcat之后 tomcat压缩包解压之后,进入webapps目录,可以看到如下webapp: docs文档:这是一个静态页面集,不用启动tomcat也可以阅读 examples样例 hos ...

  3. EditPlus集成Java编译和运行命令组建轻量级Java SE开发工具

    http://www.gogogogo.me/development/EditPlus-Java.html

  4. mongodb win7 32位系统安装以及配置

    今天安装 win7 32位系统 mongodb 费了好大劲..记录一下,希望相同的同学可以少踩点坑. 1.安装 我安装的是3.2.4  地址:http://downloads.mongodb.org/ ...

  5. webDAV服务的开启以及客户端的上传、下载、删除、新建文件夾、列表的代码(C#)

    windows server 2003开启webDAV服务 1. 启动“IIS管理器”选择“WEB服务扩展”,选择“WEBDAV”的允许按钮启动WEBDAV功能 2.建立一个虚拟目录,对应到一个本地目 ...

  6. java中异常和集合

    1. java中处理错误情况有两种,1  Error,2  Exception error是无法处理的,Exception是可以处理的情况. Exception中又有两种情况,RuntimeExcep ...

  7. Mongodb 与 Mongoose 的使用

    目标 无明确目标 知识点 了解 mongodb (http://www.mongodb.org/ ) 学习 mongoose 的使用 (http://mongoosejs.com/ ) 课程内容 mo ...

  8. 3dmax 2012 贴图通道与uv通道,烘焙场景

    1,修改贴图通道(假设要将贴图由自发光通道改至漫反射通道): 选中材质球,通入贴图栏,选中自发光通道中的贴图路径,拖至漫反射通道,松开鼠标时弹出对话框,选'交换'.(有时候解析fbx文件时解析不出贴图 ...

  9. cocos2dx 3.3多相机下_transformUpdated bug

    uint32_t Node::processParentFlags(const Mat4& parentTransform, uint32_t parentFlags) { if(_using ...

  10. 国际化模块 angular-translate 简单方便快捷翻译中英文等多语言环境

    很多web服务面对的不仅仅是当地用户,多语言环境不仅能提升逼格,更重要是一种用户体验. angular.js 作为前后端拆分的解决方案之一,当然离不开前端框架处理国际化的问题,angular.js 官 ...