网络应用的编程模型

网络应用有很多种,现今互联网以及移动互联网时代最多的当属是HTTP Service。早在互联网+这个词充斥各种新闻之前,互联网就是由成千上万的HTTP Service节点构成的。当网络应用越来越复杂,一个应用的用户数量到达一定程度的时候,HTTP Service的性能就会被高度关注起来。因为这个问题,不仅仅是服务器成本的问题,还是用户体验的问题。

网络应用的性能瓶颈之一在于 I/O 处理上,网络I/O,磁盘I/O的响应是非常慢的,效率是非常低的。相比于内存I/O,网络和磁盘就行走路,而内存就像是飞。如何让I/O跟上CPU的处理速度,不让I/O成为瓶颈呢?我们先看看网络应用的几种编程模型。

单线程下的阻塞式I/O

基本属于科普讲解级别的应用编程模型。这里的单线程指的是接受网络连接请求的处理代码是单线程工作的,所有请求需要排队处理。阻塞式I/O指的是请求必须处理一个完成后再处理下一个。由于请求处理的内容不一样,处理所需时间也不一样,这严重影响了整体的用户体验。

image

多线程下的阻塞式I/O

由于单线程下的阻塞式I/O的明显缺陷,所以就有了多线程下的阻塞式I/O编程模型。根据单线程的解释顾名思义,多线程指的是接受网络连接请求的处理代码事多线程工作的,这样多个并行的网络请求,就可以并行处理,这样零星的超时处理就不会影响到其他的用户。

image

基于事件驱动单线程下的无阻塞式I/O

这里的单线程和上面的单线程一样,都是指接受网络连接请求的处理代码是单线程工作的,无阻塞式I/O指的就是请求的处理是无阻塞的,请求的处理在其他线程中完成后由事件循环机制通知请求处理线程,再由请求处理线程返回给客户端。单线程无阻塞式I/O与多线程阻塞式I/O其实都是多线程并行计算处理请求的,他们之间的主要差别在于将线程开辟推延至需要密集计算的业务处理逻辑阶段。在网络I/O阶段,单线程相比多线程有无需线程调度,无需公共资源竞锁的优势。

image

原文地址:https://www.cnblogs.com/binking338/p/5039091.html