同步与异步、阻塞与非阻塞

1. 我理解的不同

阻塞与非阻塞 是指请求者发起请求后,能否自由地执行其它任务。

阻塞情况,请求者必须卡在获取执行结果处,不能有其他操作。

非阻塞情况,请求者提出请求后,可以【自由地】执行其他任务。

同步与异步 是指请求发起后,请求结果的告知方式。

同步情况,请求结果必须由请求者【主动地】查询,获取结果。

异步情况,请求结果准备好后,会发出signal或者执行回调函数,通知请求者结果,请求者【被动地】得到结果。(所以异步一定有回调)


我理解,后台服务器中常讨论的服务异步化”,其实是服务的”非阻塞化“。将服务的耗时逻辑(如I/O)放到线程池执行,当前线程可以并行做其他工作。但是,最后当前线程还是从future中【主动地】get执行结果,所以还是一种同步的操作。

2. 转载的5种IO的概述

对linux系统中的五种IO模型想做一个简单概述。

第一种阻塞式IO,顾名思义应用读取IO时,需要阻塞式的等待IO返回

第二种非阻塞IO,需要读取的IO如果还未正真准备好,接口会直接返回失败。不阻塞

第三种IO多路复用,最大的好处就在于单个process就可以同时处理多个网络连接的IO,

它的基本原理就是轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程,

基本的实现由select,poll,epoll着三种

简单对比的话

select是通过fdset来去实现,单个队列有1024的

select(fdset)和poll(pollfd)都需要在数据返回后,通过遍历文件描述符来获取已经就绪的socket。

epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。

在效率方面,epoll采用mmap内存(zero copy)模型,并且支持LT和ET两种工作模式来达到高效率的处理IO时间。

第四种是信号驱动IO:实际中并不常用在这里不做描述。

第五种:Linux下的asynchronous IO其实用得很少,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

目前并不成熟。glibc 的 aio 有 bug , kernel 的 aio 只能以 O_DIRECT 方式做直接 IO , libeio 也是 beta 阶段。epoll 是成熟的,但是 epoll 本身是同步的。Linux 上目前没有像 IOCP 这样的成熟异步 IO 实现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值