精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
我们Windows平台上基于OpenSSL的服务器是IO完成端口的非阻塞IO构建的。一切都非常高效和快速,但双缓冲存在一个棘手的问题。
实质上,当OpenSSL调用BIO_write时,我们的应用程序缓冲要发送的数据,并在此缓冲区上启动IOCP写入请求并成功返回。如果有挂起的IOCP请求,我们调用BIO_set_retry_write并返回失败。
同样,当OpenSSL调用BIO_read时,我们会满足来自完成IOCP请求的缓冲区的请求。如果缓冲区中没有数据,我们将调用BIO_set_retry_read并返回失败。
按如下升级后可以更高效:
BIO_write可以立即调用BIO_set_retry_write并返回失败,同时还会对调用中收到的缓冲区上发起IOCP写入请求。当IOCP请求成功完成时,BIO_write重试调用就满足了。
BIO_read可以启动IOCP_read,并再次调用BIO_set_retry_read并返回失败。当IOCP请求成功完成时,BIO_read重试调用可以满足了。
然而,要实现这个功能,必须保证OpenSSL在重试BIO_read时使用相同的缓冲区,并且至少与最初请求的数据一样多。当然,这两个调用之间的缓冲区必须保持有效。另外,当重试BIO_write时,调用必须用于相同的缓冲区并且至少与原来写入的数据相同 - 并且在两次调用期间缓冲区必须保持不变。
这是我们能指望的吗?通过不必将数据复制到临时缓冲区,我们可以节省相当多的CPU时间和内存。
在此先感谢,