美文网首页
i/o缓冲区、内核缓冲区

i/o缓冲区、内核缓冲区

作者: 冯艳辉brook | 来源:发表于2018-05-03 18:26 被阅读0次

1、缓冲区数据交换

        用户进程是运行在用户空间的,不能直接操作内核缓冲区的数据。 用户进程进行系统调用的时候,会由用户态切换到内核态,待内核处理完之后再返回用户态。例如:read把数据从内核缓冲区复制到进程i/o缓冲区,write把数据从进程i/o缓冲区复制到内核缓冲区,内核缓冲区再和磁盘之间的交换。

程序和磁盘交换细节

用户i/o缓冲区的类型:

全缓冲

    此种类型的缓冲只有在缓冲区满的时候才会调用实际的文件 IO 进入内核态操作。除了涉及到终端设备文件的流,其它文件流默认基本都是全缓冲。

行缓冲

    此种类型的缓冲在缓冲区满或者遇到 \n 的时候才会调用实际的文件 IO 进入内核态操作。当流涉及到终端设备的时候就是行缓冲,比如标准输入流和标准输出流。如果对标准输入流或者输出流进行重定向到某个文件的时候,该流就是全缓冲的。

无缓冲

    没有缓冲区。直接调用文件 IO 进入内核态操作。标准错误流默认就是无缓冲的。

2、下边举一个例子加深理解:

每个进程都有一个标准i/o缓冲,缓冲区是使用malloc申请的,所以缓冲区是在堆区

#include <stdio.h>

#include <stdlib.h>

int main()  {      

    for (int i = 0; i < 2; i++) {

         fork();         

         printf("*");     

     }           

    return 0; 

 }

i=0时:主进程子进程都会在各自的缓冲区输入一个*, 

i=1时:新创建的两个进程会从父进程复制缓冲区,会继承下来一个*,自己在往缓冲区塞一个*,因此各自都有两个*。同时i=0时创建的两个进程也会往各自的缓冲区塞一个*。这时各个进程的缓冲区都有两个*,所以一共8个*。

相关文章

  • 高性能服务器程序框架

    同步I/O模型要求用户代码自行执行I/O操作(将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区...

  • i/o缓冲区、内核缓冲区

    1、缓冲区数据交换 用户进程是运行在用户空间的,不能直接操作内核缓冲区的数据。 用户进程进行系统调用的时候...

  • 2018-09-15 epoll模型解析

    一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 epoll只关心缓冲区非满和缓冲区非空...

  • NIO-内存映射文件

    内存映射文件的由来 1. 基于缓冲区的I/O操作 I/O 的基础是缓冲区,所谓“输入/输出”简单来说就是把数据移进...

  • 零拷贝

    背景:缓存 I/O 使用了操作系统内核缓冲区,在一定程度上分离了应用程序空间和实际的物理设备,缓存 I/O 可以减...

  • 深入理解零拷贝

    title: 深入理解零拷贝date: 2021/5/21 16:11 一、I/O 概念 1.1 缓冲区 缓冲区是...

  • 关于 IO 和 NIO 的思考

    I/O 的实际操作由内核执行,其中一个重要手段是缓冲区。简单来说 I/O 可分为两类:面向磁盘和面向网络,Java...

  • IO模型

    IO读写 read:把数据从内核进程复制到进程缓冲区 write:把数据从进程缓冲区复制到内核缓冲区 阻塞IO 需...

  • 从阻塞IO到多路复用IO

    阻塞IO 缓冲区缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用,当你操作一个流时,更多的是以缓冲区为单位...

  • I/O相关概念记录

    I/O模式 对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓...

网友评论

      本文标题:i/o缓冲区、内核缓冲区

      本文链接:https://www.haomeiwen.com/subject/moylrftx.html