当前位置: 首页 > news >正文

手机网站排名优化软件php网站建设情景

手机网站排名优化软件,php网站建设情景,网站视觉,百度推广后台登陆首页网络模型 前情回顾服务器模型 Reactor和 ProactorReactor模型Proactor模型同步I/O模拟Poractor模型Libevent#xff0c;libev#xff0c;libuv优先级事件循环线程安全 前情回顾 网络IO#xff0c;会涉及到两个系统对象#xff1a;   一个是用户空间调用的进程或线程   … 网络模型 前情回顾服务器模型 Reactor和 ProactorReactor模型Proactor模型同步I/O模拟Poractor模型Libeventlibevlibuv优先级事件循环线程安全 前情回顾 网络IO会涉及到两个系统对象   一个是用户空间调用的进程或线程   一个是内核空间的内核系统 如果发生IO操作read时会奖励两个阶段   1. 等待数据准备就绪   2. 将数据从内核拷贝到进程或线程中 因为在以上两个阶段会有不同的情况发生所以就出现了多种网络IO模型 服务器模型 Reactor和 Proactor 对高并发编程网络连接上的消息处理可以分为两个阶段等待消息准备好、消息处理。当使用默认的阻塞套接字时例如上面提到的 1 个线程捆绑处理 1 个连接往往是把这两个阶段合而为一这样操作套接字的代码所在的线程就得睡眠来等待消息准备好这导致了高并发下线程会频繁的睡眠、唤醒从而影响了 CPU 的使用效率。 高并发编程方法当然就是把两个阶段分开处理。即等待消息准备好的代码段与处理消息的代码段是分离的。当然这也要求套接字必须是非阻塞的否则处理消息的代码段很容易导致条件不满足时所在线程又进入了睡眠等待阶段。 Q: 那么问题来了等待消息准备好这个阶段怎么实现它毕竟还是等待这意味着线程还是要睡眠的   A: 解决办法就是线程主动查询或者让 1 个线程为所有连接而等待这就是 IO 多路复用了。多路复用就是处理等待消息准备好这件事的它可以同时处理多个连接它也可能“等待”所以它也会导致线程睡眠然而这不要紧因为它一对多、可以监控所有连接。这样当线程被唤醒执行时就一定是有一些连接准备好被我们的代码执行了 。 作为一个高性能服务器程序通常需要考虑处理三类事件 I/O 事件定时事件、信号。两种高效的事件处理模型Reactor 和 Proactor Reactor模型 首先来回想一下普通函数调用的机制程序调用某函数函数执行程序等待函数将结果和控制权返回给程序程序继续处理。   Reactor 释义“反应堆”是一种事件驱动机制。和普通函数调用的不同之处在于应用程序不是主动的调用某个 API 完成处理而是恰恰相反Reactor 逆置了事件处理流程应用程序需要提供相应的接口并注册到 Reactor 上如果相应的事件发生Reactor 将主动调用应用程序注册的接口这些接口又称为“回调函数”。   Reactor 模式是处理并发 I/O 比较常见的一种模式用于同步 I/O中心思想是将所有要处理的 I/O 事件注册到一个中心 I/O 多路复用器上同时主线程/进程阻塞在多路复用器上一旦有 I/O 事件到来或是准备就绪(文件描述符或 socket 可读、写)多路复用器返回并将事先注册的相应 I/O 事件分发到对应的处理器中。 Reactor 模型有三个重要的组件 多路复用器由操作系统提供在 linux 上一般是 select, poll, epoll 等系-统调用。事件分发器将多路复用器中返回的就绪事件分到对应的处理函数中。事件处理器负责处理特定事件的处理函数。 具体流程如下   1. 注册读就绪事件和相应的事件处理器   2. 事件分离器等待事件   3. 事件到来激活事件分发器事件分发器调用事件对应的处理器   4. 事件处理器完成实际的读操作处理读到的数据注册新的事件然后返还控制权。 Reactor 模式是编写高性能网络服务器的必备技术之一它具有如下的优点 响应快不必为单个同步时间所阻塞虽然 Reactor 本身依然是同步的编程相对简单可以最大程度的避免复杂的多线程及同步问题并且避免了多线程/进 程的切换开销可扩展性可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源可复用性reactor 框架本身与具体事件处理逻辑无关具有很高的复用性 Reactor 模型开发效率上比起直接使用 IO 复用要高它通常是单线程的设计目标是希望单线程使用一颗 CPU 的全部资源但也有附带优点即每个事件处理中很多时候可以不考虑共享资源的互斥访问。可是缺点也是明显的现在的硬件发展已经不再遵循摩尔定 律CPU 的频率受制于材料的限制不再有大的提升而改为是从核数的增加上提升能力当程序需要使用多核资源时Reactor 模型就会悲剧,。   为什么使用多核资源时Reactor会悲剧呢如果程序业务很简单例如只是简单的访问一些提供了并发访问的服务就可以直接开启多个反应堆每个反应堆对应一颗 CPU 核心这些反应堆上跑的请求互不相关这是完全可以利用多核的。例如 Nginx 这样的 http 静态服务器。 Proactor模型 具体流程如下 处理器发起异步操作并关注 I/O 完成事件事件分离器等待操作完成事件分离器等待过程中内核并行执行实际的 I/O 操作并将结果数据存入用户自定义缓冲 区最后通知事件分离器读操作完成I/O 完成后通过事件分发器呼唤处理器事件处理器处理用户自定义缓冲区中的数据 从上面的处理流程我们可以发现 proactor 模型最大的特点就是 Proactor 最大的特点是使用异步 I/O。所有的 I/O 操作都交由系统提供的异步 I/O 接口去执行。工作线程仅仅负责业务逻辑。   在 Proactor 中用户函数启动一个异步的文件操作。同时将这个操作注册到多路复用器上。多路复用器并不关心文件是否可读或可写而是关心这个异步读操作是否完成。异步操作是操作系统完成用户程序不需要关心。多路复用器等待直到有完成通知到来。当操作系统完成了读文件操作——将读到的数据复制到了用户先前提供的缓冲区之后通知多路复用器相关操作已完成。多路复用器再调用相应的处理程序处理数据。   Proactor 增加了编程的复杂度但给工作线程带来了更高的效率。Proactor 可以在系统态将读写优化利用 I/O 并行能力提供一个高性能单线程模型。在 windows 上由于没有 epoll 这样的机制因此提供了 IOCP 来支持高并发 由于操作系统做了较好的优化windows 较常采用 Proactor 的模型利用完成端口来实现服务器。   在 linux 上在2.6 内核出现了 aio 接口但 aio 实际效果并不理想它的出现主要是解决 poll 性能不佳的问题但实际上经过测试epoll 的性能高于 pollaio并且 aio 不能处理 accept 因此 linux 主要还是以 Reactor 模型为主。在不使用操作系统提供的异步 I/O 接口的情况下还可以使用 Reactor 来模拟 Proactor差别是使用异步接口可以利用系统提供的读写并行能力而在模拟的情况下这需要在用户态实现。具体的做法只需要这样 注册读事件同时再提供一段缓冲区事件分离器等待可读事件事件到来激活分离器分离器立即读数据写缓冲区调用事件处理器事件处理器处理数据删除事件(需要再用异步接口注册) 我们知道Boost.asio 库采用的即为 Proactor 模型。不过 Boost.asio 库在 Linux 平台采用 epoll 实现的 Reactor 来模拟 Proactor并且另外开了一个线程来完成读写调度。 同步I/O模拟Poractor模型 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。主线程调用 epoll_wait 等待 socket 上有数据可读。当 socket 上有数据可读时epoll_wait 通知主线程。主线程从 socket 循环读取数据 直到没有更多数据可读然后将读取到的数据封装成一个请求对象并插入请求队列。睡眠在请求队列上的某个工作线程被唤醒它获得请求对象并处理客户请求然后 往 epoll 内核事件表中注册 socket 上的写就绪事件。主线程调用 epoll_wait 等待 socket 可写。当 socket 可写时epoll_wait 通知主线程。主线程往 socket 上写入服务器处理客户 请求的结果。 两个模式的相同点都是对某个 IO 事件的事件通知(即告诉某个模块这个 IO 操作可以进行或已经完成)。在结构上两者也有相同点demultiplexor 负责提交 IO 操作(异步)、查询设备是否可操作(同步)然后当条件满足时就回调注册处理函数。   不同点在于异步情况下(Proactor)当回调注册的处理函数时表示 IO 操作已经完成同步情况下(Reactor)回调注册的处理函数时表示 IO 设备可以进行某个操作(can read or can write)注册的处理函数这个时候开始提交操作。 Libeventlibevlibuv libevent :名气最大应用最广泛历史悠久的跨平台事件库   libev :较 libevent 而言设计更简练性能更好但对 Windows 支持不够好   libuv :开发 node 的过程中需要一个跨平台的事件库他们首选了 libev但又要支持Windows故重新封装了一套linux 下用 libev 实现Windows 下用 IOCP 实现 优先级 libevent: 激活的事件组织在优先级队列中各类事件默认的优先级是相同的可以通过设置事件的优先级使其优先被处理   libev: 也是通过优先级队列来管理激活的时间也可以设置事件优先级   libuv: 没有优先级概念按照固定的顺序访问各类事件 事件循环 libevent: event_base 用于管理事件   libev: 激活的事件组织在优先级队列中各类事件默认的优先级是相同的   libuv: 可以通 过设置事件的优先级 使其优先被处理 线程安全 event_base 和 loop 都不是线程安全的一个 event_base 或 loop 实例只能在用户的一个线程内访问一般是主线程注册到 event_base 或者 loop 的 event 都是串行访问的即每个执行过程中会按照优先级顺序访问已经激活的事件执行其回调函数。所以在仅使用一个event_base 或 loop 的情况下回调函数的执行不存在并行关系。
http://www.pierceye.com/news/127743/

相关文章:

  • wordpress门户网站模板下载大专计算机专业主要学什么
  • 专业的微商城网站建设农产品网站建设计划书
  • 软件网站开发公司广告公司创意取名
  • 工业设计东莞网站建设个人网站备案网站名称
  • 网站只能用ip访问网站吗导航网站 win8风格
  • 用ps可以做网站吗制作一个网站流程
  • 做网站支付系统难度做灯笼手工简单做法
  • 合肥珍岛公司做网站推广怎么样用excel做网站
  • 大连网站建设开源广告制作行业
  • 安阳河南网站建设wordpress 建立导航
  • 电子商务网站建设 考卷wordpress替换头像
  • 石家庄的网站的公司手机wordpress加载图片慢
  • 建企业网站教程wordpress网站被黑
  • 饮料网站建设市场分析什么是seo网站优化
  • 滑动网站国家级示范建设网站
  • 做一门户网站价格个人网站制作模板图片
  • 做网站需要审核资质吗wordpress 防恶意注册
  • 怎么不花钱建网站无人售货机
  • 可以做空股票的网站thinkphp网站开发
  • 给别人做网站怎么赚钱吗专业网络推广软件
  • SOHO英文网站制作晋江网站制作
  • 启东住房和城乡建设局网站邢台网站制作报价多少钱
  • 佛山网站建设seo优化做英文的小说网站有哪些
  • 安顺建设局网站官网哪里有响应式网站企业
  • 唯品会一家做特卖的网站国家商标查询官方网站
  • 网站宝搭建网站环境做电商网站一般需要什么流程图
  • 南通网站建设团队wordpress广告产检
  • 做网站刷赞qq怎么赚钱邢台路桥建设总公司没有网站吗
  • 网站仿站教程常用外贸网站
  • 南昌市有帮做网站的吗纵横天下网站开发