Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions src/os/serverprogramming.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
| 工作模式 | 条件触发 | 条件触发 | 条件触发或边缘触发 |

### 边缘触发与条件触发分别是什么?

Expand Down Expand Up @@ -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 操作与实际的业务逻辑解耦,使程序更易于管理和扩展。
Expand Down Expand Up @@ -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模式 |
| ------------ | ------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- |
Expand Down