前言

笔者本打算撰写一篇讲解标准I/O(缓存I/O)的博文,但是发现已经有网友做过同样的工作,并且工作质量上乘,特转载于此。

原文地址http://lenky.info/archives/2012/08/1856

正文

利用系统调用函数read()/write()是我们平常用得最多的一种数据读写方式,大多数情况下我们并没有考虑这种数据读写方式的执行效率,因为在很多并不以数据频繁读写为性能瓶颈的应用程序中函数read()/write()消耗的执行时间可以忽略,但是它们内在具体实现和执行效率到底如何呢?下面我们就来进行详细的分析。
函数read()/write()定义在头文件unistd.h内,原型如下:

#include <unistd.h>
ssize_t read(int fildes, void *buf, size_t nbyte);
ssize_t write(int fildes, const void *buf, size_t nbyte);

在这里我并不打算讲解函数read()/write()的源码,简略的描述其执行过程,涉及到的主要调用关系如下图所示:

如果我们的服务器程序,比如nginx采用read()/write()数据读写传输方式,当某客户端发送“GET /index.htm HTTP/1.1”请求时,nginx则需将存放在站点根目录的index.htm文本文件当作响应数据发送给客户端。当没有启用mmap()的情况下,nginx完成这个响应数据的发送工作需要两步,首先利用函数read()将index.htm文本文件数据读入内存,接着利用函数write()将第一步读入内存的数据写到连接套接口描述符来完成响应数据的发送:

如上图所示,nginx应用程序利用read()/write()数据读写传输方式完成响应数据的发送工作一共需要4次上下文切换和4次数据拷贝(即假定为一次read()/write()就将index.htm文本文件数据发送完毕的情况,如果不只一次则切换和拷贝次数将会更多),这些切换和拷贝过程是不是必须的呢?答案是否定的。比如当在启用mmap()的情况下就可以减少一次数据拷贝,此时利用系统调用mmap()将文本文件index.htm数据拷贝到内核缓存区,并将拷贝映射目标地址的起始值返回给nginx应用程序,正是因为nginx应用程序有了这块内核缓存区的映射起始地址并且可以共享这块内核缓存区(系统调用mmap()实现的结果),因此在第一幅图中,从内核Buffer到用户Buffer再到Socket Buffer的拷贝就可以变成一次从内核Buffer到Socket Buffer的直接拷贝:

 

read/write数据读写传输方式(转)的更多相关文章

  1. socket通信——通过Udp传输方式,将一段文字数据发送出去

    需求:通过Udp传输方式,将一段文字数据发送出去 定义一个Udp发送端 思路: 1.建立updsocket服务 2.提供数据,并将数据封装到数据包中. 3.通过socket服务的发送功能,将数据包发出 ...

  2. Android笔记——Android中数据的存储方式(一)

    Android中数据的存储方式 对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用. 总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其 ...

  3. Linux 上的常用文件传输方式介绍与比较

    ftp ftp 命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间或者在两个远程主机之间进行文件传输. FTP 协议允许数据在不同文件系统的主机之间 ...

  4. Linux上常用的文件传输方式以及比较

    tp ftp 命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间或者在两个远程主机之间进行文件传输. FTP 协议允许数据在不同文件系统的主机之间传 ...

  5. Linux下常用的文件传输方式介绍与比较

    参考链接:http://mingxinglai.com/cn/2014/03/copy-file-in-linux/ 本文介绍了linux之间传输文件的几种方式,并通过具体实验测试了几种文件传输方式之 ...

  6. 转: Linux 上的常用文件传输方式介绍与比较

    from:  https://www.ibm.com/developerworks/cn/linux/l-cn-filetransfer/ ftp ftp 命令使用文件传输协议(File Transf ...

  7. 数据读写API——IO流

    理清一些概念 1.Java 中的IO是干啥的? IO指的是Input和Output,主要目的是实现数据在存储介质之间的传输.[流:数据流,类比与水流的流动] 2.IO分类 按照操作单元来划分,可以分为 ...

  8. 旧文备份:CANopen协议PDO的几种传输方式

    (于2007.1.22) 由于PDO所传输的数据内容是无协议的且分配的标识符范围较SDO靠前,因此,其效率和优先级都是较高的,通常用于实时过程数据的传输. PDO是生产/消费类型的通讯方式,数据只有一 ...

  9. R语言读写中文编码方式

    最近遇到一个很头疼的事,就是 R语言读写中文编码方式.在网上找到了一篇博文,谢谢博主的精彩分享,让我很快解决了问题,在此也分享一下 R语言读写数据的方法很多,这里主要是我在使用read.csv/rea ...

随机推荐

  1. IPv6介绍

    一.为什么需要IPv6 为了扩大地址空间,拟通过IPv6重新定义地址空间.IPv4采用32位地址长度,只有大约43亿个地址,估计在2005-2010年间将被分配完毕,而IPv6采用128位地址长度,几 ...

  2. hdu 5120 Intersection 圆环面积交

    Intersection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5 ...

  3. Hdu 5001 Walk 概率dp

    Walk Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5001 Desc ...

  4. 学习笔记之Lucene

    http://baike.baidu.com/view/371811.htm?fr=aladdin Apache Lucene(http://lucene.apache.org/) Java 全文搜索 ...

  5. C#_delegate - Pair<T> 静态绑定

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. Asp.Net 之 缓存机制

    asp.net缓存有三种:页面缓存,数据源缓存,数据缓存. 一.页面缓存 原理:页面缓存是最常用的缓存方式,原理是用户第一次访问的时候asp.net服务器把动态生成的页面存到内存里,之后一段时间再有用 ...

  7. UTF-8编码与Unicode CS2的转换

    /* Convert a UTF-8 string into a UCS-2 array. */ void tcstrutftoucs(const char *str, uint16_t *ary, ...

  8. JavaScript中的作用域与函数和变量声明的提升

      var foo = 1; function bar() {     if (!foo) {         var foo = 10;     }     alert(foo); } bar(); ...

  9. 关于SWT的容器类之----面板Composite类和Group类

    1.Comosite类谱系图. Composite的用法: 格式:Composite(Composite parent,int style) 用法:Composite composite = new ...

  10. 使用jstack分析java程序cpu占用率过高

    在项目中经常会碰到CPU占用率过高的问题,那么碰到这类问题应当如何处理呢?下面提供一种处理思路: 首先top -H -p <pid>以线程的模式查看java应用的运行情况,找到占用cpu或 ...