epoll

epoll 使用详解

妖精的绣舞 提交于 2019-11-28 09:01:41
epoll简介 epoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。 int epoll_create(int size); 创建一个epoll的句柄,size用来告诉内核需要监听的数目一共有多大。当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close() 关闭,否则可能导致fd被耗尽。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); epoll的事件注册函数,第一个参数是 epoll_create() 的返回值,第二个参数表示动作,使用如下三个宏来表示: EPOLL_CTL_ADD //注册新的fd到epfd中;EPOLL_CTL_MOD /

Web服务器-并发服务器-Epoll(3.4.5)

心不动则不痛 提交于 2019-11-28 07:46:23
目录 1.介绍 2.代码 关于作者 @ 1.介绍 epoll是一种解决方案,nginx就是用的这个 中心思想:不要再使用多进程,多线程了,使用单进程,单线程去实现并发 在上面博客实现的代码中使用过的轮询去查看套接字有没有数据,而epoll是主动通知 当使用多进程的时候,是复制一份资源去查看,epoll不用复制,直接来 优势:1.共享内存 2.事件通知 2.代码 import socket import select def tcp_server(new_tcp_socket, request): request_lines = request.splitlines() print(request_lines) print(">" * 30) try: file = open("./test/login.html", "rb") except: # 构造响应头 response_header = "HTTP/1.1 404 NOT FOUND\r\n" response_header += "\r\n" response_header += "----file not found-----" new_tcp_socket.send(response_header.encode("utf-8")) else: html_content = file.read() file.close(

Java网络编程和NIO详解开篇:Java网络编程基础

社会主义新天地 提交于 2019-11-28 06:34:29
> **微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** ![](https://img-blog.csdnimg.cn/20190808224450997.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E3MjQ4ODg=,size_16,color_FFFFFF,t_70)![cedde63ad8a94ece7aac37190ffe807d1cefc1c2](https://yqfile.alicdn.com/cedde63ad8a94ece7aac37190ffe807d1cefc1c2.png) ## **![](https://img2018.cnblogs.com/blog/1092007/201908/1092007-20190822234541301-1642670833.jpg)** ## 老曹眼中的网络编程基础 转自:https://mp

select,poll,epoll最简单的解释

删除回忆录丶 提交于 2019-11-28 05:29:44
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO 通路选择等硬件有关的知识,但我们只需知道

select,poll,epoll最简单的解释

寵の児 提交于 2019-11-28 05:17:09
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO 通路选择等硬件有关的知识,但我们只需知道

Async connect and disconnect with epoll (Linux)

▼魔方 西西 提交于 2019-11-28 04:26:00
I need async connect and disconnect for tcp client using epoll for Linux. There are ext. functions in Windows, such as ConnectEx, DisconnectEx, AcceptEx, etc... In tcp server standard accept function is working, but in tcp client doesn't working connect and disconnect... All sockets are nonblocking. How can I do this? Thanks! Ambroz Bizjak To do a non-blocking connect(), assuming the socket has already been made non-blocking: int res = connect(fd, ...); if (res < 0 && errno != EINPROGRESS) { // error, fail somehow, close socket return; } if (res == 0) { // connection has succeeded immediately

What is the best epoll/kqueue/select equvalient on Windows?

狂风中的少年 提交于 2019-11-28 03:28:37
What is Windows' best I/O event notification facility? By best I mean something that ... doesn't have a limit on number of input file descriptors works on all file descriptors (disk files, sockets, ...) provides various notification modes (edge triggered, limit triggered) Chris Smith In Windows, async operations are done by file operation, not by descriptor. There are several ways to wait on file operations to complete asynchronously. For example, if you want to know when data is available on a network socket, issue an async read request on the socket and when it completes, the data was

Why is epoll faster than select?

半城伤御伤魂 提交于 2019-11-28 02:40:13
I have seen a lot of comparisons which says select have to walk through the fd list, and this is slow. But why doesn't epoll have to do this? David Schwartz There's a lot of misinformation about this, but the real reason is this: A typical server might be dealing with, say, 200 connections. It will service every connection that needs to have data written or read and then it will need to wait until there's more work to do. While it's waiting, it needs to be interrupted if data is received on any of those 200 connections. With select , the kernel has to add the process to 200 wait lists, one for

Redis之事件模型

蓝咒 提交于 2019-11-27 19:11:26
介绍 Memcached的底层网络驱动部分直接使用了libevent,其实Redis使用libevent也是可以,仅仅使用其 event_base 完全可以行得通。但是作者为什么需要自己造个轮子,可能作者觉得 libevent 封装得过于复杂实现的功能过多吧。这里区别一下Redis作者的 ae.c 和libevent的区别吧: libevent统一了三种事件的处理,IO事件、时间事件和信号事件,并且每个事件可以注册多个回调函数,事件之间具有优先级关系 (通过将就绪链表依据优先级设定为多条实现) 。而Redis仅仅统一了IO事件和事件事件,且一个事件fd只能注册一个回调函数,并且IO事件之间不具备优先级,按照epoll返回顺序依次执行。因此Redis的封装更加简单明了。 二者都是通过Reactor模式封装epoll了,所以实现起来,基本就是对一个大结构体操作。所以很容易实现。 再次发现,Redis的作者很喜欢造轮子。 实现 1、事件分发器及IO事件、定时事件结构体 通过三个结构体,直接看清楚这种Reactor模式实现起来多么容易。 时间事件通过单链表存储,内部存储距离1970年1月1日00:00:00的秒及微妙。每次时间事件是否需要处理就是通过获取当前时间,与存储的时间简单比较而已。因为先处理IO事件,所以加上处理IO事件的时间,就会导致时间事件的处理稍微推迟

并发模型与IO模型梳理

坚强是说给别人听的谎言 提交于 2019-11-27 19:02:16
并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见。由于go语言的兴起,CSP模型也越来越受关注。基于锁的共享内存模型与后两者的主要区别在于,到底是通过共享内存来通信,还是通过通信来实现访问共享内存。由于actor模型和CSP模型,本人并不是特别了解,我主要说说最基本的并发模型,基于线程与锁的内存共享模型。 为什么要并发,本质都是为了充分利用多核CPU资源,提高性能。但并发又不能乱,为了保证正确性,需要通过共享内存来协调并发,确保程序正确运转。无论是多进程并发,还是多线程并发,要么通过线程间互斥同步(spinlock,rwlock,mutex,condition,信号量),要么通过进程间通信(共享内存,管道,信号量,套接字),本质都是为了协同。多线程和多进程本质类似,尤其是linux环境下的pthread库,本质是用轻量级进程实现线程。下面以网络服务为例,简单讨论下多线程模型的演进。 最简单的模型是单进程单线程模型,来一个请求处理一个请求,这样效率很低,也无法充分利用系统资源。那么可以简单的引入多线程,其中抽出一个线程监听,每来一个请求就创建一个工作线程服务,多个请求多个线程,这就是多线程并发模型。这种模式下,资源利用率是上去了,但是却有很多浪费,线程数与请求数成正比,意味着频繁的创建/销毁线程开销