登录
首页 >  Golang >  Go问答

当一个 goroutine 在 I/O 上阻塞时,调度程序如何识别它已经停止阻塞?

来源:Golang技术栈

时间:2023-04-30 17:59:05 233浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《当一个 goroutine 在 I/O 上阻塞时,调度程序如何识别它已经停止阻塞?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到golang等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

根据我在这里阅读的内容,golang 调度程序将自动确定 goroutine 是否在 I/O 上阻塞,并将自动切换到在未阻塞的线程上处理其他 goroutine。

我想知道的是调度程序如何确定该 goroutine 已停止阻塞 I/O。

它是否只是经常进行某种轮询以检查它是否仍然阻塞?是否有某种后台线程正在运行来检查所有 goroutine 的状态?


例如,如果您要在一个 goroutine 中执行一个 HTTP GET 请求,该请求需要 5 秒才能获得响应,它会在等待响应时阻塞,并且调度程序将切换到处理另一个 goroutine。现在考虑到,当服务器返回响应时,调度程序如何理解响应已经到达,是时候回到发出 GET 的 goroutine 以便它可以处理 GET 的结果了?

正确答案

所有的 I/O 都必须通过系统调用完成,而在 Go 中实现系统调用的方式,总是通过运行时控制的代码来调用它们。这意味着当您调用系统调用时,而不是直接调用它(从而将线程的控制权交给内核),运行时会收到您想要进行的系统调用的通知,并代表 goroutine 执行此操作。例如,这允许它执行非阻塞系统调用而不是阻塞系统调用(本质上是告诉内核,“请执行此操作,但不要在完成之前阻塞,而是立即返回,并在结果后通知我准备好了”)。这允许它在此期间继续做其他工作。

本篇关于《当一个 goroutine 在 I/O 上阻塞时,调度程序如何识别它已经停止阻塞?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>