参考:http://www.cnblogs.com/alex3714/articles/5248247.html

写服务器处理模型的程序时通常采用的模型:

(1)每收到一个请求,创建一个新的进程,来处理该请求;特点:由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
(2)每收到一个请求,创建一个新的线程,来处理该请求;特点:要涉及到线程的同步,有可能会面临死锁等问题。
(3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求。特点:写应用程序代码时,逻辑比前面两种都复杂。
上面的几种方式,各有千秋,一般普遍认为第(3)种方式是大多数网络服务器采用的方式。

事件驱动模型

事件驱动模型大体思路如下:
1. 有一个事件(消息)队列;
2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;

事件驱动程序的执行流由外部事件来决定。它包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。

以下为单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。

在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。

在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的bug。

在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。

IO多路复用:

参考http://www.cnblogs.com/alex3714/articles/5876749.html

http://www.cnblogs.com/alex3714/articles/5248247.html

最新文章

  1. 使用后台服务数据更新UI
  2. jquery学习笔记----jquery相关的文档
  3. 一些sql语句的常用总结(重要)
  4. 将Spark中CompactBuf转换为String
  5. java与javax有什么区别?
  6. 数据库(批处理, 事务,CachedRawSetImpl类
  7. css盒子模型,定位,浮动
  8. java 异常处理机制(java 编程思想)
  9. Android基础夯实--你了解Handler有多少?
  10. CheckForIllegalCrossThreadCalls = false
  11. c# WinForm 文本输入对话框
  12. ELK+Redis+Nginx服务数据存储以及Nginx日志的收集
  13. 【 Gym - 101138F 】GukiZ Height (数学)
  14. laravel的firstOrCreate的作用:先查找表,如果有就输出数据,如果没有就插入数据
  15. poj 2236 加点 然后判断某两点是否连通
  16. 【Ray Tracing in One Weekend 超详解】 光线追踪1-6
  17. JavaScript三(对象思想)
  18. 【转载】CodeIgniter与PHP5.6的兼容问题
  19. IntelliJ IDEA2017 java连接mysql数据库并查询数据
  20. react.js学习之路三

热门文章

  1. IT架构的本质--阅读笔记01
  2. springboot cloud 网盘
  3. React 渲染嵌套对象,内部对象会是undefined
  4. python图像处理常用方法
  5. 数学之美_正态分布(Python代码)
  6. <黑马新秀>Spring学习日志
  7. 17.3.13---socket网络套接字介绍--函数和数据类型
  8. ruoyi StringUtils
  9. 通过java语言实现MD5加密
  10. Python - 使用 xlwt 写入表格