epoll

浅谈IO

北慕城南 提交于 2021-01-31 19:21:55
IO读写的基本原理 程序进行IO读写依赖于操作系统底层的IO读写,主要为read&write两大系统调用。应用程序无论是调用操作系统的read还是write,都会涉及到缓冲区。具体来说,调用操作系统的read,是把数据从内核缓冲区复制到进程缓冲区 ;而write调用,是把数据从进程缓冲区复制到内核缓冲区。(上层程序的io操作,实际上并没有物理设备级别的读写,而是缓存的复制。这项底层的读写交换,是由操作系统内核(Kernel)来完成的) 主要四种方式的IO模型 同步阻塞IO(BIO) 阻塞IO指的是内核IO操作彻底完完成后,才返回用户空间执行用户的操作。阻塞指的是用户空间程序的执行状态 阻塞期间用户线程一直在等待,基本不会占用CPU资源。 同步非阻塞IO(NIO) 用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间执行用户的操作。内核会立即返回给用户一个状态值。 应用程序的线程需要不断地进行IO系统调用,轮询数据是否已经准备好,如果没有准备好,就继续轮询,直到完成IO系统调用为止 在NIO模型中,应用程序一旦开始IO系统调用,会出现以下两种情况 1. 在内核缓冲区中没有数据的情况下,系统调用会立即返回,返回一个调用失败的信息。 2. 在内核缓冲区中有数据的情况下,是阻塞的,直到数据从内核缓冲复制到用户进程缓冲。复制完成后,系统调用返回成功

并发模型与IO模型梳理

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

How to deal with multiple part network chuncks of data?

落花浮王杯 提交于 2021-01-29 21:00:44
问题 I'm writing a network client for a given protocol using TCP and I'm having having some philosophical issues with the overall architecture of the thing. Sometimes it may happen that I don't have the whole request data and I may need to read a few more bytes than what's available at the moment, and I imagine sometimes I can get parts of another request after the one I want. What's the usual approach in this kind of situations? 回答1: TCP sockets are Stream-Oriented. That means that reading them

How to deal with multiple part network chuncks of data?

巧了我就是萌 提交于 2021-01-29 18:33:15
问题 I'm writing a network client for a given protocol using TCP and I'm having having some philosophical issues with the overall architecture of the thing. Sometimes it may happen that I don't have the whole request data and I may need to read a few more bytes than what's available at the moment, and I imagine sometimes I can get parts of another request after the one I want. What's the usual approach in this kind of situations? 回答1: TCP sockets are Stream-Oriented. That means that reading them

Python中使用epoll开发服务端程序

人盡茶涼 提交于 2021-01-23 06:38:47
这是个很简单的C/S模型的程序,流程其实和C语言相差不大,客户端发送字符串,服务端再将该字符串返回客户端,epoll中使用的边缘触发。 #服务端代码 import socket, logging import select, errno logger = logging.getLogger("network-server") def InitLog(): logger.setLevel(logging.DEBUG) fh = logging.FileHandler("network-server.log") fh.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.ERROR) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch.setFormatter(formatter) fh.setFormatter(formatter) logger.addHandler(fh) logger.addHandler(ch) if __name__ == "__main__": InitLog() try: listen_fd = socket.socket(socket

简单谈谈apache与nginx区别

﹥>﹥吖頭↗ 提交于 2021-01-22 17:39:04
简单的说apache是计算密集型,nginx是io密集型,各有优势,不存在谁取代谁 一、关于Apache与Nginx的优势比较 不断有人跟我说Nginx比Apache好、比Apache快之类。Nginx更主要是作为反向代理,而非Web服务器使用。我翻译过一本关于反向代理的技术书籍,同时精通ApacheAPI开发,对Nginx和Apache的工作原理都略有了解,粗谈一下看法。 不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动。事件驱动其实是很老的技术,早期的select、poll都是如此。后来基于内核通知的更高级事件机制出现,如libevent里的epoll,使事件驱动性能得以提高。事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算。反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。 所以Nginx、Squid都是这样做的。当然,Nginx也可以是多进程+事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁盘IO操作,处理过程一样

Nginx学习

岁酱吖の 提交于 2021-01-19 07:11:52
一、概述 Linux提供稳定的系统资源分配和网络通信基础; Nginx负责对Web Request的解析和分发; Mysql负责对数据的持久化存储; 程序代码负责提供对业务逻辑的实现; 1、Nginx工作原理 为了支持服务端的高并发,nginx采用进程+epoll的异步IO模型; Nginx运行时会有两类进程,master process和Worker process,两者的职责不同: A、Master process负责监听IO事件和对Worker process的管理调度; B、Worker process负责处理IO事件,每个Worker进程相互独立,一个Worker里面可能处理多个IO流(socket fd),linux内核通过epoll机制来支持epoll机制来支持Worker process异步处理多个IO流。 2、正向代理 当需要访问国外的google的时候,但是google被GFW给限制访问叻。这个时候,就需要一台代理服务器,我们先把请求发送到代理服务器,由代理服务器代替我们去向google站点发送请求,并按原路返回请求结果,这就是正向代理。在这个正向代理模型中,代理服务器隔离了服务请求端和服务提供端的直接交互,请求端知道服务端是谁,但是服务端无法知道请求端是谁。 3、反向代理模型 单台服务器无法支撑海量的并发请求,因此构建了一套服务器集群

没搞清楚网络I/O模型?那怎么入门Netty

99封情书 提交于 2021-01-18 17:03:47
本文是Netty系列笔记第2篇 Netty是网络应用框架,所以从最本质的角度来看,是对网络I/O模型的封装使用。 因此,要深刻理解Netty的高性能,也必须从网络I/O模型说起。 看完本文,可以回答这三个问题: 五种I/O模型是什么?核心区别在哪里? 同步=阻塞?异步=非阻塞? Netty的高性能,是采用了哪种I/O模型? 1.掌握五种I/O模型的关键钥匙 Unix系统下的五种基本I/O模型大家应该都有所耳闻,分为: blocking I/O(同步阻塞IO,BIO) nonblocking I/O(同步非阻塞IO,NIO) I/O multiplexing (I/O多路复用) signal driven I/O(信号驱动I/O) asynchronous I/O(异步I/O,AIO) 每种I/O的特性如何,尤其是同步/非同步、阻塞/非阻塞的区别,其实很多人并不能准确地进行区分。 所以,我们先把最核心的“钥匙”告诉大家,带着这把“钥匙”再来看I/O模型的关键问题,就能手到擒来了。 当一次网络IO发生时,主要涉及到 三个对象 : 发起此次IO操作的Process或者Application 系统内核kernel。用户进程无法直接操作I/O设备,必须通过系统内核kernel与I/O设备交互。 I/O设备,包括网络、磁盘等。本文主要针对网络。 真正的I/O过程,主要分为 两个阶段 :

了解红黑树的起源,理解红黑树的本质

一世执手 提交于 2021-01-10 12:54:32
前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下: 实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。 说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早期的Linux内核中就一直存在红黑树的实现,也运用在了更高效的多路复用器Epoll中。 所以,红黑树是每一个程序员不得不会的知识点,甚至有些变态的面试官,还会让你手写红黑树的一部分实现,比如左旋、右旋、插入平衡的过程、删除平衡的过程,这些内容非常复杂,靠死记硬背往往很难彻底掌握。 彤哥也是一直在寻找一种红黑树的记忆法,总算让我找到了那么一种还算不错的方式,从红黑树的起源出发,理解红黑树的本质,再从本质出发,彻底掌握不用死记硬背的方法,最后再把它手写出来。 从本节开始,我也将把这种方法传递给你,因此,红黑树的部分,我会分成三个小节来讲解: 从红黑树的起源,到红黑树的本质 从红黑树的本质,找到不用死记硬背的方法 不靠死记硬背,手写红黑树 好了,下面我们就进入第一小节。 红黑树的起源 二叉树

了解红黑树的起源,理解红黑树的本质

戏子无情 提交于 2021-01-10 12:40:52
关注公众号“彤哥读源码”,解锁更多源码、基础、架构知识! 前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 前面两节,我们一起学习了关于跳表的理论知识,并手写了两种完全不同的实现,我们放一张图来简单地回顾一下: 实现跳表的关键之处是在有序链表的基础上加上各层索引,通过这些索引可以做到O(log n)的时间复杂度快速地插入、删除、查找元素。 说起跳表,我们就不得不提另一种非常经典的数据结构——红黑树,红黑树相对于跳表来说,虽然时间复杂度都是O(log n),但是红黑树的使用场景相对更广泛一些,在早期的Linux内核中就一直存在红黑树的实现,也运用在了更高效的多路复用器Epoll中。 所以,红黑树是每一个程序员不得不会的知识点,甚至有些变态的面试官,还会让你手写红黑树的一部分实现,比如左旋、右旋、插入平衡的过程、删除平衡的过程,这些内容非常复杂,靠死记硬背往往很难彻底掌握。 彤哥也是一直在寻找一种红黑树的记忆法,总算让我找到了那么一种还算不错的方式,从红黑树的起源出发,理解红黑树的本质,再从本质出发,彻底掌握不用死记硬背的方法,最后再把它手写出来。 从本节开始,我也将把这种方法传递给你,因此,红黑树的部分,我会分成三个小节来讲解: 从红黑树的起源,到红黑树的本质 从红黑树的本质,找到不用死记硬背的方法 不靠死记硬背