异步双核处理器怎么样?性能真的有提升吗?

tmyb

今天跟大家唠唠我搞的“异步双核”这个事儿,纯粹是自己瞎琢磨,记录一下过程,希望能给有兴趣的朋友一点启发。

事情是这样的,之前手头有个小项目,数据处理量不大,但对实时性要求比较高。单核跑起来总感觉有点力不从心,数据处理经常卡顿。我就寻思着,能不能把手头的双核处理器给用起来,让它俩一起干活,提高一下效率。

我直接就上了多线程,想让两个核并行处理数据。结果发现,效率是提高了,但是线程同步、锁这些玩意儿太麻烦了,一不小心就死锁,整个程序就卡死了。而且线程切换也有开销,反而降低了效率。这路子,走不通!

异步双核处理器怎么样?性能真的有提升吗?

后来我就开始研究异步处理。这玩意儿的核心思想就是“你干你的,我干我的,互不干扰”。每个核心负责一部分任务,处理完就把结果扔到一个共享的地方,另一个核心再来取。这样一来,就避免了频繁的线程切换和锁竞争。

说干就干。我先把任务分解成两部分,一部分负责接收数据,另一部分负责处理数据。然后,我创建了两个进程,分别绑定到不同的核心上。进程间通过消息队列进行通信,接收数据的进程把数据扔到队列里,处理数据的进程从队列里取数据。

为了保证数据的一致性,我在消息队列里加了一个简单的序列号。每个数据包都带一个序列号,处理数据的进程按照序列号的顺序处理数据,避免了数据乱序的问题。

我用的是操作系统的消息队列,但是发现效率有点低,数据拷贝开销比较大。后来我改用共享内存来实现消息队列。这样一来,数据就不用拷贝了,直接在内存里传递,效率提高了不少。

代码写完,一跑,效果还真不错!两个核心都跑满了,数据处理速度提高了一倍多。而且程序也稳定多了,不容易死锁了。

不过这事儿还没完。我发现,虽然整体效率提高了,但是有时候处理数据的进程会阻塞,导致数据堆积在消息队列里。我就寻思着,能不能再优化一下。

异步双核处理器怎么样?性能真的有提升吗?

后来我给处理数据的进程加了一个缓冲区。每次从消息队列里取一批数据,放到缓冲区里,然后批量处理。这样一来,就减少了进程间通信的次数,提高了效率。

经过几轮优化,这个“异步双核”的方案算是基本搞定了。虽然还有一些细节需要完善,但是已经可以满足项目的需求了。

这回实践主要就是:

1. 分析了单核的瓶颈,决定用双核榨干性能。

2. 尝试了多线程,发现线程锁问题太多,放弃。

3. 研究了异步处理,决定用进程间消息队列通信。

异步双核处理器怎么样?性能真的有提升吗?

4. 优化了消息队列,从操作系统消息队列换成了共享内存。

5. 增加了缓冲区,减少了进程间通信次数。

这回实践让我对多核编程有了更深的理解。虽然过程有点曲折,但是最终还是达到了目的。以后有机会,我还想尝试一下更高级的多核编程技术。