- 1、本文档共13页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络编程模型与中间件设计思路
* * 网络编程模型与中间件设计思路 Unix与Linux的5种IO模型 1、阻塞I/O(Blocking I/O) 2、非阻塞I/O(Non-Blocking I/O) 3、I/O复用(select、poll、linux 2.6种改进的epoll)(I/O Multiplexing) 4、信号驱动IO(Singal-Drive I/O) 5、异步I/O(Asynchronous I/O)(POSIX的aio_系列函数) POSIX:Portable Operating System Interface of Unix 可移植操作系统接口 5种IO模型详细说明 blocking : 最简单的模型 ,使用最简单 non-blocking: 看似节省时间,实际上poll会占用更多的资源,需要和其他模型配合使用 I/O multiplexing: 大名鼎鼎的select、epoll、kqueue。同时在多个描述符上进行等待、能超时(JAVA目前支持) signal-driven I/O: 真正的异步模式。(所谓异步,就是I/O事件发生的时候Kernel会利用Callback来通知处理数据的线程,然后该线程再去取数据。上面三个模式都是同步的,也就是说Kernel不会告诉用户程序什么时候I/O ready了。)。利用的sigaction来注册一个SIGIO的处理函数,然后系统通过SIGIO来callback 信号处理函数。 Asynchronous I/O: 另外一种异步模式。主要的区别是,Kernel不仅通知用户进程I/O时间,同时把数据从Kernel空间复制到用户空间,当用户空间进行处理的时候,I/O已经处于“完成”状态了。(先提交给内核,完成之后通知) Blocking I/O 无数据可读,则在调用处等待,直到有数据读可读才会执行后面的语句(阻塞当前线程) Non-Blocking I/O 无数据读,则直接返回,继续后面的执行 I/O Multiplexing 若没有数据,则在相应函数在等待(select 、epoll_wait等) Windows系统常用5种IO模型 选择(Select)(多路复用) 异步选择(WSAAsyncSelect)(采用WIN消息机制,通过消息通知I/O操作) 事件选择(WSAEventSelect)(采用内核对象Event,通过内核信号状态来通知) 重叠I/O(Overlapped I/O)(比事件选择更进一步,相应操作完成之后激发相应事件) 完成端口(Completion Port)共五种I/O模型 (很复杂,更更进一步,相应I/O操作完成之后放入队列,最高效率) JAVA网络编程模型(IO与NIO) 同步I/O NIO(多路复用) AIO(还没有实现,Java SE 7.0 可能会实现) NIO实现机制 Windows:select(无法支持大量连接,JAVA服务程序不适合跑在win下) Linux:epoll(能支持大量连接) FreeBSD:kqueue(比select强) 网络服务器软件基本结构 Read Request Decode Request Process Service Encode Reply Send Reply 基本结构相同,但处理模型非常多,软件设计上非常复杂 JAVA网络服务器软件基本结构一 JAVA网络服务器软件基本结构二 JAVA网络服务器软件基本结构三 JAVA网络服务器软件基本结构四 中间件协议设计 中间件接口设计 public interface Function { public void invoke(IContext context) throws InvokeException; } 所有的业务功能都必须继承此接口。 public interface IContext { /** * 获得程序的上下文接口 * * @return */ public IAppContext getAppContext(); /** * 返回数据源服务接口 * * @return */ public IDBService getDBService(); /** * 获得请求对象 * * @return */ public IRequest getRequest(); /** * 获得响应对象 * * @return */ public IResponse getResponse(); } 中间件部署图 Client AppSer
文档评论(0)