同步异步IO阻塞非阻塞IO有缓存无缓存IO

同步异步IO阻塞非阻塞IO有缓存无缓存IO

同步异步IO

所谓同步异步其实就是相对于用户来说的

当内核缓冲区有数据的时候,用户就需要取读取,这时候就是用户就是一个一个取读取。

而异步就是当内核度缓冲区有数据的时候,这时候我们提前会内核注册一个信号(也可以叫做通知函数),当有数据的时候,内核去读,用户可以先去干别的事情,这时候当读满的时候,再通过信号去通知用户去一次性把数据读取出来。这也是实现reactorproreactor的原理

.就跟搬鸡蛋的很像,先把东西搬到篮子里(内核区缓存)再一次性搬到目的地(用户存放数据的地方(堆))

同步IO

  • linux信号驱动IO
  • 阻塞IO
  • 非阻塞IO
  • IO多路复用

阻塞和非阻塞IO

一个是读不到的时候就会阻塞在那里

另一个就是不会阻塞,可以继续往下执行

有缓存无缓存IO

  1. 首先无缓存只不过是指在用户层没有缓存,但对于内核来说,还是进行了缓存内核缓存区都是有的

  2. 如果你想要写数据到文件中(即硬盘中),内核先将数据写入到内核中所设的缓冲储存器(write()系统调用),等缓冲器满的时候再真正写到磁盘上

  3. 带缓冲的IO是在用户层再建立一个缓冲区(流缓冲区)建立在用户区,通过减少对系统调用(read() 和 write()只有内核区缓存)的次数来提高性能

    例如:用户多次调用fwrite将数据写入流缓冲区,等流缓冲区满的时候再调用一次write(),写入内核缓冲区.就跟搬鸡蛋的很像,先把东西搬到篮子里(用户区缓存)再一次性搬到目的地(内核区缓存)

  4. 总结:

    无缓冲IO操作数据流向路径:数据->内核缓冲区->磁盘

    带缓冲IO操作数据流向路径:数据->流缓冲区->内核缓冲区->磁盘

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

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

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

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

    是什么样的缓冲跟使用那个函数没有关系,而跟你读写什么类型的文件有关系.

  6. 带缓存的文件操作时标准C库的实现,第一次调用带缓存的文件操作函数时,标准库会自动非配内存并且读出一段固定大小的内存存储在缓存中。以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。

  7. 不带缓存的文件操作通常都是系统提供的系统调用

数据流向对比

无缓冲IO操作数据流向:
数据----> 内核缓冲区---->磁盘
标准IO操作数据流向:
数据---->流缓冲区---->内核缓冲区---->磁盘

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值