异步I/O、完成端口与Windows对象安全
1. 可扩展服务器的实现方式
在创建可扩展服务器时,有不同的实现思路。一种是将完成操作分配给最近执行的线程,因为该线程的内存很可能仍在缓存中,或者至少不需要进行页面调入操作。另一种方式是使用有限数量的工作线程从队列中获取工作项数据包,这些工作项可以由一个或多个主线程放入队列。
2. 使用I/O完成端口的服务器示例
有一个使用I/O完成端口的服务器示例,它对原有的程序进行了修改。该服务器创建了一个小的服务器线程池和一个较大的重叠管道句柄池,并且为每个句柄配备一个完成键。重叠句柄被添加到完成端口并发出相应调用,服务器线程会等待与客户端连接和读取操作相关的完成事件。当检测到读取操作完成后,会处理相关的客户端请求并将结果返回给客户端。
这个服务器的设计避免了服务器线程在I/O操作或请求处理过程中被阻塞。每个客户端管道会经历一系列状态,不同的服务器线程可能会在状态周期的不同阶段处理该管道。这些状态包括:
- 连接状态 :管道与服务器线程建立连接。
- 读取请求并启动计算线程状态 :服务器线程从客户端读取请求,并启动一个单独的“计算”线程进行处理。计算线程完成处理后会调用 PostQueuedCompletionStatus
,而服务器线程不会被阻塞,因为进程管理由计算线程负责。
- 读取并写入第一条记录状态 :服务器线程读取包含响应第一条记录的临时文件记录,并将该记录写入客户端。
- 发送额外响应记录状态