同步I/O模型要求用户代码自行执行I/O操作(将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区),而异步I/O则由内核来执行I/O操作。

同步I/O向应用程序通知的是I/O就绪事件,而异步I/O向应用程序通知的是I/O完成时间。

1. Reactor模式

工作流程:

主线程网epoll内核事件表中注册socket上的读就绪时间

主线程调用epoll_wait等待socket上有数据可读

当socket上有数据可读时,epoll_wait通知主线程。主线程则将socket可读事件放入请求队列

睡眠在请求队列的某个工作线程被唤醒,它从socket读取数据,并处理客户请求,然后往epoll内核事件表中注册该socket上的写就绪时间

主线程调用epoll_wait等待socket可写

当socket可写时,epoll_wait通知主线程。主线程将socket可写事件放入请求队列

睡眠在请求队列上的某个工作线程被唤醒,它往socket上写入服务器处理客户请求的结果

2. Proactor模式

工作流程:

主线程调用aio_read函数向内核注册socket上的读完成事件,并告诉内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序(信号为例)

主线程继续处理其他逻辑

当socket上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据已经可用

应用程序预先定义好的信号处理程序选择一个工作线程来处理客户请求。工作线程处理完客户请求之后,调用aio_write函数向内核注册socket上的写完成时间,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序(信号)

主线程继续处理其他逻辑

当用户缓冲区的数据被写入socket之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕

应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理

3. 模拟Proactor模式

使用同步I/O方法可以模拟Proactor模式:主线程执行数据读写操作,读写完成之后,主线程向工作线程通知这一“完成事件”,那么从工作线程的角度看,它们就直接获得了数据读写的结果,只需要对读写的结果进行逻辑处理。

4. 半同步/半异步模式

这里的同步异步不是I/O模型的,而是并发模式的:

同步指的是程序完全按照代码序列的顺序执行,异步指的是程序的执行需要由系统事件来驱动、

半同步/半异步模式中,同步线程用于处理客户逻辑,异步线程用于处理I/O事件(主线程,负责分发任务)。

结合考虑这两种事件处理模式和几种I/O模型,存在多种变体:

半同步半反应堆模式

半同步半反应堆模式.jpg

异步线程:主线程

事件处理模式:Reactor,请求队列的任务时就绪的连接socket,工作线程自己从socket上读取客户请求和写入应答

缺点:

主线程和工作线程共享请求队列,需要加锁保护,耗费时间

每个工作线程同一时间只能处理一个客户请求,容易堆积任务

半同步/半异步模式

半同步半异步模式.jpg

每个工作线程都能同时处理多个客户连接

主线程只管理监听socket,连接socket由工作线程管理,主线程通过管道向工作线程分发任务

每个线程(主线程和工作线程)都维持自己的时间循环,各自独立地监听不同的时间。

领导者/追随者模式

多个工作线程轮流获得事件源集合,轮流监听、分发并处理事件。

提高性能

资源池:避免频繁分配和销毁资源开销

数据复制:避免不必要的文件复制,共享内存,传递指针

上下文切换和锁:避免频繁切换,减小锁的粒度,读写锁等。

高性能服务器程序框架,高性能服务器程序框架相关推荐

  1. c# mqtt高性能服务器端源代码 开源框架包括服务器和客户端,支持mqtt3.0及5.0

    c# mqtt高性能服务器端源代码. 你还在使用第三方服务软件吗?不如试试这个开发框架,助你一臂之力,无限制,无全开源,无版权约束,全是自主开发. 开源框架包括服务器和客户端,支持mqtt3.0及5. ...

  2. 微信小程序滴滴服务器报错,如何使用mpx框架(滴滴)给微信小程序分包

    如何使用mpx框架(滴滴)给微信小程序分包 如何使用mpx框架(滴滴)给微信小程序分包 前提:使用mpx框架.核心包:@mpxjs/core.@mpxjs/webpack-plugin等 mpx开发文 ...

  3. 基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间

    基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间 基于EPOLL+多进程+线程池的server框架设想 最近,看了几个开源代码的server框架,有了一些自己的想法,把它记下来 ...

  4. 秒杀springboot——未来轻量级高性能的Java云原生微服务框架来啦

    秒杀springboot--未来轻量级高性能的Java云原生微服务框架来啦 引子 自2003年Rod.Juergen 和 Yann开发并发布Spring项目后,J2EE 迎来了新的开始.在 2013 ...

  5. 小程序修改服务器域名多久生效,小程序 服务器域名配置多久生效

    小程序 服务器域名配置多久生效 内容精选 换一换 依照配置并导入样例工程中导入和修改样例后,即可在开发环境中,右击"JDBCExample.java",选择"Run 'J ...

  6. 京喜小程序的高性能打造之路

    本文阅读时长约 20 分钟.京喜小程序开发团队核心成员倾力之作,都是干货,读完一定会收获满满,请大家耐心阅读- 背景- 京喜小程序自去年双十一上线微信购物一级入口后,时刻迎接着亿级用户量的挑战,细微的 ...

  7. 机器视觉:makefile编译调用Caffe框架的C++程序

    Caffe作为在众多公司搞深度学习时较多使用的框架,其在使用的友好程度上显然要比后起的一些深度学习框架要差一些,虽然如此,其作为深度学习的第一个开源框架,自有它的很多优势,比如设计结构.关于Caffe ...

  8. 彻底吃透Web服务器、容器、应用程序服务器与反向代理

    出处:cnblogs.com/vipyoumay/p/7455431.html 我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是 Web 服务器/Web 容器/Web 应用程序服务器 ...

  9. python flask框架是什么_Flask框架是什么?带你安装运行第一个Flask程序

    1 了解框架 Flask作为Web框架,它的作用主要是为了开发Web应用程序.那么我们首先来了解下Web应用程序.Web应用程序 (World Wide Web)诞生最初的目的,是为了利用互联网交流工 ...

  10. php soecket服务器搭建_PHP socket 服务器框架集

    1.Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时 ...

最新文章

  1. win8系统的计算机共享在哪里设置方法,怎么设置win8无线共享呢?
  2. mysql经纬度转距离_Mysql 拿指定经纬度与数据库多条经纬度进行距离计算 (转)
  3. 胡言乱语集锦-大数据,手机,传统,养生
  4. java32位无符号数_用C语言解释32位无符号长单精度IEEE-754浮点数
  5. 【新星计划】汽车纵向动力学模型
  6. 在Linux PC上查看arm交叉编译的可执行文件依赖的动态库
  7. wasm-simd入门(卷积指令)
  8. LRU缓存实现(Java)
  9. hive数据写入elasticsearch
  10. 体验Visual Studio 2015 Windows Forms应用程序开发与维护
  11. GRE阅读高频机经原文及题目之能源消费(逻辑)
  12. IPMI 1:ipmi简介
  13. 免费可开放接口一览表
  14. ldap 统一认证 java_LDAP统一用户认证
  15. 易接SDK流程记录以及AndroidManifest解析(无干货)
  16. 查看App应用签名工具
  17. 由摊余成本法谈到债券估值
  18. 论文笔记:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  19. Android项目编码规范
  20. enum ordinal java_Java Enum ordinal()方法与示例

热门文章

  1. 每天一个linux命令(59):rcp命令
  2. Wine QQ2012 笔记
  3. 1248. 统计「优美子数组」
  4. centos7 cuda测试_CentOS 7 安装cuda环境
  5. 【免费毕设】ASP.NET公交车管理系统的实现与设计(源代码+lunwen)
  6. 【毕设】JAVA+SQL办公自动化系统(源代码+论文+外文翻译)
  7. Python适合初学者入门
  8. python数据框拼接_pandas数据拼接的实现示例
  9. html rpc文档,HTML5 DRM 正式成为 Web 标准,百度正式开源RPC框架brpc
  10. 转html图片 xwpf_Word、Pdf、Excel、PPT、html等文件互转工具