当前位置:嗨网首页>书籍在线阅读

11-每个连接对应一个线程

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.4.1 每个连接对应一个线程

“每个连接对应一个线程”是一种编程模式,在该模式中,每个工作单元被分配给一个线程,而该线程在该工作单元执行期间,不会被分配给其他工作单元。工作单元是指如何分解应用的工作:请求、连接等。在这里,我们将“连接”作为描述该模式的通用术语。

描述该模式的另一种方式是“运行直到结束”。一个线程处理一个连接或请求,直到处理结束,这样线程就可以处理另一个新的请求。这对于I/O很有意义,实际上,I/O是“每个连接对应一个线程”模式和事件驱动模式之间的一个很大区别。在“每个连接对应一个线程”模式中,采用阻塞式I/O——实际上任何I/O都是允许的,因为连接“持有”该线程。阻塞线程只会中止引起阻塞的连接。在这种情况下,“每个连接对应一个线程”模式使用内核处理工作调度以及I/O管理。

在这种模式下,线程数是个实现细节。目前为止,我们已经讨论了每个连接对应一个线程,假设每个工作单元都有线程来处理它。这种情况是存在的,但是对于大多数应用在实现时都倾向于对创建线程数设置上限。如果当前正在执行的连接数(即线程数)达到上限,新的连接可能会入队列,可能会被拒绝,直到正在执行的连接数下降到上限值以下。

注意,该模式本身并不需要线程。实际上,如果把“线程”替换成“进程”,就相当于描述老的UNIX服务器。比如,Apache的标准fork模式就遵循这个模式。这也是Java I/O的经典模式,虽然偏好有变化。