项目背景:
协程是一种轻量级的线程,可以在一个线程中创建多个协程,协程通过让出自身的控制权来实现协程之间的切换,当有事件就绪时,再恢复到之前的状态继续执行,协程之间的切换是在用户态之间进行的,性能开销更小。同时,协程的处理逻辑是比较偏向同步编程,做到了同步编程方式下实现异步的性能。
项目描述:
使用协程处理客户端的连接请求和io操作,通过接收的命令进行用户态协议解析,并发处理对服务端的kv存储引擎的增删改查,实现了同步编程模式下拥有异步编程的效率。
项目架构主要由网络层、协议层和核心层组成,网络层使用协程进行客户端的请求和io操作,协议层使用dpdk来实现在用户态空间进行协议解析。核心层是进行数据存储的引擎,使用红黑树进行存储。
项目流程:
1.单线层多协程:将每一个网络连接创建一个协程,单列模式下由一个调度器对协程进行切换,底层逻辑由epoll实现。
2.协程的创建:将每一个端口的连接创建一个协程,入口函数处理socket连接,此后io操作(recv、send)等进行异步处理。
3. Hook重定向:每个协程在进行io操作之前,通过hook重定向到自定义的io函数,函数内部将协程io的socketfd加入到调度器底层实现的epoll中,让出CPU(yield),处理其它准备就绪的协程io,待调度器resume给当前协程再执行io操作,实现异步效率。
4. 原语操作:
yield:协程让出CPU给调度器并保存协程的上下文,以便resume之后能够进行io操作。
resume:调度器恢复执行某个准备就绪的协程。
5. 应用层:程序对接收的数据进行协议解析,用红黑树实现kv存储引擎的增删改查,将获得的数据回发给客户端。
参考连接