为了账号安全,请及时绑定邮箱和手机立即绑定

将数据从内核复制到用户期间,非阻塞 I/O 是否会进入休眠状态?

将数据从内核复制到用户期间,非阻塞 I/O 是否会进入休眠状态?

Go
素胚勾勒不出你 2023-08-21 14:40:37
我问这个问题是因为我正在研究 Go 中的多路 I/O,它使用epollwait.当套接字准备好时,goroutine 将被唤醒并开始以非阻塞模式读取套接字。如果read在将数据从内核复制到用户的过程中系统调用仍然会被阻塞,我假设 gorouine 附加的内核线程也将进入睡眠状态。我对此不太确定,如果我错了,希望有人能帮助纠正我。
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我无法完全解析你所写的内容。

我将尝试进行纯粹的猜测并想象您可能正在监督这样一个事实:置于非阻塞模式的write(2)套接字上的和read(2)系统调用(以及它们的同类,例如send(2)和)可以自由使用(分别返回)数据少于请求的数据。 换句话说,对非阻塞套接字的调用被告知要写入 1 MB 数据,将消耗与当前适合关联的内核缓冲区的数据一样多的数据,并立即返回,表明它只消耗了同样多的数据。下一次立即调用可能会返回。recv(2)
write(2)write(2)EWOULDBLOCK

调用也是如此read(2):如果您向其传递一个足以容纳 1 MB 数据的缓冲区,并告诉它读取该数量的字节,则该调用只会耗尽内核缓冲区的内容并立即返回,并指示有多少字节。它实际复制的数据。下一次立即调用read(2)可能会返回EWOULDBLOCK

因此,任何获取数据或将数据放入套接字的尝试几乎都会立即成功:要么在数据被铲入内核缓冲区和用户空间之间之后,要么立即返回代码EAGAIN

查看完整回答
反对 回复 2023-08-21
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信