前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >openssl 1.1.x版本的async模式

openssl 1.1.x版本的async模式

原创
作者头像
mariolu
发布2018-12-24 10:51:50
3.6K0
发布2018-12-24 10:51:50
举报

一、什么是async job

Asyn job是openssl把cpu等aio操作和硬件加速卡不占用cpu的操作剥离出来,这部分的操作单独交给一个叫asyn job(也可以认为是协程)去做。在asyn job执行的过程中,cpu可以把当前任务暂停,切换上下文(栈,寄存器等,用__setjump, longjump实现)返回给用户层。用户层需要主动去poll这个async job的状态,是否是ASYNC_FINISHED状态。如果是finish状态,则继续后面的操作。

图1、一个async job的处理流(引用intel QAT驱动的图)
图1、一个async job的处理流(引用intel QAT驱动的图)

二、Async job原理是啥

  • Async job和用户程序是两个并线的操作,这两个操作是放在一个进程完成,所以是协程。
  • 用户态的执行主要是ASYNC_start_job,另一个asyn job(async job func)的执行线是async_start_func。
  • 通过async_fibre_makecontext完成在用户态和async job的来回切换。

三、应用场景:SSL硬件加速卡QAT

  • 当硬件加速卡操作执行的时候,通过async_fibre_makecontext进行用户切换到用户态操作,而后用户态需要主动poll,判断async job是否已经完成(ASYNC_JOB_STOP),这个状态是async job的执行完成终点。如果是硬件加速卡未执行完,用户态的poll不会返回任何待执行的操作。
  • 如果是硬件加速卡未执行完,需要放弃cpu控制权,它可以调用ASYNC_pause_job把控制权交还给用户态。比如说:硬件加速卡engine加密接口afalg_fin_cipher_aio这个有调用ASYNC_pause_job,当进行aio拷贝的时候,把加解密原始数据拷贝到内核层(硬件加速卡),然后通过ASYNC_pause_job(底层实现是通过async_fibre_makecontext)把控制权交还给用户态。
  • 用户态可以再次调用ASYNC_start_job(底层实现是通过async_fibre_makecontext)控制权重新回到之前ASYNC_pause_job后的代码流程(此时硬件加速卡加解密数据可能已经好了)。

编辑

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是async job
  • 二、Async job原理是啥
  • 三、应用场景:SSL硬件加速卡QAT
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档