GoLang之说说IO多路复用[第二话]

GoLang之说说IO多路复用[第二话]

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

操作系统会为每个TCP socket,
分配一个读缓冲区和一个写缓冲区。
对方返回的数据会先存入读缓冲区,
要发送的数据也要先拷贝到写缓冲区。
缓冲区在内核空间,
应用程序不能直接操作,
只能通过系统调用来进行。

现在的问题是,
用户程序想要读数据的时候,
读缓冲区里未必有数据!
想发送数据的时候,
写缓冲区里未必有空间!
那怎么办?

第一种办法:
乖乖的让出CPU,
进到等待队列里,
等socket可读或可写了,
再获得时间片就可以继续执行了,
这就是“阻塞式IO”。

第二种办法:
被称为“非阻塞式IO”,
就是不让出CPU,
但需要频繁的检查
socket是否可操作了。
这是一种“忙等待”的方式,
效率比较低。

第三种办法:
就是我们今天的主角,
“IO多路复用”了。
通过IO多路复用,
一个线程可以通过一次系统调用
同时监听多个socket,
不需要持续轮询而空耗CPU,
并发处理能力也因此大幅提升!

美中不足的是,
IO多路复用的事件循环
会和具体业务逻辑耦合,
把原本连续的业务逻辑,
打散为一个一个的事件处理,
就像一个“状态机”。
这并不更符合常规开发习惯,
不过,
若是与“协程”合作起来,
那就不一样了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GoGo在努力

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

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

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

打赏作者

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

抵扣说明:

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

余额充值