当前位置: 首页 > 面试题库 >

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

吴安和
2023-03-14
问题内容

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

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

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

例如,如果要在需要5s的goroutine中执行HTTP
GET请求,则它会在等待响应时阻塞,调度程序将切换为处理另一个goroutine。既然如此,当服务器返回响应时,调度程序如何理解响应已经到达,现在该回到创建GET的goroutine以便处理GET结果的时候了?


问题答案:

所有I /
O必须通过syscall来完成,并且在Go中实现syscall的方式总是通过运行时控制的代码来调用。这意味着,当您调用syscall时,而不是直接调用它(从而放弃了对内核线程的控制),而是将您要进行的syscall通知运行时,并以goroutine的名义进行了调用。例如,这允许它执行非阻塞的系统调用,而不是阻塞的系统调用(本质上是告诉内核,“请执行此操作,而不是阻塞直到完成,立即返回,并在结果返回时让我知道准备好了”)。这使它可以在此期间继续进行其他工作。



 类似资料:
  • 问题内容: 非阻塞TCP / IP S和在NIO帮我处理与小数目的线程许多TCP / IP连接。但是UDP 呢?(我必须承认我对UDP不太熟悉。) 即使UDP发送操作未在阻止模式下运行,它似乎也不会阻止。确实存在因拥堵或类似原因导致阻塞的情况吗?我真的很好奇,是否存在这样的情况以及生产环境中可能存在的情况。 如果实际上并没有阻塞,并且我不打算使用已连接并仅绑定到一个端口,那么使用非阻塞模式和and

  • 现在我们知道如何在一个指定I/O调度器上来调度一个任务,我们可以修改storeBitmap()函数并再次检查StrictMode的不合规做法。为了这个例子,我们可以在新的blockingStoreBitmap()函数中重排代码。 private static void blockingStoreBitmap(Context context, Bitmap bitmap, String filena

  • 实时的web特性通常需要为每个用户一个大部分时间都处于空闲的长连接. 在传统的同步web服务器中,这意味着需要给每个用户分配一个专用的线程,这样的开销是十分巨大的. 为了减小对于并发连接需要的开销,Tornado使用了一种单线程事件循环的方式. 这意味着所有应用程序代码都应该是异步和非阻塞的,因为在同一时刻只有一个操作是有效的. 异步和非阻塞这两个属于联系十分紧密而且通常交换使用,但是它们并不完全

  • 阻塞I/O的操作会导致App必须等待结果返回(阻塞结束)才能进行下一步操作。在UI线程上执行一个阻塞操作会将UI强行卡住,直接造成很糟糕的用户体验。 我们激活StrictMode后,我们开始收到了关于我们的App错误操作磁盘I/O的不良信息。 D/StrictMode StrictMode policy violation; ~duration=998 ms: android.os.Strict

  • 我有一个spring-webflux API,它在服务层需要从使用JDBC的现有存储库中读取。 在对这个主题进行了一些阅读之后,我希望将阻塞数据库调用的执行与我的非阻塞异步代码的其余部分分开。 我定义了一个专用的jdbcScheduler: 2)假设我想利用得到的mono,例如调用带有userIdMono结果的API,它将在哪个调度器上执行?是专门为jdbc调用创建的调度器,还是reactor通常

  • 本文向大家介绍详解socket阻塞与非阻塞,同步与异步、I/O模型,包括了详解socket阻塞与非阻塞,同步与异步、I/O模型的使用技巧和注意事项,需要的朋友参考一下 socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在