分散输入和集中输出(Scatter-Gather IO):readvwritev

请问这个v又代表什么?

readv和writev系统调用分别实现了分散输入和集中输出的功能。

#include<sys/uio.h>

ssize_t readv(int fd, const struct iovec *iov, int invcnt);

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

这些系统调用并非只对单个缓冲区进行读写操作,而是一次即可传输多个缓冲区的数据。数组iov定义了一组用来传输数据的缓冲区。整型数iovcnt指定了iov的成员个数。iov中的每个成员都是如下形式的数据结构。

struct iovec {

void *iov_base;    /* Start address of buffer */

size_t iov_len;       /* Number of bytes to transfer to/from buffer */

};

SUSv3标准允许系统实现对iov中的成员个数加以限制。系统实现可以通过定义<limits.h>文件中的IOV_MAX来通告这一限额,程序也可以在系统运行时调用sysconf(_SC_IOV_MAX)来获取这一限额。SUSv3要求该限额不得少于16。Linux将IOV_MAX的值定义为1024,这是与内核对该向量大小的限制(由内核常量UIO_MAXIOV定义)相对应的。

然而,glibc对readv和writev的封装函数还悄悄做了些额外的工作。若系统调用因iovcnt参数值过大而失败,外壳函数将临时分配一块缓冲区,其大小足以容纳iov参数所有成员所描述的数据缓冲区,随后再执行read或write调用。

分散输入

readv系统调用实现了分散输入的功能:从文件描述符fd所指代的文件中读取一片连续的字节,然后将其散置(分散放置)于iov指定的缓冲区中。这一散置动作从iov[0]开始,依次填满每个缓冲区。

原子性是readv的重要属性。换言之,从调用进程的角度来看,当调用readv时,内核在fd所指代的文件和用户内存之间一次性完成了数据转移。这意味着,假设即使有另一进程(线程)与其共享同一文件偏移量,且在调用readv的同时企图修改文件的偏移量,readv所读区的数据仍将是连续的。

调用readv成功将返回读区的字节数,若文件结束将返回0。调用者必须对返回值进行检查,以验证读取的字节数是否满足要求。若数据不足以填充所有缓冲区,则是会占用部分的缓冲区,其中最后一个缓冲区可能只有部分数据。

分散输出的用途在哪儿呢?

集中输出

writev系统调用实现了集中输出:将iov所指定的所有缓冲区中的数据拼接(集中)起来,然后以连续的字节序列写入文件描述符fd指代的文件中。对缓冲区中数据的集中始于iov[0]所指定的缓冲区,并按数组顺序展开。

像readv调用一样,writev调用也属于原子操作,即所有的数据将一次性的从用户内存传输到fd指代的文件中。因此,在向普通文件写入数据时,writev调用会把所有的请求数据连续写入到文件中,而不会在其他进程(或线程)写操作的影响下分散地写入文件。

如同write调用,writev调用也存在部分写的问题。因此,必须检查writev调用的返回值,以确定写入的字节数是否与要求相符。

readv调用和writev调用的主要优势在于便捷。如下两种方案,任选其一都可替代对writev的调用。

编码时,首先分配一个大缓冲区,随即在从进程地址空间的其他位置将数据复制过来,最后调用write输出其中所有的数据。

发起一列write调用,逐一输出每个缓冲区中的数据。

尽管方案一在语义上等同于writev调用,但仍需在用户空间内分配缓冲区,进行数据复制,很不方便(小女也低)。

方案二在语义上就不同于单次的writev调用,因为发起多次write调用无法保证原子性。更何况,执行一次writev调用要比执行多次write调用开销要小。

在指定的文件偏移量处执行分散输入/集中输出

Linux 2.6.30版本新增了两个系统调用preadv、pwritev,将分散输入/集中供暖输出和指定文件偏移量处的IO二者集于一身。它们并非标准的系统调用,但获得了现代BSD的支持。

Unix系统编程():分散输入和集中输出(Scatter-Gather IO):readv和writev的更多相关文章

  1. 《Linux/Unix系统编程手册》读书笔记2

    <Linux/Unix系统编程手册>读书笔记 目录 第5章: 主要介绍了文件I/O更深入的一些内容. 原子操作,将一个系统调用所要完成的所有动作作为一个不可中断的操作,一次性执行:这样可以 ...

  2. 《Linux/Unix系统编程手册》读书笔记5

    <Linux/Unix系统编程手册>读书笔记 目录 第8章 本章讲了用户和组,还有记录用户的密码文件/etc/passwd,shadow密码文件/etc/shadow还有组文件/etc/g ...

  3. 《Linux/UNIX系统编程手册》第63章 IO多路复用、信号驱动IO以及epoll

    关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wa ...

  4. 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

    0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...

  5. 《Linux/Unix系统编程手册》读书笔记8 (文件I/O缓冲)

    <Linux/Unix系统编程手册>读书笔记 目录 第13章 这章主要将了关于文件I/O的缓冲. 系统I/O调用(即内核)和C语言标准库I/O函数(即stdio函数)在对磁盘进行操作的时候 ...

  6. 《Linux/Unix系统编程手册》读书笔记6

    <Linux/Unix系统编程手册>读书笔记 目录 第9章 这章主要讲了一堆关于进程的ID.实际用户(组)ID.有效用户(组)ID.保存设置用户(组)ID.文件系统用户(组)ID.和辅助组 ...

  7. 《Linux/Unix系统编程手册》读书笔记3

    <Linux/Unix系统编程手册>读书笔记 目录 第6章 这章讲进程.虚拟内存和环境变量等. 进程是一个可执行程序的实例.一个程序可以创建很多进程. 进程是由内核定义的抽象实体,内核为此 ...

  8. 《Linux/Unix系统编程手册》读书笔记1

    <Linux/Unix系统编程手册>读书笔记 目录 最近这一个月在看<Linux/Unix系统编程手册>,在学习关于Linux的系统编程.之前学习Linux的时候就打算写关于L ...

  9. 《Linux/Unix系统编程手册》读书笔记 目录

    <Linux/Unix系统编程手册>读书笔记1  (创建于4月3日,最后更新4月7日) <Linux/Unix系统编程手册>读书笔记2  (创建于4月9日,最后更新4月10日) ...

随机推荐

  1. 一招搞定多Offer选择

    12月9号在论坛看到一位毕业生问了一个问题: 如今两个offer 一个在南京,搞.net ,公司是国电南自.税前一年加起来几乎相同7.2万.一个是在上海.搞java,公司名叫鑫合汇(不知道各位有没实用 ...

  2. 【架构】OpenResty相关资料

    OpenResty最佳实践 在2012年的时候,我加入到奇虎360公司,为新的产品做技术选型.由于之前一直混迹在python圈子里面,也接触过nginx c模块的高性能开发,一直想找到一个兼备pyth ...

  3. SSIS实践入门2:批量包的调度和SQLServer代理作业配置

    趁着上一篇文章的余温,我们继续研究一下SSIS中多个包如何调度,难道需要一个包一个包的配置调度程序吗?显然不是的,接下来我们就说一说在SSIS应用中如何批量的调度所有的作业,本文只讲述一个基本的逻辑过 ...

  4. Event.RESIZE 的事件不触发

    stage.scaleMode=StageScaleMode.NO_SCALE;(或者设置其他缩放模式,如EXACT_FIT等):   如果没有设置 stage的缩放模式的话, stage.addEv ...

  5. Hadoop HelloWord Examples -对Hadoop FileSystem进行操作 - 基于Java

    我之前对hadoop的各种文件操作都是基于命令行的,但是进阶后,经常需要直接从java的代码中对HDFS进行修改.今天来练习下. 一个简单的demo,将hdfs的一个文件的内容拷贝到另外hdfs一个文 ...

  6. windows 磁盘加密

      windows 磁盘加密 CreateTime--2018年4月25日18:37:45 Author:Marydon 以win10为例 选中磁盘-->你会发现上面的管理BitLocker是置 ...

  7. iOS_数据库2_基础知识

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  8. Linux配置 xampp下的https证书(腾讯云申请)

    准备 从腾讯云后台SSL证书管理里下载证书 一.上传文件 解压出来以后有三个文件: 1_root_bundle.crt 2_www.xxxxx.com.crt 3_www.xxxxx.com.key ...

  9. Ubuntu 12.04 安装 vsftpd

    本篇文章由:http://xinpure.com/ubuntu-12-04-install-vsftpd/ 安装背景 wordpress 在线升级需要配置 ftp 帐号,之前用的是虚拟主机,都是带有 ...

  10. Centos网络时好时超时问题解决

    近期公司使用的Centos突然出现网络不稳定现象,有公网,内部可以PING通外网,但是外部PING这个IP时,经常丢包现象,而且一丢包就是连续性的长达七八次,甚至十几次. 这个问题折腾了很长时间,因为 ...