常见的IO模型

本文介绍了四种常见的服务器端编程IO模型:同步阻塞IO、同步非阻塞IO、IO多路复用及异步IO。详细解释了同步与异步、阻塞与非阻塞的区别,并分析了各模型的特点及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、服务器端编程经常需要构造高性能的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模型进行实战理解。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值