epoll

Linux IO模式及 select、poll、epoll详解

强颜欢笑 提交于 2020-04-20 18:48:08
https://segmentfault.com/a/1190000003063859 注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。 一 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进程的阻塞 - 文件描述符 - 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。 进程切换 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程

同步阻塞IO,同步非阻塞IO,异步IO,IO多路复用

余生颓废 提交于 2020-04-19 15:40:53
同步异步是一个概念,阻塞与非阻塞是另一个概念,多路复用又是另一个概念。相互联系,但是概念不同 同步与异步 同步:当一个进程需要执行I/O操作时,如果进程需要一直等待操作结果的返回,甚至被挂起,那么这就属于同步的范畴。(php的IO基本都是同步) 异步:如果在等待I/O结果返回的过程中,进程可以执行其他代码,那么这就属于异步(JS/NodeJs的IO支持异步和同步,一般都使用异步。比如 ajax ) 阻塞与非阻塞 要注意的一点是,如果一份任务采用 异步模型 ,那么它肯定是非阻塞的,同步模型才需要讨论阻塞与非阻塞。 阻塞:如果等待I/O的过程中,进程挂起,直到内核返回信息说I/O执行完毕,进程才继续执行接下来的代码,那么就属于阻塞 非阻塞:如果在等待I/O过程中,进程没有挂起,可以执行其他操作,但是每隔一段时间得主动去询问内核I/O执行完毕没有,那么就属于非阻塞 同步非阻塞与异步很相像,区别就在于当前进程需不需要去向内核询问I/O执行完毕了没有 多路复用 同步的IO方案。其中有 select 、 poll 、 epoll 。 多路复用既有阻塞也有非阻塞。这里阻塞是需要挂起等待就绪的IO事件(等待就绪阶段),非阻塞是读写的时候是非阻塞的(数据处理阶段)。 在等待就绪阶段, select 、 poll 、 epoll 使用不同的方式。 前两种底层使用同步非阻塞的轮询; 后者 epoll

曹工说Redis源码(6)-- redis server 主循环大体流程解析

若如初见. 提交于 2020-04-19 11:56:33
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读。由于我用c也是好几年以前了,些许错误在所难免,希望读者能不吝指出。 曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果 曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充 曹工说Redis源码(3)-- redis server 启动过程完整解析(中) 曹工说Redis源码(4)-- 通过redis server源码来理解 listen 函数中的 backlog 参数 曹工说Redis源码(5)-- redis server 启动过程解析,以及EventLoop每次处理事件前的前置工作解析(下) 本讲主题 先给大家复习下前面一讲的功课,大家知道,redis 基本是单线程,也就是说,假设我们启动main方法的,是线程A,那么,最终,去处理客户端socket连接、读取客户端请求、以及向客户端socket写数据,也还是线程A。 同时,大家想必也知道,redis 里还是有一些后台任务要做的,比如: 字典的rehash(rehash的意思是,redis 里,字典结构

IO 模型知多少

╄→尐↘猪︶ㄣ 提交于 2020-04-17 03:01:31
【推荐阅读】微服务还能火多久?>>> 1. 引言 同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题。比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型,分别用来解决问题?常用的框架采用的是何种I/O模型?各种IO模型的优劣势在哪里,适用于何种应用场景? 简而言之,对于I/O的认知,不能仅仅停留在字面上认识,了解内部玄机,才能深刻理解I/O,才能看清I/O相关问题的本质。 2. I/O 的定义 I/O 的全称是Input/Output。虽常谈及I/O,但想必你也一时不能给出一个完整的定义。搜索了谷歌,发现也尽是些冗长的论述。要想厘清I/O这个概念,我们需要从不同的视角去理解它。 2.1. 计算机视角 冯•诺伊曼计算机的基本思想中有提到计算机硬件组成应为五大部分:控制器,运算器,存储器,输入和输出。其中输入是指将数据输入到计算机的设备,比如键盘鼠标;输出是指从计算机中获取数据的设备,比如显示器;以及既是输入又是输出设备,硬盘,网卡等。 用户通过操作系统才能完成对计算机的操作。计算机启动时,第一个启动的程序是操作系统的内核,它将负责计算机的资源管理和进程的调度。换句话说:操作系统负责从输入设备读取数据并将数据写入到输出设备。 所以I/O之于计算机,有两层意思: I/O设备 对I/O设备的数据读写

Python IO model

两盒软妹~` 提交于 2020-04-16 16:47:07
【推荐阅读】微服务还能火多久?>>> 1、 事件驱动模型 传统线性模式编程:开始--->代码块A--->代码块B--->代码块C--->结束 1 每一个代码块里是完成各种各样事情的代码,但编程者知道代码块A,B,C,D...的执行顺序,唯一能够改变这个流程的是数据。输入不同的数据,根据条件语句判断,流程或许就改为A--->C--->E...--->结束。每一次程序运行顺序或许都不同,但它的控制流程是由输入数据和你编写的程序决定的。如果你知道这个程序当前的运行状态(包括输入数据和程序本身),那你就知道接下来甚至一直到结束它的运行流程。 View Code 事件驱动型程序模型:开始--->初始化--->等待 1 与传统编程模式不同,事件驱动程序在启动之后,就在那等待被事件触发。传统编程下也有“等待”的时候,比如在代码块D中,你定义了一个input(),需要用户输入数据。但这与下面的等待不同,传统编程的“等待”,比如input(),你作为程序编写者是知道或者强制用户输入某个东西的,或许是数字,或许是文件名称,如果用户输入错误,你还需要提醒他,并请他重新输入。事件驱动程序的等待则是完全不知道,也不强制用户输入或者干什么。只要某一事件发生,那程序就会做出相应的“反应”。这些事件包括:输入信息、鼠标、敲击键盘上某个键还有系统内部定时器触发。 View Code 1.1论事件驱动模型

Netty-JAVA基础实现,AIO基础

拜拜、爱过 提交于 2020-04-16 08:08:12
【推荐阅读】微服务还能火多久?>>> AIO是在NIO基础上实现的异步非阻塞通信 Windows下提供了IOCP技术,I/O Completion Port,称为I/O完成端口。IOCP是一个消息队列。当监听到客户请求的时候就把请求加到消息队列中。然后已有的线程去逐一处理,处理完成后需要得到反馈的工作线程就会收到通知,然后前去处理。当没有请求加入到消息队列的时候,相应的线程也就处理挂起的状态进行等待。 所以Windows下算是有实际意义上的异步非阻塞 同步异步是消息通信的机制 阻塞非阻塞是事件处理 阻塞:死等着被调用方回信,中间什么不干 非阻塞:没收到被调用方回信时,中间干点别的 同步:一会儿一趟,没有结果就反复问 异步:问完等对方通知反馈 同步阻塞:到服务台反复问讯,死等服务生反馈 同步非阻塞:到服务台反复问询,在等服务生反馈期间玩手机 异步阻塞:到服务台问讯,死等服务生反馈,服务生确认后通知我 异步非阻塞:到服务台问询,问完就玩手机去了,服务生确认后通知我 Linux用epoll进行相关实现 AIO服务端实现 package netty.aio; /** AIO模式服务端实现 @author zhousjmas@hotmail.com */ public class AIOSocketServerMain { public static void main(String[]

Apache服务安装及工作模式介绍

大兔子大兔子 提交于 2020-04-16 08:02:34
【推荐阅读】微服务还能火多久?>>> 我们都知道Linux上常见的web服务器有:apache、nginx、tomcat! 其区别如下: * apache:模块化服务器,支持模块较多、采用servlet处理模型,同步阻塞模型,工作模式多变,对于高并发的场景处理速度会比较慢,运行稳定。 * nginx:轻量级web服务器,自身支持模块较少,需要借助第三方模块支持,采用epoll处理模型,异步非阻塞型,适合高并发场景,配置简单。 * tomcat:apache软件基金会下开源的子项目,也称为容器,主要处理java语言编写的页面,也可以处理html页面,并发连接小。 一、apache服务器的安装及功能介绍 apache服务2.4版本功能介绍: * MPM支持在运行时装载,支持envet工作模式; * 支持异步读写; * 每个模块可以指定输出的日志级别 ; * 增强版的表达式分析器,通过正则匹配表达式,做动静分离 .html .php; * 请求配置:<if> <Elseif>; * 毫秒级别的keep alive timeout; * 支持FQDN的虚拟主机 FQDN:全球限定域名,可以通过host主机名来定义虚拟主机; * 支持自定义变量; 依赖包: https://pan.baidu.com/s/14-m7p9_2a6UPdvjRPfjLjQ 提取码: xnrj

LVS、Nginx和HAProxy负载均衡器对比

◇◆丶佛笑我妖孽 提交于 2020-04-15 13:56:54
【推荐阅读】微服务还能火多久?>>> LVS特点: 1.抗负载能力强,使用IP负载均衡技术,只做分发,所以LVS本身并没有多少流量产生; 2.稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived) 3.应用范围比较广,可以对所有应用做负载均衡; 4.不支持正则处理,不能做动静分离。 常用四种算法: 1.rr:轮询,轮流分配到后端服务器; 2.wrr:权重轮叫,根据后端服务器负载情况来分配; 3.lc:最小连接,分配已建立连接最少的服务器上; 4.wlc:权重最小连接,根据后端服务器处理能力来分配。 可以采用ipvsadm –p(persistence)来保持session,默认是300/s Nginx特点: 1.可工作在七层或四层,可以对做正则规则处理;(如:针对域名、目录进行分流) 2.配置简单,能ping通就能进行负载功能,可以通过端口检测后端服务器状态,不支持url检测; 3.抗高并发,采用epoll网络模型处理客户请求; 4.只支持HTTP和EMail,应用范围比较少; 5.nginx主要是HTTP和反向代理服务器,低系统资源消耗。 常用四种算法: 1.rr:(默认)轮询,轮流分配到后端服务器; 2.weight:根据后端服务器性能分配; 3.ip_hash:每个请求按访问ip的hash结果进行分配,并发小时合适,解决session问题; 4.fair

IO操作与IO模型

纵然是瞬间 提交于 2020-04-15 10:59:46
【推荐阅读】微服务还能火多久?>>> 目录 一 、IO操作本质 二、 IO模型 BIO – 阻塞模式I/O NIO – 非阻塞模式I/O IO Multiplexing - I/O多路复用模型 AIO – 异步I/O模型 三、同步I/O与异步I/O 四、 IO设计模式 Reactor模式 Proactor模式 对比分析 一 、IO操作本质 数据复制的过程中不会消耗CPU # 1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作、网络请求加载到内存的数据一开始是放在内核缓冲区的 二、 IO模型 BIO – 阻塞模式I/O 用户进程从发起请求,到最终拿到数据前,一直挂起等待; 数据会由用户进程完成拷贝 ''' 举个例子:一个人去 商店买一把菜刀, 他到商店问老板有没有菜刀(发起系统调用) 如果有(表示在内核缓冲区有需要的数据) 老板直接把菜刀给买家(从内核缓冲区拷贝到用户缓冲区) 这个过程买家一直在等待 如果没有,商店老板会向工厂下订单(IO操作,等待数据准备好) 工厂把菜刀运给老板(进入到内核缓冲区) 老板把菜刀给买家(从内核缓冲区拷贝到用户缓冲区) 这个过程买家一直在等待 是同步io ''' NIO – 非阻塞模式I/O 用户进程发起请求,如果数据没有准备好,那么立刻告知用户进程未准备好

如何设计一个大规模远程命令执行系统

血红的双手。 提交于 2020-04-14 00:23:18
【今日推荐】:为什么一到面试就懵逼!>>> 本文作者:AIOps智能运维 干货概览 书接前文,在上一篇文章中我们介绍了大规模命令执行的意义以及所面对的问题和困难,简单介绍了百度集群控制系统(Cluster Control System,以下简称CCS系统)通过构建两级数据模型、四级调度模型、三级代理执行的方式解决了这些问题,在本篇文章中,我们将续接前文,继续对CCS系统的设计实现进行详细剖析。 两级数据模型 设计考量 回顾前文,在面临的需求中我们提到,需要在大规模的服务器上执行命令并且能够灵活控制。为了满足这样的需求,建立数据模型时,只有执行信息是不够的,还要有控制信息,如路由、并发度、暂停点等,两者组合在一起,构成了CCS系统中的数据模型。 控制信息 控制信息包括命令传递所需的“路由”信息和调度过程的控制信息,如下: 目标机器:命令执行的目标服务器列表,可以是IP,也可以是Hostname。 并发程度:分组并发执行时每组的机器数量,用于控制分组执行,避免系统升级时所有服务器同时升级造成业务中断。 暂停节点:指定执行到第几台服务器时暂停执行,方便先操作几台服务器并确认没问题后再继续执行,若有问题也可将问题控制在小范围内。 执行信息 执行信息是指命令到达目标机器后开始执行时所必需的信息,如下: 认证信息:标示执行者是谁的信息,用来确认执行者的合法性,如不合法则拒绝执行。 鉴权信息