58 高级IO

本章重点

理解五种io模型的基本概念,重点是io的多路转接
掌握select模型,实现select版本的tcp服务器
掌握poll模型,实现poll版本的tcp服务器
掌握epoll模型,实现epoll版本的tcp服务器
理解epoll的LT模型和ET模式
理解select和epoll的优缺点对比

目录

  1. 阻塞和非阻塞
  2. 同步和异步
  3. 五种io模型
  4. 其他io模型

1. 阻塞和非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

  • 阻塞调用的是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

2. 同步和异步

(synchronous communication/ asynchronous communication)
同步和异步关注的是消息通信机制

  • 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回,但是一旦调用返回,就得到返回值了,换句话说,就是由调用者主动等待这个调用的结果
  • 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果,换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通过状态,通知调用者,或者通知回调函数处理调用

另外,我们在多线程的时候,也提到同步和互斥,这里的是完全不相干的概念

  • 进程/线程同步也是线程/进程之间直接的制约关系
  • 是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待,传递信息所产生的制约关系,尤其是在访问临界资源的时候

同步要弄清是同步通信异步通信还是同步与互斥的同步

3. 五种IO模型

read和write的时候,本质是把数据从用户层拷贝给os,io的过程包括了等+拷贝,如果读写事件没就绪,就会一直阻塞住,所以,要进行拷贝,需要读写事件条件成立。高效的IO,单位时间内,io的过程中,等的比重越小,io效率越高

可以拿钓鱼作为例子

同步阻塞io:在内核数据准备好之前,系统调用一直等待,所有的套接字,默认都是阻塞方式
是最常见的io模型
在这里插入图片描述
以read为例:
进程发起read,进行recvfrom系统调用,同时进程进入阻塞(进程是自己选择阻塞与否),等待数据;内核开始准备数据(从磁盘拷贝到内核缓冲区),进程请求的数据并不是一下就能准备好;准备数据是需要时间的;内核将数据从内核缓冲区拷贝到了用户缓冲区,内核返回结果,进程解除阻塞。也就是说,内核准备数据和数据从内核拷贝到用户空间这两个过程都是阻塞的。

优点:能够及时返回数据,无延迟。调用代码逻辑简单。
缺点:等待浪费很长时间,影响程序性能。

同步非阻塞io:如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码
非阻塞io往往需要再用循环的方式反复尝试读写文件描述符,这个过程称为轮询,这对cpu来说是比较大的浪费,一般只有特定场景下使用
在这里插入图片描述
以read为例:
进程发起read,进行recvfrom系统调用,如果kernel中的数据还没有准备好,就立刻返回一个error;调用返回后进程可以进行其他操作,然后再次发起recvfrom系统调用,不断重复;(这个过程称为轮询polling)kernel中的数据准备好以后,再次收到recvfrom调用,就将数据拷贝到了用户内存,然后返回;需要注意,在数据从内核拷贝到用户内存的过程中,进程仍然是属于阻塞的状态。

优点:能在IO操作的过程中处理其他事物。
缺点:任务完成的响应延迟增大了,因为每过一段时间才去轮询一次read操作,而任务可能在两次轮询之间的任意时间完成。这会导致整体数据吞吐量的降低。

信号驱动io:内核将数据准备好的时候,使用SIGIO信号通知应用程序io操作
在这里插入图片描述先定义io就绪的信号处理方式,当收到通知,表示io就绪,发起io调用完成操作。一般用于udp,tcp该信号产生过于频繁

优点:效率更高,更加及时,充分利用资源(在没有收到io信号之前,可以进行其他任务处理,收到之后再进行io请求)
缺点:io复杂度高,需要正确处理信号操作。数据复制到缓冲区时,仍然会阻塞,性能有待提升

io多路转接:虽然从流程图上看和阻塞io类似,实际上最核心的在于能够同时等待多个文件描述符的就绪状态
在这里插入图片描述
常见的select,poll,epoll都是多路复用,本质上都是同步io,都需要再读写事件就绪后自己负责读写,这个过程是阻塞的

异步io:由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时开始拷贝数据)
在这里插入图片描述

事件驱动型io,用户发起io立即返回,可以处理其他任务,内核等待数据准备完成,然后拷贝到用户内存,当一切都完成后,会给用户进程发送信号,通知完成。两个阶段进程都是非阻塞的

优点:显著提高了系统的整体效率和响应速度,高度利用系统资源,尤其是在高并发的环境下,显著提升系统的吞吐量和性能
缺点:复杂度高,对底层系统依赖性强,需要底层支持

小结:
任何io过程中,都包含两个步骤,第一是等待,第二是拷贝,而且在实际的应用场景中,等待消耗的时间往往都高于拷贝的时间,让io更高效,核心的方法就是让等待的时间尽量少

上面所有可以看出阻塞和非阻塞io的区别是等的方式不同,但还是必须有这个过程。异步和同步看有没有参与io过程,信号驱动虽然没有等,但必须拷贝。异步不参与过程,最后只拿结果

4. 其他高级IO

非阻塞io,记录锁,系统V流机制,I/O多路转接(也叫多路复用),readv和wrotev函数以及存储映射IO(mmap),这些统称为高级IO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值