标签:有关 激活 变化 rev size AC info 项目 height
最近在项目中用到TCP通信来完成命令和运行结果的交互,用的是典型的TCP通信中的C/S架构,原因很简单:在业务需求低的环境下,这种架构简单、稳定还容易写。但是在实际部署的情况下,一直出现读不到数据的空指针异常,按说BIO模式开发的应该阻塞直到有数据读取,没有找到原因就变通写了一个消息队列,使用定时器每1s从定时器中拿数据,解决了这个问题。但是想想这种同步阻塞的形式,就想了解一下其他的模式:NIO、AIO。好了,啰嗦了好多,进入正题:
在说明BIO/NIO/AIO之前,要先弄明白这些概念和原理,什么是同步、异步,阻塞和非阻塞:
总结起来同步异步是针对应用程序和内核的交互而言的,而阻塞和非阻塞是针对进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,就是一种读取和写入操作实现方式。更底层一点来说,同步和异步只是跟IO操作过程中进程的状态变化有关,而阻塞和非阻塞就是进程的两种状态。不要混淆了这些东西。
根据上面的基本概念,生成常见的四种IO模式:
下面来一一的说明这四种模型:
从上图中可以看到,用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。使用select函数的优点并不仅限于此。虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只注册自己感兴趣的socket或者IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率。
上面简单的介绍了一下目前服务器编程中常见的几种IO模型,但是真正把这几种IO模型付诸实施的是几种设计模式:
第二篇说明详细的说明这几种模式!!
标签:有关 激活 变化 rev size AC info 项目 height
原文地址:https://www.cnblogs.com/chailinbo/p/9226277.html