日常学习记录7:I/O模型总结

1.什么是I/O模型

I/O是指数据在设备和内存之间的输入输出,主要有网络I/O、磁盘I/O两种。

I/O模型我认为是进行I/O的方式,这里的I/O主要指网络I/O,本质是对socket的读取。

在进行I/O时,会先把数据拷贝到操作系统缓冲区中,然后再从操作系统缓冲区(内核空间、内核态)拷贝到应用程序的地址空间(用户空间、用户态)。

内核空间是内核代码运行的地方,
用户空间是用户程序代码运行的地方。

I/O模型有5种:
同步阻塞
同步非阻塞
I/O多路复用
信号驱动
异步

2.什么是同步、异步

由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。

用烧水的例子来理解:

我们都是通过热水壶来烧水的。在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开。

随着科技的发展,现在市面上的水壶都有了提醒功能,当我们把水壶插电之后,水壶水烧开之后会通过声音提醒我们水开了。

于烧水这件事儿来说,传统水壶的烧水就是同步的,高科技水壶的烧水就是异步的。

同步请求,A调用B,B的处理是同步的,在处理完之前他不会通知A,只有处理完之后才会明确的通知A。

异步请求,A调用B,B的处理是异步的,B在接到请求后先告诉A我已经接到请求了,然后异步去处理,处理完之后通过回调等方式再通知A。

所以说,同步和异步最大的区别就是被调用方的执行方式和返回时机。同步指的是被调用方做完事情之后再返回,异步指的是被调用方先返回,然后再做事情,做完之后再想办法通知调用方。

也就是同步异步是针对被调用方的。

具体一点,我认为体现在是手动读数据到用户缓冲区中(同步)还是内核控制复制到用户缓冲区中(异步)。
同步 = 主动询问:recvfrom轮询查看事件有没有就绪,也就是手动拷贝数据到用户空间。
异步 = 被动通知:回调函数通知事件就绪,此时数据已经在用户空间了。

3.什么是阻塞、非阻塞

我认为体现在进程挂起(阻塞)还是不挂起(非阻塞)

还是那个烧水的例子,当你把水放到水壶里面,按下开关后,你可以坐在水壶前面,别的事情什么都不做,一直等着水烧好。你还可以先去客厅看电视,等着水开就好了。

对于你来说,坐在水壶前面等就是阻塞的,去客厅看电视等着水开就是非阻塞的。

阻塞请求,A调用B,A一直等着B的返回,别的事情什么也不干。

非阻塞请求,A调用B,A不用一直等着B的返回,先去忙别的事情了。

所以说,阻塞和非阻塞最大的区别就是在被调用方返回结果之前的这段时间内,调用方是否一直等待。阻塞指的是调用方一直等待别的事情什么都不做。非阻塞指的是调用方先去忙别的事情。

也就是阻塞非阻塞是针对调用方的。

4.五种I/O模型

4.1 同步阻塞

用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据在内核缓冲区就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除阻塞状态。

4.2 同步非阻塞

在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU

4.3 多路复用I/O

一句话总结:“用单个线程同时处理多个I/O”

具体是指select、poll、epoll三个系统调用上,可以等待多个socket,同时对多个端口进行监听

I/O多路复用是阻塞在select,epoll这样的系统调用之上,等待有socket事件就绪,而没有阻塞在recvfrom之上。

以上三种都是同步模型,都是主动等待且主动查询状态。


4.4 信号驱动I/O

当有客户端连接时则给对应socket注册一个回调函数,然后线程继续执行后面的工作。当内核缓冲区就绪之后发送信号给用户线程,线程在回调函数中处理I/O,拷贝到用户空间。通常用在UDP中。

4.5 异步I/O

线程发起I/O请求后继续执行后面的工作,当数据已经准备好且拷贝到用户空间后内核再向进程发出通知,说明数据已经准备好可以被处理了。

在这里插入图片描述

参考文献:
浅谈5种IO模型的概念
聊聊Linux 五种IO模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值