【操作系统】I/O模型

阻塞I/O

说明:应用程序调用recvfrom函数,会导致应用程序阻塞,进入阻塞状态后直到I/O操作结束才会返回;如果系统内核数据没有准备好,那就一直等待数据准备,内核数据准备好之后数据从内核拷贝到用户空间,拷贝结束后,阻塞返回,这个过程中应用程序一直在等,做不了任何事情。

优点:开发简单,容易入门。在阻塞等待期间,用户线程挂起,在挂起期间不会占用CPU资源。

缺点:一个线程维护一个IO,不适合大并发,在并发量大的时候需要创建大量线程来维护网络连接,内存、线程开销非常大。

非阻塞I/O

说明:用户线程发起IO请求时如果没有数据就绪则立即返回,返回字段为“EWOULDBLOCK”,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,即“轮询”机制,这个过程中用户线程不会阻塞,可以执行其他任务。 整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,需要不断地轮询、重复请求、消耗了大量的CPU资源,是比较浪费CPU的方式。

优点:每次发起IO调用,在内核等待数据的过程中可以立即返回、用户线程不会阻塞,实时性好。

缺点:多个线程不断轮询内核是否有数据,占用大量CPU资源。

I/O多路复用

说明:在I/O复用模型中,并不是阻塞到I/O操作过程中,而是阻塞到监听函数中; 以select为例:进程在select处阻塞,等待几个描述符中的一个变为可操作,如果没等待到就继续阻塞在第一阶段,如果等到了一个描述符变为了可操作,则调用recvfrom函数将数据拷贝到应用缓冲区。

优点:系统不必创建维护大量线程,只使用一个线程就可以同时监听大量连接,大大减少系统开销。

缺点:本质上,select、poll、epoll的系统调用是阻塞式的,属于同步IO,需要在读写事件就绪后,应用程序发起系统调用进行阻塞读写。

信号驱动I/O

说明:应用程序注册一个SIGIO信号处理函数,如果数据没有准备好,则立即返回结果,进程继续工作并不阻塞。当数据准备好时,系统内核会主动发送一个SIGIO信号给应用程序,应用程序收到信号后,可以在信号处理函数中调用I/O操作函数recvfrom进行数据处理。

优点:进程不需要轮询等待数据就绪,而是通过信号异步通知,减少 CPU 的轮询负担。

缺点:本质上,信号驱动IO在数据准备完毕时通过信号异步通知,而对于数据从内核空间到用户空间仍需要用户发起系统调用,这个过程是同步的。

异步I/O

说明:用户发出系统调用后,立刻就可以做其他的事,不会产生任何阻塞。由内核等待数据准备完成,然后将数据拷贝到用户空间,当这一切完成后,内核会给用户进程发送一个信号,告诉它操作已经完成。可见整个过程都是内核完成的,当处理完毕,只需要通知应用进程即可。

优点:真正的非阻塞!

五种IO模型对比:

对于前四种IO模型,主要区别在第一阶段,它们的第二阶段是一样的:数据从内核缓冲区拷贝到用户空间是阻塞的,这个过程需要应用程序发出系统调用,是同步的过程。(只有同步IO才考虑阻塞和非阻塞,异步IO肯定是非阻塞的)。注意,对于信号驱动IO,在数据准备阶段是异步的,由内核处理完成通过信号异步通知应用程序。

简单回答

  • 阻塞 I/O:进程发起 I/O 请求时,会被阻塞,直到 I/O 操作完成,简单,但效率低。
  • 非阻塞 I/O:进程不阻塞,可以继续执行其他任务,但需要主动查询 I/O 状态,消耗CPU。
  • I/O 多路复用:通过单个进程或线程管理多个 I/O 操作,适用于高并发场景。
  • 信号驱动 I/O:通过信号机制通知进程 I/O 完成,减少 CPU 轮询负担。
  • 异步 I/O:最先进的模型,完全非阻塞,I/O 完成后通过回调或通知进行处理,适用于高并发且要求低延迟的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值