IO 阻塞与非阻塞 同步与异步

网络IO模型

IO是个我们很熟悉的操作,在操作系统的角度来讲,IO一般就是对磁盘文件的访问。但是站在网络的角度上说:

网络IO的本质是对socket的读取。

网络IO一般分为两阶段:数据准备和数据读写。

数据准备:根据系统IO操作的就绪状态分为阻塞和非阻塞
数据读写:根据应用程序和内核的交换方式分为同步和异步
陈硕大神:在处理IO的时候,阻塞与非阻塞都是同步IO。只有使用了特殊API才是异步IO

阻塞和非阻塞

下面看一段代码,我根据代码来解释阻塞和非阻塞:

int main()
{
   
	...
	char buff[128] = 0;
	int size = recv(sockfd,buff,sizeof(buff),0);
	if (size op 0)
	{
   
		...
	}
}

sockfd处于阻塞模式的时候,执行这个函数的进程如果recv没接收到数据的话,就不一直阻塞(卡在这里),不执行后面的代码。

当socket处于非阻塞模式的手,执行这个函数的进程即便recv没有接收到数据(recv会返回),程序也会往下去执行其他代码。
我们可以根据recv的返回值size来判断阻塞模式

if size == -1 断开连接
if size == 0 || errno = EAGAIN 无数据,非阻塞

同步与异步

还是上面那个代码来看同步:
同步的一个例子就是:当TCP缓冲区有数据了,应用程序就会将缓冲区的数据拷贝到buff里面,然后处理数据。

由于recv函数不是异步函数,所以我接下来说的都是把它当做异步函数看的。
进程把sockfd,buff还有一个信号sigio交给操作系统,当缓冲区有数据,操作系统把数据拷贝到buff,然后发送信号通知进程,进程拿到的就是填充好的buff。

一个例子就是取饭,同步就是食堂告诉你你的饭做好了,你要去端过来;异步就是食堂再叫个外卖员把饭送到你手里。

参考文献

[1] 施磊.重写moduo库.图论科技.2020.7.
[2] 8714f2c3f1b0.网络IO模型.简书.2018.9.https://www.jianshu.com/p/a95bcb116765
全部评论

相关推荐

猪扒已出闸:方向不够聚焦,看不出来是想找什么方向的工作
点赞 评论 收藏
分享
华为北京什么时候签约,哪位老哥来个准信
投递华为北京研究所等公司10个岗位 >
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442870次浏览 4513人参与
# 春招别灰心,我们一人来一句鼓励 #
42047次浏览 534人参与
# 阿里云管培生offer #
120315次浏览 2220人参与
# 地方国企笔面经互助 #
7965次浏览 18人参与
# 同bg的你秋招战况如何? #
76925次浏览 565人参与
# 实习必须要去大厂吗? #
55786次浏览 961人参与
# 北方华创开奖 #
107447次浏览 600人参与
# 虾皮求职进展汇总 #
115819次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11632次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2454828次浏览 34858人参与
# 提前批简历挂麻了怎么办 #
149917次浏览 1978人参与
# 在找工作求抱抱 #
906050次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4760次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1195992次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157640次浏览 2267人参与
# 双非本科求职如何逆袭 #
662310次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12764次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35857次浏览 384人参与
# 简历中的项目经历要怎么写? #
86928次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20142次浏览 240人参与
# 我的上岸简历长这样 #
452040次浏览 8089人参与
牛客网
牛客企业服务