五种IO模型

五种IO模型

什么叫做读就绪,什么叫做写就绪?

读就绪:接受缓冲区中的数据大小,大于等于低水位标记(1字节)

写就绪:发送缓冲区中的剩余空间的大小,大于等于低水位标记(1字节)

一、阻塞IO

用户线程发起IO请求时,内核会去查看数据是否就绪,如果数据没有就绪,那么该线程就会陷入阻塞状态,也就是说该线程这时候就不会继续向下执行,同时它也会让出CPU,直到数据就绪,那么这个时候用户线程才会进行对应的IO处理。

举例说明:

以套接字中的read函数举例:

当我们想要读取接受缓冲区中的内容时,我们会调用read函数。这个时候,内核会去接受缓冲区中查看数据是否准备就绪,如果准备就绪,那么就直接将数据拷贝到该线程中,然后将执行的结果返回。如果没有就绪,那么这个线程就会一直在这等待,线程就会一直停留在read函数这里,就不会向下执行。

二、非阻塞IO

用户进程发起IO请求时,内核去查看数据是否就绪,如果数据没有就绪,那么会直接报错返回。如果就绪,那么

用户线程才会进行对应的IO处理

注意:

因为非阻塞IO当数据没有就绪时,会直接报错返回,所以我们想要成功读取或写入数据,那么我们就要一直判断数据是否就绪,因此非阻塞IO需要程序员自己去循环去读取该文件描述符。所以这样的办法,会很浪费CPU,因此很少用它。

三、信号驱动IO

用户线程发起IO请求,然后用户线程继续向下执行,不会阻塞在这里。如果某个时候,数据准备就绪,那么内核会发出一个信号,告诉用户线程说你要的数据已经准备好了。于是这个时候用户线程就会进行对应的IO处理。

四、异步IO

用户线程发起IO请求,然后继续向下执行。内核会等待数据准备完成,然后内核会直接代替用户线程去执行对应的IO请求,执行完毕之后,会直接将结果返回就行。

五、区别异步IO和信号驱动IO

信号驱动IO是在数据准备就绪时,内核发出信号,然后用户线程来进行IO处理。但是异步IO是整个过程都由内核来完成,包括对于IO的处理也是内核来完成,也就是说,用户线程不需要知道如何进行IO处理,直接使用处理之后的结果就行。

举例说明:(钓鱼举例)
信号驱动IO:

A去钓鱼,然后他将鱼竿放入水中,然后因为它有事情,于是就找了一个人B帮助他看住鱼竿,接着就离开去处理其他事情。接下来如果有鱼上钩,那么B就会打电话告诉A,然后A再回来把鱼钓上来,放入桶中等等一系列过程,这都是由A亲自完成,B只负责通知。

异步IO:

A去钓鱼,然后他将鱼竿放入水中,然后因为他有事情,于是就找了一个人B帮助他钓鱼,于是他就去处理其他事情。接下来如果有鱼上钩,那么B就负责将鱼钓上来,然后放入桶中,再将鱼竿放入水中等等这一系列的过程。当把鱼钓完之后,他打电话告诉A已经钓完鱼了,于是A只需要过来将桶中的鱼全部拿走即可。

六、区别同步和异步

同步和异步形容都是消息通知的方式

同步:

当我们发起一个调用时,如果没有得到结果,那么该调用就不会返回,并且程序也不能继续向下执行,必须等到有结果时,那么才会返回,程序才能继续向下执行。

异步:

当我们发起一个调用时,该调用可以立即返回,程序可以继续向下执行。异步调用通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。

举例说明:

打个比方,比如我们去购物,如果你去商场实体店买一台空调,当你到了商场看中了一款空调,你就想售货员下单。售货员去仓库帮你调配物品。这天你热的实在不行了。就催着商家赶紧给你配送,于是你就等在商场里,候着他们,直到商家把你和空调一起送回家,一次愉快的购物就结束了。这就是同步调用。

不过,如果我们赶时髦,就坐再家里打开电脑,在网上订购了一台空调。当你完成网上支付的时候,对你来说购物过程已经结束了。虽然空调还没有送到家,但是你的任务都已经完成了。商家接到你的订单后,就会加紧安排送货,当然这一切已经跟你无关了,你已经支付完成,想什么就能去干什么了,出去溜达几圈都不成问题。等送货上门的时候,接到商家电话,回家一趟签收即可。这就是异步调用

七、IO多路转接

IO多路转接模型有三种,分别是select、poll、epoll。不过这是下一篇的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值