单核机中的阻塞IO操作

Blocking IO-Operation in Single core machine

我想了解线程在等待来自远程服务器的 HTTP 响应时发生了什么。

假设在某个时间点有 n 个进程正在 运行ning。基于其线程调度算法的 OS 将尝试 运行 每个线程(假设采用循环方式)。假设 n 个线程中有一个发起了 http 请求并等待来自远程服务器的响应。此线程会继续开启 cpu 核心吗?或者有一些 interrupt sort of mechanism which will notify the thread if it is ready to run? If interrupt sort of mechanism is present, then what is the benefit of using asynchronous programming?至少从 CPU 利用率的角度来看。

上面的东西是语言依赖的吗?如果是,java vs nodejs vs python ...

有什么区别

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

I am trying to understand What happens to a thread when it is waiting for a http response from remote server.

嗯,线程会等待底层的TCP套接字接收数据。 HTTP 是使用 blocking/nonblocking TCP 连接的高级协议。就其本身而言,线程不会等待 "HTTP response" 而是等待套接字读取的一些可用数据。

Will this thread keep on getting its turn on cpu core?

如果线程等待 TCP 套接字可读,OS 不会将此线程安排到 运行,直到收到一些数据。那么 OS 将在未来的某个时间将线程安排到 运行。阻塞的线程永远不会安排到 运行 - OS 没有看到这样做的原因,考虑到线程无事可做。

Is the above thing dependent on language? if yes what is the difference between java vs nodejs vs python ...

没有。每个 OS 提供一个 C/C++ API 供应用程序使用。 Windows 提供 Win32,而 Linux 提供 POSIX。每种编程语言都包装并绑定了这些 API,每个 "high level" 调用(例如连接套接字)最终都会调用操作系统 API。