From 83358524b587e8ed41ed7e8ad2e2cc6492d4839d Mon Sep 17 00:00:00 2001 From: typefloat Date: Fri, 1 Sep 2023 00:11:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9reactor=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E9=94=99=E8=AF=AF=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?reactor=E5=8E=9F=E7=90=86=E9=83=A8=E5=88=86=EF=BC=9A=E5=85=B6?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=9F=BA=E4=BA=8E=E4=BA=8B=E4=BB=B6=E5=92=8C?= =?UTF-8?q?**=E9=9D=9E=E9=98=BB=E5=A1=9EI/O**?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/os/serverprogramming.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/os/serverprogramming.md b/src/os/serverprogramming.md index fad9615..d101d44 100644 --- a/src/os/serverprogramming.md +++ b/src/os/serverprogramming.md @@ -45,12 +45,12 @@ epoll的主要优点如下: **总结**:`select`是最早的I/O多路复用技术,但受到文件描述符数量和效率方面的限制。`poll`克服了文件描述符数量的限制,但仍然存在一定的效率问题。`epoll`是一种高效的I/O多路复用技术,尤其适用于高并发场景,但它仅在Linux平台上可用。一般来说,epoll的效率是要比select和poll高的,但是对于活动连接较多的时候,由于回调函数触发的很频繁,其效率不一定比select和poll高。所以epoll在连接数量很多,但活动连接较小的情况性能体现的比较明显。 -| 系统调用 | select | poll | epoll | -| -------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 系统调用 | select | poll | epoll | +| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | 事件集合 | 用户通过三个参数分别传入感兴趣的可读可写以及异常等事件,内核通过对这些参数的在线修改来反馈其中就绪的事件。如果用户需要的话需要创建三个fdset以监听不同类型的事件。 | 统一处理所有的事件类型,因此只需要一个事件集参数。用户通过pollfd.events来传入感兴趣的事件,内核通过修改pollfd.revents反馈其中就绪的事件。 | 内核通过一个事件表直接管理用户感兴趣的所有事件。每次调用epoll_wait,内核直接在调用参数的events中注册就绪事件。 | -| 应用程序索引效率 | 采用轮询方式,O(n) | 采用轮询方式,O(n) | 采用回调方式,O(1) | -| 最大支持文件描述符数 | 一般1024 | 65535 | 65535 | -| 工作模式 | 条件触发 | 条件触发 | 条件触发或边缘触发 | +| 应用程序索引效率 | 采用轮询方式,O(n) | 采用轮询方式,O(n) | 采用回调方式,O(1) | +| 最大支持文件描述符数 | 一般1024 | 65535 | 65535 | +| 工作模式 | 条件触发 | 条件触发 | 条件触发或边缘触发 | ### 边缘触发与条件触发分别是什么? @@ -126,13 +126,13 @@ Client-server 通信是客户端与服务器之间进行数据交互的一种常 **总结**:同步和异步关注的是调用者与被调用者之间的关系,同步操作需要等待结果,而异步操作可以立即返回。阻塞和非阻塞关注的是I/O操作的行为,阻塞操作会导致调用者等待,而非阻塞操作可以立即返回。这两者之间可以组合形成不同的操作模式,例如同步阻塞、同步非阻塞、异步阻塞和异步非阻塞。 -### 讲一讲Rector模式与Proactor模式? +### 讲一讲Reactor模式与Proactor模式? Reactor 模式和 Proactor 模式都是处理并发 I/O 事件的设计模式。它们各自的核心思想是将 I/O 操作与实际处理逻辑解耦,以便在高并发环境下更有效地处理请求。下面分别介绍这两种模式: **Reactor 模式** -Reactor 模式基于事件驱动和异步 I/O 操作。其核心组件包括 Reactor、事件处理器和资源(如套接字)。Reactor 模式的工作原理如下: +Reactor 模式基于事件驱动和非阻塞 I/O 操作。其核心组件包括 Reactor、事件处理器和资源(如套接字)。Reactor 模式的工作原理如下: 1. Reactor 负责监视多个资源(如套接字)上的 I/O 事件。当某个资源上发生 I/O 事件时,Reactor 将事件通知对应的事件处理器。 2. 事件处理器负责处理这些 I/O 事件,如接受连接、读取数据、写入数据等。事件处理器将 I/O 操作与实际的业务逻辑解耦,使程序更易于管理和扩展。 @@ -243,11 +243,11 @@ LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚 **区别:** -| | 优点 | 缺点 | -| ---- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| NAT | 集群中的物理服务器可以使用任何支持TCP/IP操作系统它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址 | 扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢。 | -| TUN | 负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。 | 隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。 | -| DR | VS/DR跟 VS/TUN 方法相同,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。 | 要求负载均衡器的网卡必须与物理网卡在一个物理段上 | +| | 优点 | 缺点 | +| --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| NAT | 集群中的物理服务器可以使用任何支持TCP/IP操作系统它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址 | 扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢。 | +| TUN | 负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。 | 隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。 | +| DR | VS/DR跟 VS/TUN 方法相同,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。 | 要求负载均衡器的网卡必须与物理网卡在一个物理段上 | | | NAT模式 | IP TUN模式 | DR模式 | | ------------ | ------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- |