ELIS成像测井地面采集系统多线程设计及实现

时间:2022-10-24 10:21:19

ELIS成像测井地面采集系统多线程设计及实现

摘 要:本文介绍了ELIS海洋石油成像测井地面采集系统多线程应用的设计及实现,分析多线程技术的优缺点,并对使用多线程技术后的ELIS地面采集系统和使用前做了性能分析对比,证明多线程技术应用对ELIS地面采集系统性能的提升。

关键词:测井系统 数据采集 多线程 同步

中图分类号:TE3 文献标识码:A 文章编号:1672-3791(2014)02(a)-0027-03

ELIS海洋石油成像测井系统(Enhanced Logging Imaging System)是中海油田股份有限公司自主研发具有自主知识产权的用于海上石油勘探开发的电缆测井成像系统,它主要由地面采集系统、井下仪器和数据解释处理三个部分组成。

ELIS地面采集系统基于前后台方式(客户端/服务器),通过网络进行数据交换。前端机系统做为服务器,完成实时数据采集和预处理,后台主机实现数据的处理和显示,用户接口,为操作工程师提供各种井下仪器的实时控制界面,完成服务表的编辑和加载,数据的处理和显示、存储、出图。由于后台主机要同事处理多个任务,且有很高的实时性要求,所以采用多线程设计开发模式,取得了良好的效果。

1 设计思想

ELIS地面采集系统最初采用的是单线程设计,其中网络接收、数据处理、数据显示、界面响应、命令发送等功能都在同一个线程内顺序执行,即执行玩、完一个功能,才能执行下一个功能,其示意如图1所示。

在挂接常规井下测井仪器时这种设计模式没有问题,但是在挂接采样率高、数据量大、计算复杂的高端测井仪器时由于网络接收、数据处理占用了大量CPU时间,出现了界面响应慢、仪器命令无法下发、显示刷新慢等问题,经过重新设计,把ELIS地面采集系统由单线程设计改进为多线程设计,其设计图如图2所示。

把原有的单线程设计改为多线程设计,即把网络接收、数据处理、数据显示、界面响应、命令发送、文件存储划分为独立的线程,并行执行。

线程本质上是一个独立运行的代码段,是CPU调度和分配的基本单元,多线程设计将应用程序划分为多个独立的任务,其优点:

(1)当前没有进行处理的任务时可以将处理器时间让给其它任务。

(2)占用大量处理时间的任务可以定期将处理器时间让给其它任务。

(3)多线程技术使程序的响应速度更快,因为用户界面可以在进行其它工作的同时一直处于活动状态。

(4)可以随时停止任务。

(5)可以分别设置各个任务的优先级以优化性能。

在ELIS地面采集系统软件中充分利用了多线程的优势:

(1)网络接收作为独立的线程,采用阻塞的Socket模型,即网络上来数据了接收,没有数据的时候等待,等待时把处理器时间让给其它任务,提高了效率。

(2)数据处理线程占用大量处理时间,在其中使用PeekMessage函数响应界面及其它线程的消息。

(3)单线程设计因为其它任务繁忙,界面响应缓慢,无法及时下发仪器控制命令,多线程技术使程序的响应速度更快,成功得解决了这个问题。

(4)提高网络接收线程的优先级,确保实时采集的数据包不丢失。

Message函数发送线程间消息,让网络接收、数据处理等线程停下来,完成内存分配及初始化后再发送线程间消息重启线程,达到线程间的调度和协调。

但是多线程也存在一些缺点,主要包括:

(1)线程的使用会给系统带来上下文切换的额外负担,负担超过一定程度时,多线程的效率就会降低。

(2)当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,即线程同步问题。

(3)即较长时间的等待或资源竞争以及死锁等多线程症状。

(4)程序复杂度增加,调试困难。

为了克服上述缺点,对ELIS地面采集系统软件进行了精心设计:

(1)线程不能过多,过多会给系统带来上下文切换的额外负担,降低系统效率,而且会调度协调困难,需要合理划分功能模块,界定模块边界,我们把系统设计为网络接收、数据处理、数据显示、界面响应、命令发送、文件存储六个线程,经实践证明这样划分科学高效。

(2)线程同步问题。

①使用临界区(CCriticalSection)和互斥量(CMutex)保护共享资源,当多个线程访问一个共享资源时,可以使用临界区或互斥量对该共享资源进行保护,保证同一时刻只有一个线程可以访问该共享资源,其他希望访问共享资源的线程将被挂起等待,直到拥有共享资源的线程放弃共享资源为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。

②事件(CEvent),事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象。例如数据处理线程处理完一包数据就会发送一个特定的事件通知数据显示和数据存储线程更新。

③互斥量(CMutex),互斥对象与临界区对象很像.互斥对象与临界区对象的不同在于:互斥对象可以在进程间使用,而临界区对象只能在同一进程的各线程间使用。当然,互斥对象也可以用于同一进程的各个线程间,但是在这种情况下,使用临界区会更节省系统资源,更有效率。

(3)由于多线程各线程之间是并行的任务抢占式工作方式,各线程的执行次序不可预期,导致有些错误只有在特定情况才会出现,不易重现,难以调试定位,我们采用在程序内部添加TRACE调试语句及外部线程观测器两种方式定位问题。

2 程序实现

程序用VC++6.0实现,VC++6.0的MFC类库提供了两种类型的线程:辅助线程(Worker

上一篇:电磁振动控制设计现状分析 下一篇:接线柱制件成型研究