epoll

I/O多路复用

我怕爱的太早我们不能终老 提交于 2020-04-05 19:52:34
一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力 。 就像下面这张图的前半部分一样,中间的那条线就是我们的 单个线程 ,它通过记录传入的每一个I/O流的状态来同时管理多个IO。 multiplexing NIO同步非阻塞式IO 对比 BIO的同步阻塞IO操作 ,实际上NIO是同步非阻塞IO,一个线程在同步的进行轮询检查,Selector不断轮询注册在其上的Channel,某个Channel上面发生读写连接请求,这个Channel就处于就绪状态,被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。 同步和异步说的是消息的通知机制,这个线程仍然要定时的读取stream,判断数据有没有准备好,client采用循环的方式去读取(线程自己去抓去信息),CPU被浪费。 非阻塞:体现在,这个线程可以去干别的,不需要一直在这等着。Selector可以同时轮询多个Channel,因为JDK使用了epoll()代替传统的select实现,没有最大连接句柄限制。所以只需要一个线程负责Selector的轮询,就可以接入成千上万的客户端。 AIO 是在NIO的基础上引入异步通道的概念,实现 异步非阻塞式的IO处理 。 AIO不需要通过多路复用器对注册的通道进行轮询操作即可实现异步读写。什么意思呢?

Android 8.1 源码_启动篇(一) -- 深入研究 init(转 Android 9.0 分析)

狂风中的少年 提交于 2020-04-05 19:11:10
前言 init进程,它是一个由内核启动的用户级进程,当Linux内核启动之后,运行的第一个进程是init,这个进程是一个守护进程,确切的说,它是Linux系统中用户控件的第一个进程,所以它的进程号是1。它的生命周期贯穿整个linux 内核运行的始终, linux中所有其它的进程的共同始祖均为init进程。 开篇 核心源码 Android 版本 关键类 路径 8.1 init.rc system/core/rootdir/init.rc 8.1 init.cpp system/core/init/init.cpp 8.1 property_service.cpp system/core/init/property_service.cpp 8.1 init_parser.h system/core/init/init_parser.h 8.1 init_parser.cpp system/core/init/init_parser.cpp 8.1 log.cpp system/core/init/log.cpp 8.1 logging.cpp system/core/base/logging.cpp 8.1 property_service.cpp system/core/init/property_service.cpp 8.1 signal_handler.cpp system

Is epoll thread-safe?

落花浮王杯 提交于 2020-04-05 07:32:33
问题 There are two functions in epoll: epoll_ctl epoll_wait Are they thread-safe when I use the same epoll_fd? What will happen if one thread calls epoll_wait and others call epoll_ctl at the same time? 回答1: It is thread-safe, but there isn't much documentation that explicitly states that - see http://linux.derkeiler.com/Mailing-Lists/Kernel/2006-03/msg00084.html BTW, you can also have multiple threads waiting on a single epoll_fd, but in that case it can get a bit tricky (i.e. you might want to

Is epoll thread-safe?

試著忘記壹切 提交于 2020-04-05 07:32:05
问题 There are two functions in epoll: epoll_ctl epoll_wait Are they thread-safe when I use the same epoll_fd? What will happen if one thread calls epoll_wait and others call epoll_ctl at the same time? 回答1: It is thread-safe, but there isn't much documentation that explicitly states that - see http://linux.derkeiler.com/Mailing-Lists/Kernel/2006-03/msg00084.html BTW, you can also have multiple threads waiting on a single epoll_fd, but in that case it can get a bit tricky (i.e. you might want to

Nginx底层原理:Nginx为什么并发数可以达到3w?

倾然丶 夕夏残阳落幕 提交于 2020-03-27 11:34:45
3 月,跳不动了?>>> Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。本文从底层原理分析 Nginx 为什么这么快! 1、Nginx 的进程模型 Nginx 服务器,正常运行过程中: 多进程:一个 Master 进程、多个 Worker 进程。 Master 进程:管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。 Worker 进程:所有 Worker 进程都是平等的。实际处理:网络请求,由 Worker 进程处理。Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。 思考: 请求是连接到 Nginx,Master 进程负责处理和转发? 如何选定哪个 Worker 进程处理请求?请求的处理结果,是否还要经过 Master 进程? HTTP 连接建立和请求处理过程 如下: Nginx 启动时,Master 进程,加载配置文件。 Master 进程,初始化监听的 Socket。 Master 进程,Fork 出多个 Worker 进程。 Worker 进程

nio--自己总结

纵饮孤独 提交于 2020-03-25 15:42:29
阻塞/非阻塞 + 同步/异步 其实,这两者存在本质的区别,面向的对象是不同的。 阻塞/非阻塞:进程/线程需要操作的数据如果尚未就绪, 是否妨碍了当前进程/线程的后续操作 。 同步/异步:数据如果尚未就绪, 被调用方是否需要拿到数据结果再返回 。 reactor: 通知我有就绪状态了, preactor:通知我数据已经从内核拷贝到了用户空间。 1.同步与异步 同步和异步关注的是 消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由*调用者*主动等待这个*调用*的结果。 而异步则是相反, *调用*在发出之后 ,这个调用就直接返回了,所以没有返回结果 。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。 典型的异步编程模型比如Node.js 举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。 而异步通信机制,书店老板直接告诉你我查一下啊

Nginx中accept锁的机制与实现

纵然是瞬间 提交于 2020-03-24 02:07:33
前言   nginx采用多进程的模,当一个请求过来的时候,系统会对进程进行加锁操作,保证只有一个进程来接受请求。   本文基于Nginx 0.8.55源代码,并基于epoll机制分析   1. accept锁的实现   1.1 accpet锁是个什么东西   提到accept锁,就不得不提起惊群问题。   所谓惊群问题,就是指的像Nginx这种多进程的服务器,在fork后同时监听同一个端口时,如果有一个外部连接进来,会导致所有休眠的子进程被唤醒,而最终只有一个子进程能够成功处理accept事件,其他进程都会重新进入休眠中。这就导致出现了很多不必要的schedule和上下文切换,而这些开销是完全不必要的。   而在Linux内核的较新版本中,accept调用本身所引起的惊群问题已经得到了解决,但是在Nginx中,accept是交给epoll机制来处理的,epoll的accept带来的惊群问题并没有得到解决(应该是epoll_wait本身并没有区别读事件是否来自于一个Listen套接字的能力,所以所有监听这个事件的进程会被这个epoll_wait唤醒。),所以Nginx的accept惊群问题仍然需要定制一个自己的解决方案。   accept锁就是nginx的解决方案,本质上这是一个跨进程的互斥锁,以这个互斥锁来保证只有一个进程具备监听accept事件的能力。  

nginx安装

*爱你&永不变心* 提交于 2020-03-21 20:02:44
一 、nginx http服务器的特色及优点 1、支持高并发:能支持几万并发连接 2、资源消耗少:在3完并发连接下,开启10个nginx线程消耗内存不到200MB 3、可以做http反向代理及加速缓存,即负载均衡,内置对RS节点服务健康检查功能 4、具备Squid等专业缓存软件的缓存功能 5、支持异步网络I/O事件模型epoll 二 、select和epoll对比 select和epoll对比如下表所示 select epoll 性能 随着连接数增加,急剧下降。处理成千上万并发连接数时,性能很差。 随着连接数增加,性能基本上没有下降。处理成千上万并发连接时,性能很好。 连接数 连接数有限制,处理的最大连接数不超过1024。如果要处理超过1024个连接数,则需要修改FD_SETSIZE宏,并重新编译 。 连接数无限制。 内在处理机制 线性轮询 回调callback 开发复杂性 低 中 三、nginx安装 安装nginx需安装pcre 、pcre-devel 、Open-ssl-devel useradd nginx –s /sbin/nginx -M [root@serverNFS_A nginx-1.6.3]# ./configure --prefix=/application/nginx-1.6.3 \ --user=nginx \ --group=nginx \ --with

计算机网络需要分层?难道是多此一举

て烟熏妆下的殇ゞ 提交于 2020-03-17 08:27:06
某厂面试归来,发现自己落伍了!>>> 多点头发,少点代码 我是龙叔,一个分享互联网技术和心路历程的大叔 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 最近很忙,写技术文章还是很花费时间的。但是,就在前几天出了一篇TCP粘包问题的文章 ( TCP粘包,难道说这是一个伪命题??? ),反映不错。本来计划计算机网络文章慢慢的出,现在看来必须的加快速度了。 龙叔在学习网络的时候有这样几个疑惑: 为什么需要抽象出五层模型出来? 难道不是直接在网线(光纤传输)中传输数据就好了么?大不了到了 端点 用的是WIFI传输(无线信号)。 这两个问题真的很困惑我,不知道大家有没有这样的疑惑?如果有的话,龙叔将为你答疑解惑。如果有其他的疑惑欢迎加我微信沟通 (公众号回复【龙叔】即可获得龙叔的联系方式)。 在回答问题之前我先带你领略下使用最为广泛的五层模型,分别是哪五层?各层解决了什么问题? 五层模型是哪五层? 网络模型 左边是OSI的七层模型,这模型很牛逼。但是现在基本是存在教科书的啦,学习网络的同学都是知道有这个模型,实际情况使用很少的。 右边是TCP/IP五层分层模型。分别是物理层(硬件)、数据链路层(网卡层)、网络层(互联网层)、传输层、应用层。在日常工作中接触最多的是上两层,偶尔会去触碰网络层

Redis02-Redis高性能与epoll

无人久伴 提交于 2020-03-11 16:05:32
Redis为何如此之快 Redis基本是内存操作,所以速度很快 单机Redis采用单进程、单线程、单实例,避免了不必要的上下文切换和竞争条件 Redis通信采用非阻塞IO, 内部实现采用epolll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时 来源: oschina 链接: https://my.oschina.net/u/4476943/blog/3191791