您好、欢迎来到现金彩票网!
当前位置:ds视讯 > 服务性程序 >

8Linux 高性能服务器编程 --- 高性能服务器程序框架

发布时间:2019-06-22 15:14 来源:未知 编辑:admin

  1.服务器模型 1.C/S 模型 2.P2P 模型 2.服务器编程框架 1.IO处理单元 : 处理用户连接,读写网络数据;(单机) 作为接入服务器,实现负载均衡;(集群) 2.请求队列 各个单元之间通信的抽象,通常被实现为池的一部分; 一个单元通知另外一个单元,或者多个单元访问同一个存储单元时,竞争的协调; 对于集群来说,请求队列是预先建立的 3.逻辑单元 一个进程或者线程;(单机) 一台逻辑服务器;(集群) 4.网络存储单元 可以是数据库,文件,缓存;(单机) 数据库服务器;(集群) 3.I/O 模型 1.阻塞IO 2.非阻塞IO 3.IO复用(IO通知机制) : select, poll, epoll_wait; 应用程序通过 IO复用函数向内核注册一组事件,内核通过IO复用函数把其中准备就绪的事件通知给应用程序; IO复用本身是阻塞的,高效的原因是它同时监听多个IO事件的能力; 4.SIGIO 也可以用来报告 IO事件 ; 将一个目标文件描述符指定为宿主进程,被指定的进程将捕获到 SIGIO 事件, 这样我们就可以在信号处理函数中对目标文件描述符执行非阻塞IO操作了; 5.异步IO 理论上说,阻塞IO,IO复用,信号驱动IO 都是同步IO模型。因为这3种IO模型,IO的读写,都在 IO事件发生以后,由应用程序自己完成; 对异步IO而言,用户可以直接对IO执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及IO完成后内核通知应用程序的方式,总是 立即返回,真正的读写已经由内核接管。 同步IO模型要求用户自行执行IO操作,异步IO则由内核来执行IO操作; 同步IO向应用程序通知的是IO就绪事件,异步IO向应用程序通知的是IO完成事件;

  4.两种高效的事件处理模式 服务器程序通常要处理三类事情:IO事件,信号,以及定时事件 1.Reactor(同步IO模型) : 要求主线程只负责监听文件描述符上是否有事件发生,有的话通知工作线程; 读写数据,接受新的连接,以及处理客户请求均在工作线.主线程往epoll内核事件注册socket上的读就绪事件 2.主线程调用 epoll_wait 等待 socket 上有数据可读 3.当 socket 上有数据可读时,epoll_wait 通知主线程,主线程将 socket 可读线.睡眠在请求队列上的某个工作线程被唤醒,它从socket读取数据,并处理客户请求,然后往epoll内核事件 表中注册该 socket 上的写就绪事件 5.主线程调用 epoll_wait 等待 socket 可写 6.当 socket 可写时, epoll_wait 通知主线程.主线程将 socket 可写事件放入请求队列 7.睡眠在请求队列上的某个工作线程被唤醒,它往 socket 上写入服务器处理客户端请求的结果。 2.Proactor(异步IO模型) 与Reactor 模式不同, Proactor 模式将所有的 IO 操作都叫给主线程和内核来处理, 工作线程仅仅负责业务逻辑。 1.主线程调用 aio_read 函数向内核注册 socket 上的读完成事件,并告诉内核用户读缓冲区的位置, 以及读操作完成时如何通知应用程序。 2.主线程继续处理其他逻辑。 3.当socket上的数据被读入用户缓冲区后,内核向应用程序发送一个信号,以通知应用程序数据已经可用。 4.应用程序预先定义好的信号处理函数选择一个工作线程来处理客户的请求。工作线程处理完客户请求后, 调用 aio_write 函数向内核注册 socket 上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成 时如何通知应用程序。 5.主线.当用户缓冲区的数据被写入 socket 之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕。 7.应用程序预先设定好的信号处理函数选择一个工作线程来善后处理,比如决定是否关闭 socket 。 3.模拟 Proactor 模式 使用同步IO 模拟 Proactor 。原理:主线程执行数据读写操作,读写完成后,主线程向工作线程通知这一完成事件。 那么从工作线程的角度来看,它们就直接获得了数据读写的结果,接下来要做的就是对读写的结果进行逻辑操作。 1.主线程往epoll内核事件表中注册 socket 上的读就绪事件 2.主线程调用 epoll_wait 等待 socket 上有数据可读 3.当 socket 上有数据可读时,epoll_wait 通知主线程。主线程从 socket 循环读取数据,直到没有更多数据可读, 然后将读到的数据封装成一个请求对象并插入请求队列 4.睡眠在请求队列上的某个工作线程被唤醒,它获得请求对象并处理客户请求,然后往 epoll 内核事件表中注册 socket 上的写就绪事件 5.主线程调用 epoll_wait 等待 socket 可写 6.当 socket 可写时,epoll_wait 通知主线程,主线程往 socket 上写入服务器处理客户请求的结果

  5.两种高效的并发模式 并发编程主要有: 多进程和多线程 并发编程模式有: 1.半同步/半异步 在IO编程中,同步和异步区分的是内核向应用程序通知的是何种IO事件(是就绪事件还是完成事件), 以及谁来完成IO读写(是应用程序还是内核). 在并发模式中,同步指的是程序完全按照代码序列的顺序执行; 异步指的是程序的执行需要由系统事件来驱动,常见的系统事件包括中断,信号等; 同步运行的线程叫同步线程; 异步方式运行的线程叫异步线程; 同时采用同步线程和异步线程来实现,即采用半同步/半异步模式来实现;这当中,同步用来实现客户逻辑, 异步线程用来处理IO事件。异步线程监听到客户请求后,就将其封装成请求对象并插入请求队列。请求队列将通知 某个工作在同步模式的工作线程来读取并处理该请求对象。 其中有个变体叫半同步/半反应堆 模式: 异步线程只有一个,由主线程来充当。它负责监听所有socket的事件。 如果监听 socket 上有可读事件发生,即有新的连接到来,主线程就接受之以得到新的连接socket, 然后往epoll内核事件表中注册该 socket 上的读写事件; 如果连接 socket 上有读写事件发生,即有新的客户请求到来或者有数据要发送至客户端,主线程就将该 连接socket 插入请求队列中。所有工作线程都睡眠在请求队列中,当有任务到来,它们通过竞争获取任务的接管权。 半同步/半反应堆采用的事件处理模式是 Reactor 模式:它要求工作线程自己从 socket 读取客户请求和往socket 写入服务器应答。也可以模拟Proactor 事件处理模型,即由主线程完成数据的读写。 缺点: 1.主线程和工作线程共享请求队列。主线程往请求队列添加任务,或者工作线程从请求队列取出任务,都需要对请求队列 加锁保护,从而白白浪费 cpu 时间。 2.每个工作线程在同一时间之内处理一个客户请求。客户数量较多,工作线程较少,则请求队列中将堆积很多任务对象。 如果通过增加工作线程来解决这一问题,则工作线程的切换也将耗费大量 cpu 时间。 高效的半同步/半反应堆模式: 在工作线程中也维护 自己的事件循环。 2.领导者/追随者 领导者和追随者是多个工作线程轮流获得事件源集合,轮流监听,分发并处理事件的一种模式。 在任意时间点,程序仅有一个领导者,它负责监听IO事件。而其他线程都是它的追随者,它们休眠在线程池中等待 成为新的领导者。当期领导者如果检测到IO事件,首先要从线程池中推选出现的领导者线程,然后处理IO事件。此时, 新的领导线程等待新的IO事件,而原来的领导者则处理IO事件,二者实现了并发。 领导者/追随者模式包括的组件:句柄集, 线程集,事件处理器和具体的事件处理器。 句柄集: 表示IO资源,使用 wait_for_event 方法监听这些句柄上的IO事件。将其中的就绪事件, 通知给领导线程。领导者则调用绑定到 Handle 上的事件处理器来处理事件。领导者将 Handle 和 事件 处理器绑定是通过调用句柄集中的register_handle 实现的。 线程集: 这个组件是所有工作线程(包括领导线程和追随者线程)的管理者。它负责各个线程之间的同步,以及新领导线程的推选。 线程集中的线程在任一时间必须处于如下三种状态之一: Leader : 线程当前处于领导者身份, 负责等待句柄集上的IO事件; Processing : 线程正在处理事件。领导者检测到IO事件后,可以转移到 Processing 状态来处理该事件, 并调用promote_new_leader方法推选新的领导者;也可以指定其他追随者来处理事件,此时领导者地位不变。 当处于Processing 状态的线程处理完事件之后,如果当前线程集中没有领导者,则它将成为新的领导者,否则 它就直接转变为追随者。 Follower : 线程当前处于追随者身份,通过调用线程集的 join 方法等待成为新的领导者,也可以被当前的领导者指定来处理新任务。 事件处理器和具体的事件处理器: 事件处理器通常包含一个或多个回调函数 handle_event。这些回调函数用于处理事件对应的业务逻辑。事件处理器在使用前需要被绑定到 某个句柄上,当该句柄上有事件发生时,领导者就执行与之绑定的事件处理器中的回调函数。具体的事件处理器是事件处理器的派生类。 它们必须重新实现基类的 handle_event 方法,以处理特定任务。

  6.有限状态机 逻辑单元内部的一种高效编程方式。 7.提高服务器性能的其他建议 1.池 一组资源的集合。这组资在服务器启动之初就完全被创建并初始化。分配系统资源的系统调用很耗时。 避免了对内核的频繁访问。 内存池 : socket 的接收缓存和发送缓存 进程池 线程池 连接池 : 常用于服务器或服务器集群的内部永久连接。 2.数据复制 高性能服务器应该避免不必要的数据复制。尤其是当数据复制发送在用户代码和内核之间的时候。 如果内核可以直接处理从 socket 或者文件读入的数据,则应用程序就没必要将这些数据从内核 缓冲区复制到应用程序缓冲区。这里说的直接处理指的是应用程序不关心这些数据的内容,不需要对 它们做任何分析。 可以使用 零拷贝 sendfile 函数. 此外,用户代码内部(不访问内核)的数据复制也应该避免。举例,当2个工作进程之间要传递大量的数据时, 我们就应该考虑使用共享内存来在它们之间直接共享这些数据,而不是使用管道或者消息队列来传递。 3.上下文切换 并发程序必须考虑上下文切换的问题,即进程切换或线程切换导致的系统开销。即使是 IO密集型的服务器,也 不应该使用过多的工作线程。否则线程间的切换将占用大量的cpu时间,服务器真正用于处理业务逻辑的cpu时间的比重 就显得不足了。因此,每个客户连接创建一个工作线程的服务器模型是不可取的。 半同步/半异步模式是一种比较合理的方案,它允许一个线程同时处理多个客户连接。 此外,多线程服务器的一个优点是不同的线程可以同时运行在不同的cpu上,当线程的数量不大于cpu的数目时, 上下文切换就不是问题了。 4.锁 并发程序需要考虑的另外一个问题就是对共享资源的加锁保护。锁通常被认为是导致服务器效率低下的一个因素。 因为由它引入的代码,不仅不处理任何业务逻辑,而且需要访问内核资源。 显然,半同步/半异步模式就比 半同步/半反应堆的效率高。 如果服务器必须使用锁,可以考虑减小锁的粒度。

  Linux高性能服务器编程(高清PDF)+项目源码(完整) 本书是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面

  《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应

  《Linux高性能服务器编程》共17章,分为3个部分:第一部分对Linux服务器编程的核心基础——TCP/IP协议进行了深入的解读和阐述,包括TCP/IP协议族、TCP/IP协议,以及一个经典的TCP

  本书是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想。不仅

  Linux服务器编程领域的经典著作,资深Linux软件开发工程师撰写 从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的方法、技巧和思想,包含两个综

  问题聚焦:  核心章节。  服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论)。服务器模型C/S模型结...博文来自:fanyun的博客

  I/O复用(本身是阻塞的)网络程序需要使用I/O复用技术的情况:1.客户端程序需要同时处理多个socket。2.客户端需要同时处理用户输入和网络连接3.TCP服务器要同时处理监听socket和连接so...博文来自:XD_RBT_的博客

  在《Linux高性能服务器编程》一书中为了帮助大家将书中的知识融汇到实际项目中,作者特意编写了一个较为完整的负载均衡服务器程序springsnail。里面用到了进程池、有限状态机这些知识点。自己是在网...博文来自:Sanjiye的博客

  源码地址安装及使用下载源码:gitclone然后进入springsnil目录直接make即可生成可执行文件填...博文来自:westbrookliu的博客

  本书是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、技巧和思想。不仅

  《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的

  1.TCP/IP协议族:数据链路层:实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。不同物理网络具有不同的电气特性,网络驱动程序隐藏了这些细节,为上层协议提供一个统一的接口。ARP,RAR...博文来自:zq627271551的专栏

  参考:《Linux高性能服务器编程》服务器程序框架服务器通常需要处理三类事件:1.I/O事件2.信号事件3.定时事件同步I/O模型通常用于实现Reactor模式异步I/O模型则用于实现Proactor...博文来自:yvhqbat的博客

  问题聚焦:  进程是Linux操作系统环境的基础。  本篇讨论以下几个内容,同时也是面试经常被问到的一些问题:  1复制进程映像的fork系统调用和替换进程映像的exec系列系统调用  2僵尸进程  ...博文来自:ctthuangcheng

  Linux高性能服务器编程 - 高清 - 带书签 tcp/ip协议详解,深入理解高性能服务器编程,io函数及io复用讲解,信号,定时器,io框架库libevent,多进程编程,多线程编程,进程池线程池

  《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应

  《linux高性能服务器编程》_游双_源码,书籍所带源码,其他的资源需要分数太高。这里上传方便各位朋友。

  除了网络通信外,服务器程序通常还必须考虑许多其它细节问题。这些细节面广而琐碎,基本上都是模版式的,一般称之为服务器程序规范。例如:1、linux服务器程序一般以后台进程形式运行,后台进程又称为守护进程...博文来自:weixin_37924880的博客

  linux_《linux高性能服务器编程》第6章_dup/dup2_CGI服务器基本原理博文来自:世间熙熙,皆为利来,世间攘攘,皆为利往。人为什么一生摆脱不了名利二字?

  Linux产生信号的条件: 1.对于前台进程,用户可以输入特殊的终端字符来给它发送信号,如ctrl+c 2.系统异常。如浮点异常和非法内存访问 3.系统状态变化。如alarm定时器到期引起的SIGAL...博文来自:enlyhua的专栏

  本文时间:2018-11-21,作者:krircc,简介:天青色欢迎向Rust中文社区投稿,投稿地址,好文将在以下地方直接展示Rust中文社区首页Rust中文社区Rust文章栏目知乎专栏Rust语言高...博文来自:Colourful

  项目(附源码):高性能TcpServer - 1.网络通信协议 项目(附源码):高性能T论坛

  第一章TCP/IP协议族数据链路层可以看成是一个网卡驱动,为上层提供了一个统一的接口。Telnet协议是一种远程登录协议,它使得我们能在本地完成远程任务。第二章IP协议详解第三章TCP协议详解......博文来自:zhougb3的博客

  服务器编程07-06非常基础但又非常重要的一本书,十分适合刚学习网络编程的同学。

  阅读数 6371.**重点内容**EPOLLONESHOT事件的引入即使使用ET模式,一个socket上的某个事件还是可能被触发多次.这在并发程序中会引发一个问题.比如一个线程在读取完某个socket上的数据后开始...

  《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应下载

  一、概述 二、7个设计原则 三、创建型模式(5种) 四、结构型模式(7种) 五、行为型模式(11种) 六、总结 前言:熟练地掌握设计模式,并能在实际编程开发中灵活运用它们,不仅能使代码更规范,重用性...

  原文地址:因为需要用,所以才翻译了这个文档。但总归赖于英语水平很有限,翻译出来的中文有可能...

  本文讲一下matlab中的并行方法与技巧。分为以下几个板块: 1. 什么东西好并行? 2. 怎么并行? 3. parfor vs. SPMD 4. 注意事项及经验总结...

  用VC2005编译的程序,编译时没有任何错误,但是运行时就是提示“应用程序正常初始化失败”!! 查找了各方面资料,做了各种尝试,网上说什么的都有:有让安装vc2005 sp1补丁的;有让安装vcre...

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...

  原文地址:反置页表作者:hilg 在分页系统中为每个进程配置一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。在现代计算机系统中通常允许一个进程的逻辑地址空间非常大,因此就有很多页表...

  关于如何配置Tomcat数据库连接池,网上已有太多文章了。可是找不到一篇文章能 告诉我,怎么能得到Tomcat连接池的当前连接数。如果想要监视Tomcat的运行状况,这 是一个重要参数。所以我花了...

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  command窗口是命令窗口,即为sqplus窗口,有命令提示符,识别sqlplus命令,基本的命令都可以执行 sql仅可执行DDL、select、DML等...

  自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。 1. 测试集和训练集3、7分组 australian ...

  1.业务层 、服务层、数据层、表现层liuyunhuanlv:有用即点赞

http://wendevick.net/fuwuxingchengxu/499.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有