io复用技术

同步和异步
同步和异步的主要却别在于用户线程和内核的交互方式

同步:用户线程发起IO请求,会一直等待或者不断的轮询内核IO操作,指导IO操作完成,用户线程才可以继续执行

异步:用户线程发起IO请求后会立即返回,转而去执行其他的操作,当内核完成IO操作后,会通过回调的方式通知用户,用户线程此时在回来继续执行接下来的操作

阻塞和非阻塞
阻塞和非阻塞的区别在于用户线程对内核IO操作的方式
阻塞:IO操作必须完成后才返回用户空间,必须read函数,没有读取数据之前会一直阻塞
非阻塞:IO操作不必等到完成才返回,而是,立即返回给用户一个状态,

同步阻塞模型:
在这里插入图片描述
用户线程调用阻塞函数读取数据,阻塞函数在没有数据可读之前会一直阻塞不返回,此时用户线程处于等待的状态(同步),当有数据可读时,read读取数据,并返回用户空间,伪代码:

{
 read(buffer)阻塞
 process(buffer)
}

同步非阻塞,
在这里插入图片描述
在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费

通过上述两张图可以看出,同步与异步的在于用户线程,阻塞与非阻塞在于read读取数据的方式

异步阻塞IO:
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!,但是IO的读取还是由用户来完成,而异步非阻塞,IO的操作不许用户完成是由内核完成,用户线程接到通知时,是IO操作已经完成了,这是异步阻塞和异步非阻塞的最大区别就是IO的读取写入小左究竟由谁来完成

异步非阻塞IO:
在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了

IO多路复用

select、poll、epoll

select:
select函数本身就是一个阻塞函数,所以也是阻塞模式,不过不是阻塞在数据读取上的read/write函数,而是阻塞在select对文件描述符的监听上,select的只能监听有限的文件描述符,虽然可以修改系统限制,但会带来不可预知的后果,并且select每次返回都会修改文件描述符集,所以每次循环,都的重新设置,poll模式稍微比select智能一些,poll通过一个结构体,吧文件描述符和监听的事件整合在一起,并且返回只会修改结构体中的revent,而不会修改poll中的监听的描述符集,但是笨死上和select一样,epoll就从本质上和select、poll有区别,首先,epoll是通过一批函数来控制监听描述符,并且将监听的文件描述符注册到内核注册表中,在内核注册表中,通过回调的方式来读取数据,当epoll返回时,可以直接读取返回的描述符,而select、poll返回时将所有监听的描述符返回,所以还需在这些文件描述符中,查询出就绪的描述符,而epoll返回的就是已经就绪的文件描述符,无需查询
在这里插入图片描述

IO多路复用模型使用了Reactor设计模式实现了这一机制
异步IO模型使用了Proactor设计模式实现了这一机制
其实Reactor和Proactor最大的区别在于数据由谁来读

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值