gpt4 book ai didi

多核机器上的 OpenSSL

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:14 34 4
gpt4 key购买 nike

我正在迈入 OpenSSL 库的第一步,感觉有点迷茫。我的机器是多线程(至强系列,如果有人需要信息可以分享更多)与 Linux 操作系统。

应用程序构建是 SSL 代理,因此我需要尽可能快地处理多个 TCP 流,这意味着我希望尽可能无锁地运行库。

crypto/crypto.h 里面看了一点之后,主要是在这个部分:

# ifndef OPENSSL_NO_LOCKING
# ifndef CRYPTO_w_lock
# define CRYPTO_w_lock(type) \
CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
# define CRYPTO_w_unlock(type) \
CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
# define CRYPTO_r_lock(type) \
CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__)
# define CRYPTO_r_unlock(type) \
CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__)
# define CRYPTO_add(addr,amount,type) \
CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__)
# endif

我试图深入研究代码/API,但有点迷路了。我的问题是:

  • OpenSSL 库对多核/线程应用有哪些支持?
  • 库的哪些部分只能有一个实例(单例)?

最佳答案

What support does OpenSSL lib have for multi-core/thread applications?

支持多线程应用程序,但请注意,它并非“正常工作”——特别是,您必须 install some special callbacks这样 OpenSSL 将进行必要的序列化/锁定,否则您的程序将遇到竞争条件而无法正常工作。 (即使安装了回调,您仍希望将对任何特定 OpenSSL 套接字/连接的访问​​限制在单个线程内,即不要让两个线程在没有同步的情况下同时对同一连接的 OpenSSL 句柄执行操作)

What parts of the lib can have only one instance (singleton)?

好吧,锁定回调将(必然)只有一个实例,因为所有线程都使用它们来序列化临界区。

此外,SSL 库设置函数(SSL_load_error_strings()、SSL_library_init() 等)应该只在您的应用程序执行开始时调用(即在您生成任何线程之前),以及 SSL 库拆卸函数(如果有的话)应该只在任何生成的线程被加入()并丢弃之后被调用;这样您就可以避免任何可能的竞争条件,即线程尝试使用尚未完全构建或者已经部分或完全销毁的 OpenSSL 资源。

I want to run the lib as lock-less as possible.

好吧,您可能不太走运——OpenSSL 并不是为无锁运行而设计的;它的 session 使用共享的非只读数据结构,并且必须同步对这些数据结构的访问,否则将发生错误。我认为您能做的最好的事情就是将锁定回调用作 recommended并相信 OpenSSL 实现者持有锁的时间不会超过绝对必要的时间。如果这还不够,那么您可能不得不开始寻找不同的 SSL 库实现,或者考虑使用多进程而不是多线程。

关于多核机器上的 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388193/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com