论文部分内容阅读
网络通信技术的快速发展促使网络带宽和流量不断增大,网络协议栈的处理能力容易成为系统总体性能的瓶颈。对于传统的内核网络协议栈,系统调用、内存拷贝和冗余的协议处理流程的开销可能成为制约协议栈处理能力的因素。把协议栈构建在用户空间是协议栈实现的另一种思路,可以很大程度上减少操作系统的额外开销和内存拷贝开销,且定制灵活。本文从以下两个方面研究了用户态协议栈构建的关键技术。首先,本文研究了用户态协议栈的消息通信机制。用户态协议栈受两种消息流驱动运行:网络数据包消息流和socket请求消息流,这形成了一个多生产者单消费者的模型,本文设计了特定的环形消息队列来支撑消息通信机制。但是在大流量数据环境下,多个生产者对于环形消息队列的加锁同步开销将会十分可观。针对这个问题,本文提出了改进的环形消息队列互斥算法,利用原子操作代替开销昂贵的互斥锁,在需要频繁对环形消息队列进行判空或判满操作的场合能取得较好的效果。在改进互斥算法的基础上,本文提出了一个消息通信机制的无锁化架构,通过轮询调度的思想来取代互斥锁的频繁使用,并通过实验验证了方案的可行性。接着,本文研究了用户态协议栈的并行处理技术。随着多核多处理器架构的普及,如果协议栈采用单线程串行处理流程,势必不能发挥处理器强大的计算能力。本文设计了用户态协议栈的并行处理架构,通过对数据包四元组哈希的方式把数据包分发到特定的协议栈线程中处理,从而实现了连接级别的协议栈并行。利用Linux内核提供的处理器“硬亲缘力”特性,设计了用户态协议栈的处理器负载均衡策略。最后通过实验证明了协议栈并行化处理后取得了较大的性能提升。