epoll有数据到达时为啥不直接顺便把数据拷到用户空间

telangpujing
telangpujing 09月03日 字数 30

数据达到时内核拷给用户不就完了

22 个回复
hgoldfish
老鱼 09月03日

你需要的是 iocp 哈。

【 在 telangpujing (telangpujing) 的大作中提到: 】

: 数据达到时内核拷给用户不就完了

ylh1969
没谱 09月04日

现在感觉IOCP不错。

【 在 hgoldfish 的大作中提到: 】

: 你需要的是 iocp 哈。

codeAnimal
以后是码农 09月05日

用libevent之类的库

【 在 telangpujing 的大作中提到: 】

: 数据达到时内核拷给用户不就完了

beijing2duck
beijing2duck 09月05日

depends on the platform

heidongstar
heidongstar 09月05日

没有真异步,你需要的是dpdk

libgcc
巭孬嫑夯昆勥茓 09月07日

这个用的不是epoll?

【 在 codeAnimal 的大作中提到: 】

: 用libevent之类的库

hgoldfish
老鱼 09月07日

就是 epoll,而且 libevent 已经过时了,太重。。

redis 在加异步的时候,发现 libevent 的代码量比 redis 自己还多。

【 在 libgcc (承接各种水军业务) 的大作中提到: 】

: 这个用的不是epoll?

leadu
leadu 09月07日

iocp性能比epoll好一丢丢,而且整套功能也更加完善一些。

不过iocp都是25年前的技术了,10年前都开始rio了,linux好像去年抄了一个叫io_uring

【 在 ylh1969 的大作中提到: 】

: 现在感觉IOCP不错。

hgoldfish
老鱼 09月07日

register io 有什么大的改进吗?我只看了一点点 MSDN 的介绍,可能是因为最近心浮气燥没看明白。好像国内的资料也不多,在 bing 里面搜索前几条都是是 io_uring 的,十年前谁能想到巨硬会混到这地步。。

【 在 leadu (leadu) 的大作中提到: 】

: iocp性能比epoll好一丢丢,而且整套功能也更加完善一些。

: 不过iocp都是25年前的技术了,10年前都开始rio了,linux好像去年抄了一个叫io_uring

perduamour
每天爱你多一些 09月07日

https://myslide.cn/slides/12129

【 在 hgoldfish (老鱼) 的大作中提到: 】

: register io 有什么大的改进吗?我只看了一点点 MSDN 的介绍,可能是因为最近心浮气燥没看明白。好像国内的资料也不多,在 bing 里面搜索前几条都是是 io_uring 的,十年前谁能想到巨硬会混到这地步。。

ylh1969
没谱 09月07日

io_uring不知道,学习学习。

性能与具体使用场景相关。在我的场景,估计iocp能够提高几倍的性能。

【 在 leadu 的大作中提到: 】

: iocp性能比epoll好一丢丢,而且整套功能也更加完善一些。

: 不过iocp都是25年前的技术了,10年前都开始rio了,linux好像去年抄了一个叫io_uring

leadu
leadu 09月07日

总的说这些都是网络优化方面的:

最早是windows nt年代,发现线程io模型的问题,然后搞了个iocp解决问题

然后十年前微软好像是通过他的hpc版本发现高速网络下内核是瓶颈了,然后出了rio,尽可能的少唤醒内核和内存提前分配给用户态,同时支持了轮询

之后微软索性就开始扔掉tcp栈参与rdma了,另外还有在主机上硬件加速的版本似乎没有放出来

【 在 hgoldfish 的大作中提到: 】

: register io 有什么大的改进吗?我只看了一点点 MSDN 的介绍,可能是因为最近心浮气燥没看明白。好像国内的资料也不多,在 bing 里面搜索前几条都是是 io_uring 的,十年前谁能想到巨硬会混到这地步。。

codeAnimal
以后是码农 09月07日

linux上默认是epoll,不过他帮用户封装了一层bufferevent,就是通知用户有buffer可读或可写了。相对于epoll通知用户可读可写事件,还让用户自己读写,更易用了一些。

【 在 libgcc 的大作中提到: 】

: 这个用的不是epoll?

codeAnimal
以后是码农 09月07日

libevent代码量和libuv也差不多啊,都五六万行

【 在 hgoldfish 的大作中提到: 】

: 就是 epoll,而且 libevent 已经过时了,太重。。

: redis 在加异步的时候,发现 libevent 的代码量比 redis 自己还多。

academus
academus 09月07日

C# async await,还要啥IOCP!C++啥异步模式都是渣渣!

potator
二篇儿半 09月07日

epoll的意义不在于什么时候拷贝数据

而是在于,释放应用等待接收数据的线程。

【 在 telangpujing 的大作中提到: 】

: 数据达到时内核拷给用户不就完了

lambdai
lambdai 09月08日

epoll其实是调度系统,不拷贝数据的话,本身不要求进程的页可用

如果加上拷贝数据的话,至少要解决以下问题

怎么能在内核上下文中解决用户buffer可写?

notify event的同时notify buffer,需要更多error code组合,咋搞

如果一个fd被多个buffer注册,拷贝到哪里?这本来是用户自己解决的,怎么能合理地把这个机制push到内核里?

我不是搞内核的,以上纯属推断

【 在 telangpujing 的大作中提到: 】

: 数据达到时内核拷给用户不就完了

lambdai
lambdai 09月08日

libevent太通用了,解决了一堆上层应用上很难碰上的问题。比如同一个fd注册成多个event... epoll_add就会直接reject说你别xjb搞

【 在 hgoldfish 的大作中提到: 】

: 就是 epoll,而且 libevent 已经过时了,太重。。

: redis 在加异步的时候,发现 libevent 的代码量比 redis 自己还多。

hgoldfish
老鱼 09月08日

现在大多数人都用了 libev 或者 libuv 了吧。你说的这个在网络库里面属于常规操作。

【 在 lambdai (lambdai) 的大作中提到: 】

: libevent太通用了,解决了一堆上层应用上很难碰上的问题。比如同一个fd注册成多个event... epoll_add就会直接reject说你别xjb搞