【VC++开源代码栏目提醒】:网学会员在VC++开源代码频道为大家收集整理了“Java开源网络通信框架设计评析——NIO网络开发设计实践 - 网络与通信“提供大家参考,希望对大家有所帮助!
∽ o o l 一 aa J v开 源 网 络 通 信 框 架 设 计 评 析 :H D 。
4 I I aa 在J K 1 的新特性 中,N O无疑是最显著和鼓舞人心 的 。
N O的 出现事实上意味着J v 虚拟机 的性 V 在 能 比以前 的版本有 了较 大的飞跃 。
在 以前 的J M的版本 中,
代码 的执行效率 不高( 最原始的版本 中 aa ,用J v 编写的应用程 序通常所 消耗 的主要资源就 是C U,也就是说应用系 J v 是解释执行的语言) aa P P aa aa 统的瓶颈是C U的计算 和运行能力 。
在不断更新 的J v 虚拟机版本 中,通过动态编译技术使得J v 例如C C + 的程序 不相 上下。
在这种
代码 执行的效率得 到大幅度提 高,几乎和操 作系统的本地语言( /+ ) P 转移 到I 操 作 了。
尤其是服务器 端 的应用 ,大量 的网络I 情 况下 ,应用系统 的性能瓶 颈就 从C U O O和 O的操 作,使得I 磁盘 I I aa O数据 等待的延迟成 为影 响性能 的主 要因素 。
N O的出现使得 J v 应用
程序能 O操作 。
够更加紧密地 结合操 作
系统 ,更加充分地利用操 作系统 的高级特性 ,获得高性能的I ,全部在一个阻塞调用中进行。
据) 那 么事件 通知 和事 件处 理的 分离 O网络 开 发 设 计 实 践 NI 有什么好处呢? 可 以这 么 比较 一 下 : 基 于 no的 i 设 计在事件通知 方面 ,通 常只需要 1个线 程作 阻塞处 理 ,如果采 用多 个事 件分 ■文,彭帅 离线 程 ,则 大 致 需 要 CP U数 量个 线 程 。
(关于 多事件分离线程 的应 用,后文中 ,在事 件到达之前 ,后端事 件 有讲 述 ) 根 本 区别 在 于 no可 以对 事 件 通 知 和事 i 处 理线 程处 于休 眠状 态。
而对 于基于 此 件 处 理 作 分 离 ,比 如 0P RE _ AD事 件 的到 达和具 体数 据的 读取及 处理 在逻 辑上是可 以分阶段进 行的 ,ni o下惯 用 bo的 设 计 来 说 ,通 常 是 每 个 线 程 对应 一 i t e dp r n e t ) 个 连接 ( ra e o n cin。
如 h 果服务器应用某 时刻有 n c 个客户端并发 o e co 模 O事 的 ra tr 式 就 是 对 l 件 作 集 中 个 访 问 ,那 么就 需要 让 n 线程 全 部 阻塞 或若 干个 ) 件分离 管理 ,采 用一个 ( 事 O事 在 J 件 监 听 和 处 理 上 , 直 到 一 个 客 线程 ( e l lx r对所 有 I D mu i e e ) tp /0事 件 的 户 端 断开连 接,否则 其连 接对应 的线 到 达 作 集 中 监 管 和 派 发 , 然 后 委 托 事 程 会 一 直 被 其 占用 作 阻 塞式 处 理 。
E e t n lr作 件处理器 ( v nHa de) 事件处 理。
i易 虽 然 bo 于 使 用 且 开 销 较 低 ,但 i 并且 在 no下 的事 件 处 理 机 制是 多路 需要 处理 大型 多线程 时,则 会 出现 问 复 用 ( l lxn ) ,具体 来 说就 是 mu i e ig 的 tp 题。
因此 对 于 需 要 满 足 高 并 发 的应 ee tr 对 S lco 作 一次 阻塞 的 s lc(调用 ee t) T P服 务 器 来 说, 用,尤其是对于 H T 可 以同 时捕获 一个事 件 集合 。
而换 作 no是最理 想的选择 。
从 当今 趋势可见 i i模型 ,无法对事件通知 和事 件 传统 bo 一 a a下 知 名 的 T mc t J t 、 斑 :J v o a、 et y 处 理 两 阶 段 作 分 离 , 比 如 一 个 同 步 的 s a Fs h Gl s i , 如 今 都 已 经 纷 纷 采 用 了 S c elD t t a ra (调 用,事 件 o k t uS r m. d ) n e e i o a a领域 ,在 C C+ 世 界 里 n 。
跳 出 J v / + 到达 ( 和事件处理 ( 有数据可读 ) 读取 数 L h p 、N i g i td gn x这些采 用 e ol pl多路复 116 程 序员 T用 机制 的HT P服 务 器相 比 传统 采 用 T P服务 粒 度 较 小 的情 况 下 ,比如 H T 应 用 环 境 中 , 通 常 的 设 计 结 构 是 i方bo 式 的 A a h p c e等 来 说 , 也 明 显 体 器 。
整 体 来 说 , 非 阻 塞 方 式 的可 用 性 WEB端 作 接 入 层 , 然后 由接 入 层 调 现 出性 能 优 势 。
i o 是 比 较 高 的 ,所 以也 被 大 多 数 基 于 n C 用 后 端 RP 中 间 件 层 作 逻 辑 处 理 和 一 个典 型 的
网络 处理 过 程通 常可 的 S re 所 采 用 。
ev r 数 据 库 操 作 。
RPC中 间 件 通 常 是 处 切 分 为消息 派发 、消息 识别 和消 息处 于 内部 网络 环境 ,且面 对 的接入 层连 理 这 3个 固 定 步 骤 。
那 么 , 我 们 就 围 阻塞方式 接 并非 海量 。
在 这种情 况下 ,对 消息 i绕 这 个 核心 处 理 过 程来 探 讨 no的设 i 这 种 方 式 一 般 是 基 于 bo的 处理 方 识 别进 行阻 塞式 处理就 非 常理想 。
因 计 模式 。
式。
no亦 i 采用 阻 塞 i 可 实现 ,但 no下 为在 网络稳 定 的情况 下 ,数 据 的传输 方 式 进 行 消 息 识 别 是 比 较 少 见 的 一 种 流 畅 , 对 于 阻 塞 方 式 来 说 , 消 息 识 别 N O S re端 的设计 l ev r 做法 。
工 作可 以在 同 一线 程 中一 次性 完 成 ,消息识别 i 首 先 要 强 调 的 是 ,no下 不 可 使 而 在 非 阻 塞 方 式 下 , 可 能 需 要 进 行 多 在 此 阶 段 ,S re 端 的 主 要 任 务 ev r O模 用原生 的阻塞 l 式。
事实 上,只 有 次 线 程 切 换 来 完 成 一 个 消 息 识 别 。
也 l t e就是要读取 Cin 传递过来的一个完整 ee tbe a n l 非 阻 塞 的 S lca lCh n e 才 可 注 即 是 阻 塞 比 非 阻 塞 方 式 来 说 , 线 程 切 消息。
消息 识别 的手 法可 以是 非 阻塞 c ee o 以 册 S l tr 参 与 事 件 驱 动 。
若 通 过 换 的内耗 要少 。
方 式 ,也 可 以是 阻 塞 方式 。
再 次 强 调 , S reS c e.o f ue lc igt e e r o k t ni rBo k ( u ) v c g n r 在 针 对 非 海 量 客 户 端 、 网络 稳 定 这 里 讨 论 的 阻塞 和 非 阻 塞 指 的 是 网络 来 设 置 阻 塞 , 则 程 序 在 后 续 S lco. ee tr 可控 的环 境 中,采 用阻塞 方式 会 比非 通 信 的 处 理 模 式 , 而 非 具 体 的 AP 层 I t rgse 调用 中会抛 出川 g ll kn M ei r e aBo i c g 阻塞方式有更好的性能。
面上的含义。
o d E c pi o e x e t n异常。
T P 但 是对 于 面 向公 网 的 前端 H T i下 no 实现阻塞 方式有点 特殊,一 服 务 器 而 言 , 个 人 感 觉 采 用 阻 塞 方 式 非阻塞方式 般 是 通 过 忙 循 环 来 实 现 的 。
代 码 示 范 并不十 分可 取 。
因为 网络具 有不 可控 这 种 方 式 只 能 采 用 no函 i 数 忽略 了无关 内容 ) 如下 ( : at l .