【问题标题】:Blocking IO-Operation in Single core machine在单核机器中阻塞 IO 操作
【发布时间】:2019-10-18 23:14:21
【问题描述】:

我试图了解线程在等待来自远程服务器的 http 响应时会发生什么。

假设在某个时间点有 n 个进程正在运行。基于其线程调度算法的操作系统将尝试运行每个线程(比方说循环方式)。假设有一个线程发起了一个 http 请求并等待来自远程服务器的响应。这个线程会继续打开 cpu 核心吗?还是有一些interrupt 类型的机制会通知线程是否准备好运行?如果存在中断类机制,那么使用asynchronous programming 有什么好处?至少从 CPU 利用率的角度来看。

上面的东西是否依赖于语言?如果是,java vs nodejs vs python有什么区别......

【问题讨论】:

  • 操作系统不会调度等待事件(IO 或信号)的线程。那将是浪费时间,线程将立即重新进入睡眠状态。 CPU 对异步编程一无所知,对于一开始就试图避免线程的语言来说,这是一个高级概念。异步编程就像使用协作多任务或 yield 系统调用。只需使用语法糖来隐藏实现调度程序的技术细节。 CPU 响应中断以获取事件通知,事件是异步编程的低级块。
  • @MargaretBloom 所以从 CPU 的角度来看,使用异步编程并没有太大的好处吗?
  • 如果通过异步编程您指的是您发布的链接,那么答案是从 CPU 的角度来看,没有异步编程之类的东西。然而,这些异步库是在操作系统“异步”API(基于回调或事件)之上实现的,因此比阻塞线程并将其调度出来更有效。

标签: multithreading cpu cpu-usage core


【解决方案1】:

我试图了解线程在等待时会发生什么 来自远程服务器的 http 响应。

好吧,线程将等待底层 TCP 套接字接收数据。 HTTP 是一种使用阻塞/非阻塞 TCP 连接的高级协议。就其本身而言,线程不会等待“HTTP 响应”,而是等待套接字读取的一些可用数据。

这个线程会继续打开 cpu 内核吗?

如果线程等待 TCP 套接字可读,操作系统不会安排该线程运行,直到接收到一些数据。然后操作系统将安排线程在将来的某个时间点运行。阻塞的线程永远不会被安排运行 - 考虑到线程无事可做的事实,操作系统没有看到这样做的原因。

上面的东西依赖于语言吗?如果是的话是什么 java vs nodejs vs python之间的区别...

没有。每个操作系统都提供一个 C/C++ API 供应用程序使用。 Windows 提供 Win32,而 Linux 提供 POSIX。每种编程语言都会封装和绑定这些 API,并且每个“高级”调用(例如连接套接字)最终都会调用操作系统 API。

【讨论】:

  • 嗨,大卫,感谢您的回复,您能否分享一些有关上述信息的文档。再次感谢。
  • @hello123,您好,您可以谷歌“异步 IO”并开始研究。如果您接受这个答案,我会很高兴。按排名所在的V标志。
【解决方案2】:

我的理解是异步关键字用于您的程序继续执行而不是等待分叉进程完成,即使在单核处理器中也是如此,就像早期计算机的情况一样,我们能够进行多任务处理,因此可以推断出资源分配是由 cpu 完成的,同时试图尽可能明智,因此使用 async 允许您的执行线程执行而无需等待阻塞任务完成,否则,即使 cpu 将轮流执行线程,但由于您的程序是单线程,它会阻塞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2017-07-16
    • 2018-09-04
    • 2019-09-15
    相关资源
    最近更新 更多