epoll

一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent

纵然是瞬间 提交于 2020-10-05 13:51:50
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力。 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在客户机器上的,Win32 上作为开机自启动的 windows 服务运行; Linux 上作为 daemon 在后台运行。总的说来就是用于接收几个产品进程的连接,因此轻量化是其最重要的要求,在这个基础上要能兼顾跨平台就可以了。 其实主要就是 windows,再兼顾一点儿 linux。 考察了几个现有的开源网络框架,从 ACE 、boost::asio 到 libevent,都有不尽于人意的地方: a) ACE:太重,只是想要一个网络框架,结果它扒拉扒拉一堆全提供了,不用还不行; b) boost::asio:太复杂,牵扯到 boost 库,并且引入了一堆 c++ 模板,需要高版本 c++ 编译器支持; c) libevent:这个看着不错,当时确实用这个做底层封装了一版,结果发版后发现一个比较致命的问题,导致在防火墙设置比较严格的机器上初始化失败,这个后面我会详细提到。 其它的就更不用说了,之前也粗略看过陈硕的 muddo,总的感觉吧,它是基于其它开源框架不足地方改进的一个库,有相当可取的地方,但是这个改进的方向也主要是解决更大并发、更多连接,不是我的痛点,所以没有继续深入研究。 好了

基于 C++11 开发的高性能 web 服务器 cppweb 发布

时光毁灭记忆、已成空白 提交于 2020-10-02 23:43:24
功能说明 作者初衷是编写一个web框架支持C++开发cgi程序,于是cppweb诞生了。 作者希望cppweb是一个大一统的框架,即可用于传统服务端编程也可用于web编程,作者希望http协议能做的更多,框架包括以下两个核心服务: webserver:业务服务容器,通过配置也可升级为服务注册中心与定时任务调度中心。 webrouter:接口路由网关服务,对外提供统一的流量入口,主要负责请求分发以及黑白名称配置。 cppweb在读数据采用epoll网络模型,以任务队列的方式处理具体请求,回包也在任务队列中处理,理论上cppweb可支持单机10000个以上的并发连接。 cppweb易拓展,作者开发Java、Python等模块,用于支持Java、Python等语言开发cgi程序,开发者可以直接使用C/C++、Java、Python等语言进行混合开发。 cppweb追求小而巧,对于开源库是拿来即用,源码工程自带zlib、sqlite等源码代码,开发者无需另外下载,再此感谢zlib、sqlite等开源库的作者与开发团队。 我们对linux与windows下的文件系统、共享内存、信息量等系统接口进行统一的封装,保证一份代码可以再不同的系统中编译运行,您也可以用cppweb基础库进行其他方面的跨平台开发工作。 基于cppweb的微服务集群框架如下图所示

Redis 6.0 多线程重磅发布!!!

邮差的信 提交于 2020-10-02 08:57:26
Redis 6.0 多线程重磅发布!!! Redis 6.0在5.2号这个美好的日子里悄无声息的发布了,这次发布在IT圈犹如一颗惊雷一般,因为这是redis最大的一次改版,首次加入了多线程。 作者Antirez在RC1版本发布时在他的博客写下: the most “enterprise” Redis version to date // 最”企业级”的 the largest release of Redis ever as far as I can tell // 最大的 the one where the biggest amount of people participated // 参与人数最多的 这次改变,性能有个飞速的提升~ 先po出新版和旧版性能图 从上面可以看到 GET/SET 命令在 4 线程 IO 时性能相比单线程是几乎是翻倍了。另外,这些数据只是为了简单验证多线程 IO 是否真正带来性能优化,并没有针对严谨的延时控制和不同并发的场景进行压测。数据仅供验证参考而不能作为线上指标,且只是目前的 unstble分支的性能,不排除后续发布的正式版本的性能会更好。 Redis 6.0 之前的版本真的是单线程吗? Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器

Android平台dalvik模式下java Hook框架ddi的分析(1)

人走茶凉 提交于 2020-10-02 08:48:15
本文博客地址: http://blog.csdn.net/qq1084283172/article/details/75710411 一、前 言 在前面的博客中已经学习了作者crmulliner编写的,针对Android系统的跨进程 inline Hook的实现即Android native Hook框架adbi的实现。Android Hook框架adbi主要是针对的Android的native函数进行inline Hook操作,那么如果需要对Android系统中Java编写的函数进行Hook,又该怎么操作呢?作者crmulliner后面又实现了针对Android的java函数进行Hook的框架ddi。adbi Hook框架和ddi java Hook框架的实现流程都差不多,首先实现root权限下Android跨进程的so注入,在so库文件被加载注入到目标进程中时,调用该so库文件的构造函数有一次代码执行的机会,利用这一次代码执行的机会既可以进行针对Android系统底层native函数的inline Hook或者.got Hook等,也可以进行针对Android系统的java函数进行dalvik Hook或者art Hook。Android平台的所有跨进程Hook都是基于Android系统root权限下的so注入和一次代码执行机会来实现的,只要能实现Android的跨进程注入

Linux下的I/O复用与epoll详解

时光怂恿深爱的人放手 提交于 2020-09-30 06:55:46
前言 I/O多路复用有很多种实现。在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术。尽管他们的使用方法不尽相同,但是本质上却没有什么区别。本文将重点探讨将放在EPOLL的实现与使用详解。 为什么会是EPOLL select的缺陷 高并发的核心解决方案是1个线程处理所有连接的“等待消息准备好”,这一点上epoll和select是无争议的。但select预估错误了一件事,当数十万并发连接存在时,可能每一毫秒只有数百个活跃的连接,同时其余数十万连接在这一毫秒是非活跃的。select的使用方法是这样的: 返回的活跃连接 ==select(全部待监控的连接)。 什么时候会调用select方法呢?在你认为需要找出有报文到达的活跃连接时,就应该调用。所以,调用select在高并发时是会被频繁调用的。这样,这个频繁调用的方法就很有必要看看它是否有效率,因为,它的轻微效率损失都会被“频繁”二字所放大。它有效率损失吗?显而易见,全部待监控连接是数以十万计的,返回的只是数百个活跃连接,这本身就是无效率的表现。被放大后就会发现,处理并发上万个连接时,select就完全力不从心了。 此外,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD

2.muduo之Channel

£可爱£侵袭症+ 提交于 2020-09-29 16:56:12
Channel类主要作用:1.将文件描述符(可能是socket类型,eventfd类型,timefd类型,signalfd类型)封装,通过该类设置各种事件的回调函数(例如读回调,写回调,关闭回调等)。2.可以设置自己的监听事件类型,然后根据该类型更新poller对象(epoll或者poll)对该类的操作(例如添加,修改,删除操作)。3.根据自己监听到的事件类型触发回调函数。 1.Channel.h文件 /// ///一个能被选择的 I/O channel //这个类不拥有自己的文件描述符 /// 这个文件描述符可能是socket,eventfd, timerfd,或者 signalfd. class Channel : noncopyable { public : typedef std :: function < void ( ) > EventCallback ; //事件回调 typedef std :: function < void ( Timestamp ) > ReadEventCallback ; //读事件回调 Channel ( EventLoop * loop , int fd ) ; //一个channel属于一个loop,一个loop可以对应多个channel ~ Channel ( ) ; void handleEvent ( Timestamp

Linux字符设备驱动进阶

拈花ヽ惹草 提交于 2020-09-27 17:03:13
在之前讨论的字符设备驱动,只实现了open、release、read、write等基本操作,现在我们讨论一下高级字符设备驱动的一些接口,如:ioctl、poll、非阻塞IO等等。 1.ioctl ioctl提供对设备的控制能力,一般ioctl传递的数据量非常小。 用户空间的ioctl: int ioctl(int fd,unsigned long cmd,...) 内核(驱动)空间的ioctl: int (*ioctl)(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg) 1.1 ioctl定义命令: 定义ioctl 命令的正确方法是使用4个位段, 这个列表中介绍的符号定义在<linux/ioctl.h>中: 1) Type 幻数(类型): 表明哪个设备的命令,在参考了ioctlnumber.txt之后选出,8 位宽。 2) Number 序号,表明设备命令中的第几个,8 位宽 3) Direction 数据传送的方向,可能的值是_IOC_NONE(没有数据传输),_IOC_READ, _IOC_WRITE。数据传送是从应用程序的观点来看待的,_IOC_READ 意思是从设备读。 4) Size 用户数据的大小。(13/14位宽,视处理器而定) 内核提供了下列宏来帮助定义命令: 1)

什么是BIO,NIO?他们和多路复用器有啥关系?

大憨熊 提交于 2020-09-24 08:38:16
本文转载自微信公众号「Java极客技术」,作者鸭血粉丝 。转载本文请联系Java极客技术公众号。 阿粉第一次了解到io相关知识是在网上看面经的时候,平时只会写业务代码,面对bio,nio,多路复用器这些概念简直是一头雾水。 当阿粉尝试单独去学习这些名词,发现很难学懂,如果能有一篇文章串起来讲讲他们的关系,可能对初学者来说有一定的帮助,所以便有了下面这篇文章。 BIO BIO即为阻塞IO的意思,通常我们讲BIO的时候都会和服务器模型配合着讲,在实际应用中讲会更好理解。大家看下面的代码,估计在大家初学java网络编程的时候用的都是这个模型: public static void main(String[] args) throws Exception { //建立socket,socket是客户端和服务器沟通的桥梁 ServerSocket server = new ServerSocket(9090,20); //通过死循环不断接收客户端请求 while (true) { //线程会阻塞在这行的accep方法 Socket client = server.accept(); //创建新线程处理新客户端的逻辑 new Thread(() -> { //client的读写逻辑 }).start(); } } 只要没有客户端连接上服务器,accept方法就一直不能返回,这就是阻塞

Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用

巧了我就是萌 提交于 2020-08-20 06:37:16
本文博客地址: http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客《 Android平台dalvik模式下java Hook框架 ddi 的分析(1) 》中,已经分析了dalvik模式下 ddi 框架Hook java方法的原理和流程,这里来学习一下ddi框架代码中涉及到的 dex文件的注入和调用。将一个Android的so库文件跨进程注入到另一个进程中,在so库文件的实现里,我们可以做很多的事情,例如:inline Hook,java方法的Hook,dex文件的注入和调用,ndk的jni函数的Hook等等。 1 .ddi框架在进行dex文件的注入和调用是在原来dalvik模式下java方法Hook的基础上修改过来的,在 hijack注入工具将android so库文件注入到目标pid进程时实现android的inline Hook操作,为了保证android的inline Hook操作的顺利执行,需要为注入到目标pid进程中android so库文件定义 .init段或者.init_array段的构造函数,如下图中的my_init构造函数;在inline Hook操作的自定义函数my_epoll_wait里进行dalvik虚拟机模式下的java方法Hook操作。 代码的流程梳理如下: 1.

2020年腾讯C++面试题和答案持续更新中-内附视频(7)

爷,独闯天下 提交于 2020-08-20 04:48:31
2020年腾讯C++面试题和答案持续更新中(7)-内附视频 大家好我是好好学习天天编程的天天,又来给大家分享面试题了~~ 有粉丝私信说有有些题不会做,那怎么办呢? 现在你们有福利了,我会每天录制一个视频,讲解一个高频面试题 如下: 干货 | 名企高频考点-C++ vector基本使用 每天的视频我都会汇总到一起: IT笔试面试真题讲解合集 一面: C++ struct和class的区别 函数调用的过程,其中使用了什么寄存器。为什么函数参数入栈顺序从右到左 宏定义和枚举的区别(枚举分不分配内存) 宏定义和函数定义的区别 堆和栈的区别 进程和线程的区别 为什么构造函数不能是虚函数,析构函数呢 new和malloc,delete和free的区别 select、epoll、epoll的区别 TCP黏包问题 指针和数组的区别 函数中参数存放在栈,进栈顺序,为什么这样子 MySQL存储引擎了解吗(MyISAM和InnoDB) B+树了解吗 说下预编译(预编译是什么?是预处理吗。之后我说的是预处理) 保护头文件被多次包含的方法有哪些? STL的map底层原理 vector底层原理 全局变量和局部变量的区别 开放题:中国有多少个加油站 二面: 空类在编译期会做什么,会有什么函数,sizeof是多少 如果只给你一个对象的指针,你怎么才能够调用构造函数(没搞懂在问什么 感觉是问构造函数除了new的时候