首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多芯机上的OpenSSL

多芯机上的OpenSSL
EN

Stack Overflow用户
提问于 2016-12-29 20:44:46
回答 1查看 2.5K关注 0票数 5

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

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

主要在本节中查看了crypto/crypto.h内部的一些内容之后:

代码语言:javascript
复制
# 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库对多核/线程应用程序有什么支持?
  • 库的哪些部分只能有一个实例(单例)?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-30 04:07:58

OpenSSL库对多核/线程应用程序有什么支持?

多线程应用程序是受支持的,但请注意,它并不“只是工作”--特别是,您必须使用安装一些特殊的回调,这样OpenSSL才能进行必要的序列化/锁定,否则您的程序将受到竞争条件的影响,不能正常工作。(即使安装了回调,您也希望将对任何特定OpenSSL套接字/连接的访问仅限于单个线程,即在没有同步的情况下,在同一连接的OpenSSL句柄上不同时执行两个线程的操作)

库的哪些部分只能有一个实例(单例)?

那么,锁定回调(必要的话)只有一个实例,因为所有线程都使用它们来序列化关键部分。

此外,SSL库设置函数(SSL_load_error_strings()、SSL_library_init()等)只应在应用程序执行开始时(即在生成任何线程之前)调用,并且只有在任何派生线程被联接()d和丢弃之后才调用SSL库解锁函数(如果有的话);这样,您将避免出现任何可能的争用条件,即线程试图使用尚未完全构建或已经部分或完全销毁的OpenSSL资源。

我想尽可能地以无锁的方式运行库。

好吧,你可能运气不好-- OpenSSL不是为无锁运行而设计的;它的会话使用共享的、非只读的数据结构,对这些数据结构的访问必须是同步的,否则会出现错误。我认为最好的方法是使用锁回调作为推荐,并信任OpenSSL实现者保持锁的时间不会超过严格要求。如果这还不够,那么您可能不得不开始寻找不同的SSL库实现,或者考虑采用多线程而不是多线程。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41388193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档