面试中常被问到(13)五种IO模型

本文详细介绍了四种不同的IO模型:阻塞IO、非阻塞IO、信号驱动IO和复用IO。阻塞IO会一直等待IO条件满足;非阻塞IO在条件不满足时直接返回错误;信号驱动IO通过注册信号处理函数,当数据准备好时通过信号通知进程;复用IO允许多个IO操作注册到同一管道,通过select等机制监听,当条件满足时进行数据拷贝。这些模型在不同场景下各有优劣,理解它们对于优化系统性能至关重要。
摘要由CSDN通过智能技术生成

阻塞IO:

发起IO调用,若发现IO未就绪(IO条件不具备),则一直等待  也就说条件不满足一直死等

非阻塞IO:

发起IO调用,若发现IO未就绪,则直接报错返回

应用程序通过recvfrom调用不断和内核交互,当条件未达到会直接返回,然后不断轮询,不停去询问内核数据条件是否满足,如果条件满足数据准备好了,则把数据从内核空间拷贝到用户数据空间中。如果条件不满足,数据没有准备好,内核会向应用程序报错,隔断时间应用程序再次调用recvfrom发起请求,间隔的这段时间中,应用程序可以做自己的事

信号驱动IO:

自定义IO信号处理,等待IO就绪,收到信号打断当前操作进行IO

应用程序会预先在内核中注册一个信号处理函数,然后用户进程直接返回,并不阻塞,当内核中条件满足,数据准备好之后就会通过信号处理函数发送一个信号给进程,用户进程便在信号处理函数中把数据从内核空间拷贝到用户空间

发现信号驱动IO相比较于非阻塞IO一遍遍轮询,直接等待数据准备好然后通知进程,进程收到通知后,直接拷贝数据到用户空间。

复用IO:

将多个进程IO注册到同一个管道上,管道和内核交互,当管道中某一进程的IO调用的条件满足,数据准备好,进程则把对应数据拷贝到用户空间

多个进程的IO可以注册到同一个select中,用户调用select,select会监听所有注册好的IO,如果所有被监听的IO需要的数据都没有准备好,select调用进程就会阻塞,如果其中有一个IO所需要的数据准备好了,select调用就会返回,然后进程通过recvfrom进行数据拷贝。

异步IO:

上述三个都是同步操作,都是靠自己完成,而异步是通过其他代替自己完成

用户进程发起IO调用,给内核传递描述符,缓冲区指针或缓冲区大小等,并告诉内核完成操作后如何通知进程,然后用户进程就返回去做自己的事,然后内核开始等待数据准备,数据准备好了以后,直接把数据拷贝到用户空间,然后通知用户进程本次IO完成即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HT . WANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值