Linux下的I/O复用
文章平均质量分 95
I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术。
尚先生的博客
这个作者很懒,什么都没留下…
展开
-
Linux Zero-copy技术
转自今日头条零拷贝 (Zero-copy)Zero-copy 是什么?Wikipedia 的解释如下:"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwi转载 2022-05-30 22:23:57 · 458 阅读 · 0 评论 -
Linux I/O 底层原理
本文转载腾讯游戏工程师:Linux I/O底层原理全面揭秘这里向作者致敬,写的非常棒,从技术背景到原理,通俗易懂。三万字长文从虚拟内存、I/O 缓冲区,用户态&内核态以及 I/O 模式等等知识点全面而又详尽地剖析 Linux 系统的 I/O 底层原理,分析了 Linux 传统的 I/O 模式的弊端,进而引入 Linux Zero-copy 零拷贝技术的介绍和原理解析,将零拷贝技术和传统的 I/O 模式进行区分和对比,帮助读者理解 Linux 内核对 I/O 模块的优化改进思路。全网最深度和详转载 2022-05-30 21:51:23 · 718 阅读 · 0 评论 -
深入理解Netty高性能网络框架
大家好,今天我们来聊聊Netty的那些事儿,我们都知道Netty是一个高性能异步事件驱动的网络框架。它的设计异常优雅简洁,扩展性高,稳定性强。拥有非常详细完整的用户文档。同时内置了很多非常有用的模块基本上做到了开箱即用,用户只需要编写短短几行代码,就可以快速构建出一个具有高吞吐,低延时,更少的资源消耗,高性能(非必要的内存拷贝最小化)等特征的高并发网络应用程序。本文我们来探讨下支持Netty具有高吞吐,低延时特征的基石----netty的网络IO模型。由Netty的网络IO模型开始,...转载 2022-01-20 01:39:51 · 523 阅读 · 1 评论 -
彻底学会使用epoll(六)——关于ET的若干问题总结
6.1ET模式为什么要设置在非阻塞模式下工作因为ET模式下的读写需要一直读或写直到出错(对于读,当读到的实际字节数小于请求字节数时就可以停止),而如果你的文件描述符如果不是非阻塞的,那这个一直读或一直写势必会在最后一次阻塞。这样就不能在阻塞在epoll_wait上了,造成其他文件描述符的任务饿死。6.2使用ET和LT的区别LT:水平触发,效率会低于ET触发,尤其在大并发,大流量的情况下。但是LT对代码编写要求比较低,不容易出现问题。LT模式服务编写上的表现是:只要有数据没有被获取,内...转载 2020-12-02 09:22:00 · 487 阅读 · 1 评论 -
彻底学会使用epoll(五)—— ET模式下的注意事项
5.1ET模式下的读写经过前面几节分析,我们可以知道,当epoll工作在ET模式下时,对于读操作,如果read一次没有读尽buffer中的数据,那么下次将得不到读就绪的通知,造成buffer中已有的数据无机会读出,除非有新的数据再次到达。对于写操作,主要是因为ET模式下fd通常为非阻塞造成的一个问题——如何保证将用户要求写的数据写完。要解决上述两个ET模式下的读写问题,我们必须实现:a.对于读,只要buffer中还有数据就一直读;b.对于写,只要buffer还有空间且用户请求写...转载 2020-12-02 09:21:52 · 564 阅读 · 0 评论 -
彻底学会使用epoll(四)——ET的写操作实例分析
首先,看程序四的例子。程序四#include <unistd.h>#include <iostream>#include <sys/epoll.h>using namespace std;int main(void){ int epfd,nfds; struct epoll_event ev,events[5];//ev用于注册事件,数组用于返回要处理的事件 epfd=epoll_create(1);//只需要监听一个描述符——标转载 2020-12-02 09:21:42 · 245 阅读 · 0 评论 -
彻底学会使用epoll(三)——ET的读操作实例分析
首先看程序一,这个程序想要实现的功能是当用户从控制台有任何输入操作时,输出”helloworld!”。程序一#include <unistd.h>#include <iostream>#include <sys/epoll.h>using namespace std;int main(void){ int epfd,nfds; struct epoll_event ev,events[5];//ev用于注册事件,数组用于返回要处理的事件.转载 2020-12-02 09:21:33 · 381 阅读 · 0 评论 -
彻底学会使用epoll(二)——ET和LT的触发方式
分析了ET和LT的实现方式,那么分析他们的触发方式就容易多了。我们通过实现分析知道LT模式下epoll_wait被唤醒可以通过两种方式(图中红线和蓝线),而ET模式只能通过一种方式(图中红线)。所以ET模式下能被唤醒的情况,LT模式下一定也能被唤醒。我们先来讨论特殊情况(ET模式),再来讨论一般情况(LT模式)。2.1ET根据上一节对两种加入rdlist途径的分析,可以得出ET模式下被唤醒(返回就绪)的条件为:l对于读取操作:(1)当buffer由不可读状态变为可读的时候,即由空变为不...转载 2020-12-02 09:21:23 · 300 阅读 · 0 评论 -
彻底学会使用epoll(一)——ET模式实现分析
注:之前写过两篇关于epoll实现的文章,但是感觉懂得了实现原理并不一定会使用,所以又决定写这一系列文章,希望能够对epoll有比较清楚的认识。是请大家转载务必注明出处,算是对我劳动成果的一点点尊重吧。另外,文中如果有不全面或者不正确的地方还请大家指出。1.ET模式实现分析1.1ET和LT的实现区别首先给出下面一张图,这张图是从我之前的一篇博文——epoll实现分析中摘取并细化的。这张图对理解ET模式已经epoll的工作过程只管重要,当然我自己总结出来后也感觉有的小成就,在这里与大家...转载 2020-12-02 09:21:11 · 316 阅读 · 0 评论 -
从select的一个死循环谈epoll的ET模式
最近写程序遇到一个问题,就是发现select监听标准输出的时候遇到了死循环,具体程序如下程序一。程序的意图是每当用户在控制台有任何输入,就输出”helloworld!”。程序一:#include #include #include #include int main(int argc, char *argv[]){ int maxfdp1; char buf[256]; fd_set rset; maxfdp1=STDIN_FI.转载 2020-12-01 11:26:12 · 201 阅读 · 0 评论 -
epoll源码分析(全)
linux-2.6.24.3源代码当系统启动时,epoll进行初始化:static int __init eventpoll_init(void) { mutex_init(&pmutex); ep_poll_safewake_init(&psw); epi_cache = kmem_cache_create(“eventpoll_epi”, sizeof(struct epitem),转载 2020-12-01 11:18:37 · 823 阅读 · 0 评论 -
poll&&epoll实现分析(二)——epoll实现
Epoll实现分析 通过上一章分析,poll运行效率的两个瓶颈已经找出,现在的问题是怎么改进。首先,如果要监听1000个fd,每次poll都要把1000个fd拷入内核,太不科学了,内核干嘛不自己保存已经拷入的fd呢?答对了,epoll就是自己保存拷入的fd,它的API就已经说明了这一点——不是epoll_wait的时候才传入fd,而是通过epoll_ctl把所有fd传入内核再一起"wait",这就省掉了不必要的重复拷贝。其次,在epoll_wait时,也不是把current轮流的加入fd对...转载 2020-12-01 11:05:26 · 260 阅读 · 0 评论 -
poll&&epoll实现分析(一)——poll实现
0.等待队列 在Linux内核中等待队列有很多用途,可用于中断处理、进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。等待队列实现了在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制全。因此,等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒它们。 等待队列由循环链表实现,由等待队列头(wait_queue_head_t)和等待队列项(wait_queue)组成,其元素(等待队列项)包含指向进程描述符的指针。每个等待队列都有一个等待队列头...转载 2020-12-01 09:59:46 · 216 阅读 · 0 评论 -
Epoll模型详解
1.内核中提高I/O性能的新方法epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调用:epoll_create(2),epoll_ctl(2),epoll_wait(2)。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4)isanewAPIintroducedinLinuxkernel2.5.44)Linux2.6内核epoll介绍:先介绍2本书《Th...转载 2020-12-01 09:35:13 · 152 阅读 · 0 评论 -
Linux下的I/O复用与epoll详解
前言 I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术。尽管他们的使用方法不尽相同,但是本质上却没有什么区别。本文将重点探讨将放在EPOLL的实现与使用详解。为什么会是EPOLLselect的缺陷 高并发的核心解决方案是1个线程处理所有连接的“等待消息准备好”,这一点上epoll和select是无争议的。但select预估错误了一件事...转载 2020-11-30 17:40:05 · 114 阅读 · 0 评论