1. 介绍 高并发服务器 (1)要求大规模的连接/会话可能同时进行 (2)列子:Web 服务器, 邮件服务器 线程池架构 (1) 每个连接分配一个线程,将导致过多的线程。 (2) 线程消耗内存,比如堆栈等等。 (3) 操作系统创建和关闭线程,都将花费很多的时间在线程之间的切换 2. 线程模型 基于会话模型 (1) 每个线程服务于一个客户端,比如 HTTP 会话。 (2) 线程被用于状态跟踪和 CPU 调度。 (3) 活跃线程的数量等于并发客户端会话的数量 基于 I/O 模型 (1) 将状态跟踪从 CPU 调度中分离出来。 (2) 线程是所有同质,仅为 I/O 调用保持状态。 (3) 一个线程可以服务于不同的会话,在不同的时刻。 (4) 一个会话可以被服务,通过不同的线程,在不同的时刻。 (5) 因此,从一个线程不是专门对于一个会话,仅仅专门对于一个I/O 请求处理。 3. 基于 I/O 的线程调度 并发限制 (1) 线程是和CPU 绑定 最大活跃线程的个数 == CPU 个数 (2) 线程是和I/O 绑定 最大的工作线程个数 >= I/O 并行个数 (3) 根据实验/基准设置 线程池大小 (1) 线程是和CPU 绑定 等于并发限制数 (2) 线程是和I/O 绑定 最大的工作线程个数 >= I/O 并行个数 (3) 根据实验/基准设置 查询系统信息 typedef struct _SYSTEM_INFO { union { DWORD dwOemId; struct { WORD wProcessorArchitecture; WORD wReserved; }; }; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress; LPVOID lpMaximumApplicationAddress; DWORD_PTR dwActiveProcessorMask; DWORD dw NumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcessorRevision; } SYSTEM_INFO; 4. Win 32 完成端口 什么是IOCP 是一个Win32 机制,方便于带有控制并发的服务器的并发执行。 IOCP 做什么 (1) 一个Win32 内核对象。 (2) 有用于Windows NT 和 后面的执行。 (3) 帮助维持重复使用的内存池。 删除线程创建/终结负担 (4) 分配线程,控制并发 最小化的线程上下文切换 (5) 优化线程调度 提高 CPU 和内存缓冲的命中率 基本步骤 创建 IOCP 端口和关联设备 IOCP 内部结构 Note: (1) 等待线程采用 LIFO 调度,减少了线程上下文的切换。只要 I/O 请求完成的够慢,使一个线程能够处理他们,系统就始终唤醒同一个线程。 (2) 当...