无缓冲I/O :不是内核不提供缓冲,而是对于用户层来说,没有提供缓存,而对内核来说还是有缓存的

数据:数据流->内核缓存->磁盘

有缓冲I/O:是指在用户层上再建立了一层缓存区(流缓存区),目的是为了减少read,write等系统调用的使用次数,降低系统开销。

数据:数据流->流缓存区->内核缓存->磁盘

e.g当用fwrite函数网磁盘写数据时,先把数据写入流缓冲区中,当达到一定条件,比如流缓冲区满了,或刷新流缓冲,这时候才会把数据一次送往内核提供的块缓冲,再经块缓冲写入磁盘。(双重缓冲)

/*http://blog.csdn.net/yusiguyuan/article/details/23358913*/

标准IO就是带缓存的IO,提供了三种类型的缓存

全缓存:当填满标准IO缓存后才执行IO操作,磁盘上的文件通常都是全缓存的

行缓存:当输入输出遇到换行符或缓存满时,才执行IO操作,stdin和stdout通常是行缓存的

无缓存:stderr通常是无缓存的,因为它必须尽快输出

是什么样的缓冲跟使用那个函数没有关系 , 而跟你读写什么类型的文件有关系 .  带 缓存的文件操作时标准C库的实现,第一次调用带缓存的文件操作函数时,标准库会自动分配内存并且读出一段固定大小的内存存储在缓存中。以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。

思考:为什么总是要将数据从用户缓存区弄到内核缓冲区或者相反呢?

内核缓冲存在的价值: 用户是运行在用户空间的,不能直接操作内核缓冲区的数据。用户进行到系统调用时,会由用户态变到内核态,待内核使用完后再变到用户态。

/*http://blog.csdn.net/yusiguyuan/article/details/23358913*/

摘录:

用缓冲技术能很明显的提高系统效率。内核与外围设备的数据交换,内核与用户空间的数据交换都是比较费时的,使用缓冲区就是为了优化这些费时的操作。其实核心到用户空间的操作本身是不buffer的,是由I/O库用buffer来优化了这个操作。比如read本来从内核读取数据时是比较费时的,所以一次取出一块,以避免多次陷入内核。
      应用内核缓冲区的 主要思想就是一次读入大量的数据放在缓冲区,需要的时候从缓冲区取得数据。
      管理员模式和用户模式之间的切换需要消耗时间,但相比之下,磁盘的I/O操作消耗的时间更多,为了提高效率,内核也使用缓冲区技术来提高对磁盘的访问速度。
磁盘是数据块 的集合,内核会对磁盘上的数据块做缓冲。内核将磁盘上的数据块复制到内核缓冲区中,当一个用户空间中的进程要从磁盘上读数据时,内核一般不直接读磁盘,而 是将内核缓冲区中的数据复制到进程的缓冲区中。当进程所要求的数据块不在内核缓冲区时,内核会把相应的数据块加入到请求队列,然后把该进程挂起,接着为其 他进程服务。一段时间之后(其实很短的时间),内核把相应的数据块从磁盘读到内核缓冲区,然后再把数据复制到进程的缓冲区中,最后唤醒被挂起的进程。
      注:理解内核缓冲区技术的原理有助于更好的掌握系统调用read&write,read把数据从内核缓冲区复制到进程缓冲区,write把数据从进程缓冲区复制到内核缓冲区,它们不等价于数据在内核缓冲区和磁盘之间的交换。
      从理论上讲,内核可以在任何时候写磁盘,但并不是所有的write操作都会导致内核的写动作。内核会把要写的数据暂时存在缓冲区中,积累到一定数量后再一 次写入。有时会导致意外情况,比如断电,内核还来不及把内核缓冲区中的数据写道磁盘上,这些更新的数据就会丢失。
      应用内核缓冲技术导致的结果是:提高了磁盘的I/O效率;优化了磁盘的写操作;需要及时的将缓冲数据写到磁盘。

无缓冲I/O与有缓冲I/O区别相关推荐

  1. 无符号整型与有符号整型变量的区别与联系—C/C++程序基础(五)

    示例分析 #include<iostream> #include <stdio.h>struct Result {char c;char d;unsigned char e; ...

  2. (转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 .

    某日一朋友写了一个HELLO WORLD代码,出不来结果,代码如下: #include <stdio.h> int main(int argc, char **argv){     pri ...

  3. go之无缓冲channel(通道)和有缓冲channel(通道)

    |版权声明:本文为博主原创文章,未经博主允许不得转载.博客地址:https://blog.csdn.net/sgsgy5 channel 我们先来看一下通道的解释: channel是Go语言中的一个核 ...

  4. cell下载图片的思路 --无沙盒(内存)缓冲

    // // ViewController.m // 06-表格图片下载 // // Created by jerry on 15/9/7. // Copyright (c) 2015年 jerry. ...

  5. 如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能

    小白摸索着编写一个上位机界面,将遇到的问题及解决方法记录下,以供后来的小白使用哈.这篇文章解决的问题是在绘图时候的闪烁问题.其中网上有些介绍的设置控制方式controlstyle的方法,这个方法我的理 ...

  6. java swing双缓冲_java中的双缓冲技术

    毕业设计有个远程协助功能,得到对方的屏幕后,老是会闪,很是不爽,今天用java的双缓冲技术解决了.代码如下,本类重写了Swing中的JLabel,当Label重绘时,会默认的调用它的update方法, ...

  7. mysql 缓冲查询_MySQL查询高速缓冲

    可以在SELECT语句中指定查询缓存相关选项: · SQL_CACHE 如果query_cache_type系统变量的值是ON或DEMAND,查询结果被缓存. · SQL_NO_CACHE 查询结果不 ...

  8. 缓冲技术之四:LRU缓冲管理策略分析

    1. LRU 调度算法 缓存淘汰算法:LRU(Least recently used,最近最少使用)算法是调度场景下( 内存调度.缓存淘汰等)常用到的算法,其原理是根据数据的最近访问时间来安排数据淘汰 ...

  9. java缓冲输入流_java _io_字符缓冲流的输入、输出

    新增方法: 输入: BufferedReader breader=new BufferedReader(Reader reader); .readLine()读取一行内容,返回字符串 输出: Buff ...

  10. 有参构造器(方法)和无参构造器(方法)的作用(区别)

    一.概念 java中构造方法指的是: 与类名相同,无返回类型的方法,参数可以为空,也可以带参数. 比如一个 Dao 类,private Dao(){}这个就是无参数的构造方法. private Dao ...

最新文章

  1. 第二十五章 面向对象------封装、内置函数、反射、动态导入
  2. Codeforces 847C - Sum of Nestings
  3. FTP服务(3)实现基于文件验证的vsftpd虚拟用户
  4. php chilkat.certstore,angularjs实现冒泡排序算法的可视化
  5. LeetCode 130. 被围绕的区域(图的BFS/DFS)
  6. 马化腾一直都在闷声发财,马云却到处开课当导师
  7. win2k,XP下用setupapi.dll自动安装Driver
  8. xmos驱动_独家!XMOS发表最新Xcore.ai“跨界处理器”
  9. Installation of Ubuntu source-insight
  10. PYTHON INSTALL
  11. intouch写数据到MySQL_如何将intouch数据插入到SQL数据库
  12. MDK5软件入门之新建工程项目模板
  13. win10好看的锁屏壁纸如何保存
  14. MATLAB绘图——加强篇
  15. 宝塔面板网站解决跨域问题
  16. p2p-如何拯救k8s镜像分发的阿喀琉斯之踵 1
  17. 如何绘制变参数根轨迹(针对复杂情况,无法分离出开环增益k*时)
  18. Filter vs Listener
  19. 百晓生兵器谱之公有云排名
  20. div 左中右结构布局问题

热门文章

  1. 《STL源代码分析》---stl_stack.h读书笔记
  2. 甘肃银行借助HDIM打造综合数据保护平台
  3. 国考报名显示服务器繁忙,公益性岗位考试内容-面试:牢记服务初心,让海关面试作答更具温度...
  4. 后台传一个状态值,如果在vue设置成正常停用?
  5. java boxlayout 换行,继承FlexboxLayout自定义可自动换行的tag标签
  6. 【转】详解vue的diff算法
  7. Sys.WebForms.PageRequestManagerParserErrorException 错误的解决办法
  8. 观点对立,无关虚拟现实技术
  9. js遍历jstl数组
  10. 【ANDROID游戏开发二十六】追加简述SURFACEVIEW 与 GLSURFACEVIEW效率!