常见的IO模型

一、服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:

1.同步阻塞IO(Blocking IO):即传统的IO模型。

2.同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。

3.IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。

4.异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

总结来说就是同步阻塞、同步非阻塞、异步阻塞、异步非阻塞四种。

二、同步与异步

1.同步:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;

2.异步:异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

三、阻塞与非阻塞

1.阻塞:阻塞是指IO操作需要彻底完成后才返回到用户空间;

2.非阻塞:非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

四、同步阻塞IO模型

常见的IO模型整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。

五、同步非阻塞IO

常见的IO模型

整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

六、IO多路复用模型

常见的IO模型IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题。IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因为它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO,而非真正的异步IO。

 

七、异步IO模型

常见的IO模型“真正”的异步IO需要操作系统更强的支持。在IO多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据。而在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。异步IO模型使用了Proactor设计模式实现了这一机制。

相比于IO多路复用模型,异步IO并不十分常用,不少高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构基本可以满足需求。况且目前操作系统对异步IO的支持并非特别完善,更多的是采用IO多路复用模型模拟异步IO的方式(IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)。

PS:先基本了解了四种IO模型的概念,接下来将会对每种IO模型进行实战理解。

 

 

你可能感兴趣的:(常见的IO模型)