这是关于计算机机制的一个非常基本的问题。对于每秒处理数百万个请求的应用程序,主机在代码执行阶段处理多个请求的一些常见方式是什么?
例如,假设两个用户单击按钮在网站上预订产品。假设网站需要 20 秒才能将产品预订到数据库中。用户 A 的请求首先到达服务器。但用户 B 不必等到 A 的请求完成,对吗?这是为什么?是什么使得多个请求能够同时处理?服务器是否先处理每个请求的一小部分,然后切换到另一个请求并处理其中的一小部分,等等?服务器是否为每个请求启动一个连续运行的新进程?
我意识到这个问题可能有不同的答案,但是有哪些常见的答案呢?
答案1
基本理论称为多任务处理。这是一个相当复杂的主题。你可以阅读更多内容这里。
答案2
以下是简要概述。我肯定我会犯一些错误,有人会指出来。
Apache 和 Nginx 等服务器是多线程应用程序,通常会在启动时启动多个线程,通常称为 Workers。每个线程都能够处理多个连接,通常在配置文件中指定。
虽然工作进程是线程化的,但主 http 进程通常是单线程的,并管理它生成的线程。它这样做是因为有些操作线程安全而其他的则不是。例如,写入日志文件通常不是线程安全的。请参阅此有关线程的详细信息。
基本示例
如果我们以 HTTP 为例;
三个人对相同或不同的页面发出请求。一个工作人员回答该请求,该请求进入 HTTP 进程监听端口(通常是端口 80)。HTTP 服务器处理该请求并将响应发送到不同的端口,通常是高端口,例如 54501 或 34667。来自 HTTP 服务器的回复和有效负载不会在端口 80 上返回。
HTTP 服务器中通常会配置一个 KeepAlive 值,如果没有进一步的通信,该值会使该连接保持活动状态,直到超时。如果收到进一步的通信,则工作器已准备就绪并准备就绪。如果没有进一步的通信,则工作器将关闭连接,并且它要么终止,要么处于空闲状态以侦听新连接,具体取决于它的配置方式。
阿帕奇例如,可能有以下内容;
<IfModule prefork.c>
StartServers 4
MinSpareServers 4
MaxSpareServers 8
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 10000
</IfModule>
这基本上告诉 Apache 在启动时启动 4 台服务器,保留 4 台以备不时之需,最多启动 256 台服务器,每台服务器最多可服务 256 个连接。
Nginx另一方面,用户“worker_connections“
您还可以将工作人员分配给特定的 CPU 核心并指定其他微调,例如优先级等。
操作系统处理线程的方式各不相同,例如,Linux 与 Windows 的处理方式不同。
许多服务器都是基于 Linux 或 Unix 的,因为它们运行时没有 GUI 界面,因此将所有资源都用于其设计用途。GUI 会消耗大量资源!
这是一个非常简短的解释,希望对您有所帮助。我肯定有些地方错了,但它能给你一点想法。