文档章节

关于epoll的IO模型是同步异步的一次纠结过程

mickelfeng
 mickelfeng
发布于 2017/07/19 17:32
字数 672
阅读 270
收藏 0

这是一次概念的纠结过程,对写代码没有太大意义。

过程是这样的:

首先,我的概念里往往只有同步和异步,没有太多去区别同异步IO和同异步通知两种。

另外还记得apu(2rd)中有一句“select和poll可以实现异步形式的通知”。

接着,听到了epoll是同步IO这个概念,比较意外。坚持了一下后,查到如下概念:

在unp(3rd)里的定义是:

第一是IO操作的概念:

IO操作包括:

1.等待数据准备好。

2.从内核到进程拷贝数据。

第二就是是同步IO和异步IO的区别:

同步IO导致请求进程阻塞,直到IO操作完成。

异步IO不导致请求进程阻塞。

得到的结论:

阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型都是同步IO。

epoll也是IO复用模型,应该是同步IO。

此时又意外了,再看到一个解释:

更为重要的是, epoll 因为采用 mmap的机制, 使得 内核socket buffer和 用户空间的 buffer共享, 从而省去了 socket data copy, 这也意味着, 当epoll 回调上层的 callback函数来处理 socket 数据时, 数据已经从内核层 "自动" 到了用户空间, 虽然和 用poll 一样, 用户层的代码还必须要调用 read/write, 但这个函数内部实现所触发的深度不同了.

用 poll 时, poll通知用户空间的Appliation时, 数据还在内核空间, 所以Appliation调用 read API 时, 内部会做 copy socket data from kenel space to user space.

而用 epoll 时, epoll 通知用户空间的Appliation时?, 数据已经在用户空间, 所以 Appliation调用 read API 时?, 只是读取用户空间的 buffer, 没有 kernal space和 user space的switch了.

于是想了一下:

明显没有IO操作的拷贝数据到内核空间了,stevens应该在99年就挂了,2.6内核的epoll才采用mmap机制,书籍偏旧了吧。

那么epoll是异步IO了吧。

然后再一看,你妹的,这还是不符合异步IO啊,毕竟epoll在告知OK前,是阻塞了,虽然是拷贝数据结束了。

看来好像应该修正的是IO操作定义的第二步才对,而不是那个区别。

好吧,你就暂时属于同步IO了,专心看代码,不纠结概念了。

 

http://blog.chinaunix.net/uid-52437-id-2108895.html

https://www.ibm.com/developerworks/cn/linux/l-async/

 

本文转载自:http://blog.chinaunix.net/uid-14874549-id-3487338.html

mickelfeng

mickelfeng

粉丝 237
博文 2790
码字总数 604314
作品 0
成都
高级程序员
私信 提问
关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO,MQ的总结

RabbitMQ, ZeroMQ, Kafka等MQ则是基于异步的封装插件。 但是IOCP是对于SOCKET的封装,而MQ一般是对于普通消息的封装,应该不是同一个事情。 相关资料 IO基本概念 Linux环境 Linux的内核将所有...

andrewniu
2018/05/08
0
0
IO多路复用原理剖析

(最近笔试遇到笔试题:select,poll,epoll都是IO多路复用的机制)。 I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应...

Panda_Jerry
2017/11/01
0
0
Netty精粹之JAVA NIO开发需要知道的

学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下。Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基...

Float_Luuu
2016/02/07
14.8K
3
同步异步阻塞非阻塞网络IO模型select/epoll

总结记录一波 同步、异步、阻塞、非阻塞、异步I/O、select、poll、epoll等等,纯粹纯粹纯粹为了应付面试哈。 1 同步与异步 1.1 概念描述 。要么成功都成功,失败都失败,两个任务的状态可以保...

努力的C
2017/10/09
0
0
阻塞非阻塞,同步异步,select、poll和epoll总结

参考文章 IO模型 阻塞IO 非阻塞IO IO多路复用 信号驱动IO 异步IO 其中前4种是同步,第5种是异步 在进行网络IO的时候会涉及用户态和内核态,数据会在用户态和内核态发生交换。 整个过程可以分...

qq_17612199
2018/05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
9分钟前
2
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
9分钟前
2
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
14分钟前
2
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
14分钟前
2
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部