著录项信息
专利名称 | 一种实时快速的线程间数据交换方法 |
申请号 | CN201110051971.5 | 申请日期 | 2011-03-04 |
法律状态 | 暂无 | 申报国家 | 中国 |
公开/公告日 | 2011-07-20 | 公开/公告号 | CN102129396A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F9/54 | IPC分类号 | G;0;6;F;9;/;5;4;;;G;0;6;F;1;2;/;0;8查看分类表>
|
申请人 | 中国科学院软件研究所 | 申请人地址 | 北京市海淀区东北旺路2号联创大厦2层209
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 安捷中科(北京)数据科技有限公司 | 当前权利人 | 安捷中科(北京)数据科技有限公司 |
发明人 | 王永炎;骆小芳;罗雄飞;刘洋;王宏安 |
代理机构 | 北京君尚知识产权代理事务所(普通合伙) | 代理人 | 俞达成 |
摘要
本发明公开了一种线程间数据交换方法,涉及信息技术领域,该方法包括以下步骤:1)数据提供线程和数据消费线程共享的内存中设置一个缓存数据结构,所述缓存数据结内部包括多个数据缓存块;2)数据提供线程通过调用数据放入接口,将数据放入数据缓存块中;3)数据消费线程通过调用数据获取接口读取数据缓存块中的数据,实现快速的数据交换。该方法既保证了线程间数据交换的实时性,同时又能够保证线程间进行海量数据交换时的吞吐量,可以支持进程内线程之间进行大量数据的交换。在进行零星数据交换时,数据能够在非常短的时间内完成交换。
1.一种实时快速的线程间数据交换方法,包括以下步骤:
1)数据提供线程和数据消费线程共享的内存中设置一个缓存数据结构,所述缓存数据结构内部包括多个数据缓存块;所述数据交换方法的线程间数据交换组件包括三个部分:
缓存数据结构,数据放入接口,数据获取接口;所述数据提供线程通过调用所述数据放入接口,将数据放入缓存中,所述数据消费线程通过调用所述数据获取接口读取缓存中的数据;
所述数据交换方法定义三个变量:数据可放事件、数据可取事件和操作临界区;所述数据可放事件描述线程间数据交换组件中是否有未满的缓存块,用于放入数据;所述数据可取事件描述线程间数据交换组件中是否存在有数据的缓存块,用于获取数据;所述操作临界区用于数据提供线程和数据消费线程对n个缓存块进行访问操作时实现同步;
2)所述数据提供线程通过调用数据放入接口,将数据放入缓存数据结构的数据缓存块中;所述缓存数据结构包括n+1个缓存块,其中n个缓存块用于循环放入数据;设置第n+1个缓存块设为置换块,用于获取数据时与存有数据的缓存块进行置换;当所述数据提供线程调用数据放入接口时,进入操作临界区,检查当前缓存块是否还有足够的空间放入数据,如果空间足够,则将数据放入当前缓存块并离开操作临界区;如果当前缓存块没有足够的空间放入数据,触发数据可取事件,如果下一个缓存块为空,则将当前缓存块移动到下一个缓存块,将数据放入当前缓存块;如果下一个缓存块不为空,等待数据可放事件,重新进入操作临界区,并将数据放入缓存块中;
3)数据消费线程通过调用数据获取接口读取数据缓存块中的数据,实现快速的数据置换;
所述置换方法为将n个缓存块中最早有数据的缓存块设为缓存块k,与置换块的内容进行置换,置换块内变成最早的有数据的缓存块内容,而缓存块k变成内容为空的置换块。
2.如权利要求1所述的实时快速的线程间数据交换方法,其特征在于:等待数据可放事件的时间为可设置的参数,如果等待超时,则数据放入失败。
3.如权利要求1所述的实时快速的线程间数据交换方法,其特征在于:当数据消费线程调用数据获取接口时,首先等待数据可取事件,进入操作临界区,如果判断存在有数据的缓存块,则将置换块中的数据清空,并与置换块之外有数据的缓存块进行置换,最后触发数据可放事件,离开操作临界区,数据获取成功。
4.如权利要求1所述的实时快速的线程间数据交换方法,其特征在于:如果置换块之外不存在有数据的缓存块,则重置数据可取事件。
5.如权利要求1所述的实时快速的线程间数据交换方法,其特征在于:如果判断不存在有数据的缓存块,则重置数据可取事件,数据获取失败。
一种实时快速的线程间数据交换方法\n技术领域\n[0001] 本发明涉及信息处理技术领域,尤其涉及线程间数据交换的方法,可以应用于各种软件系统研发的软件开发技术领域。\n背景技术\n[0002] 在信息技术领域中,软件开发涉及很多的技术,包括内存数据组织管理、消息通信、索引技术、进程间数据交换、线程间数据交换等。本发明关注于软件开发中线程间的数据交换技术。在一些特定的软件系统研发过程中涉及到线程间的数据交换,而且对数据交换具有较高的实时性和高效性的要求,比如说:实时数据库管理系统、关系数据库管理系统、中间件等。\n[0003] 由于进程间的内存数据不能互相访问,因此,进程间数据交换比较复杂,通常的方法包括共享内存方式、动态数据交换(DDE)、数据管道、socket套接字等。相对于进程间数据交换,线程间的数据交换就比较简单了,可以通过直接访问内存数据的方式进行数据交换,其中需要特别关注内存数据组织管理和内存数据同步机制。如果对线程间数据交换没有性能要求,那么可以根据软件系统需要,通过变量或者内存块交换数据,再加上事件(Event)、临界区(Critical Section)、互斥量(Mutex)或者信号量(Semaphone)来实现同步机制,即可实现线程间的数据交换。然而,对于一些性能要求很高的软件系统来说,则需要精心地设计内存数据组织管理方式和内存数据同步机制,实现实时快速的线程间数据交换,满足软件系统在线程间数据交换的需求,从而提高软件系统的整体性能。\n[0004] 在研发软件系统过程中通常会遇到线程间进行数据交换的问题,如果需要交换的数据量少,用一些简单的变量、内存以及互斥量就可以实现,但是,一些性能要求较高的软件系统对线程间数据交换有实时性需求和吞吐量要求。在进行零星数据交换时,数据需要在非常短的时间内完成交换;在进行海量数据交换时,数据交换必须具有很高的吞吐量。在这些软件系统的研发过程中,通常需要开发人员耗费较长的时间来设计和实现线程间的数据交换,而且最终实现的效果并不一定能够满足软件系统对线程间数据交换的实时性需求和吞吐量要求。\n发明内容\n[0005] 本发明针对实时数据库管理系统、关系数据库管理系统、中间件的线程间数据交换的实时性需求和性能要求,设计并提出了一种实时快速的线程间数据交换方法。\n[0006] 本发明针对这类技术问题,提出了一种通用的、实时快速的线程间数据交换的技术解决方案,给出了线程间数据交换组件的具体实现细节,一方面,可以大大节约开发人员的时间,另外一方面,可以满足软件系统对线程间数据交换的实时性需求和吞吐量要求。\n[0007] 一种实时快速的线程间数据交换方法,包括以下步骤:\n[0008] 1)数据提供线程和数据消费线程共享的内存中设置一个缓存数据结构,所述缓存数据结内部包括多个数据缓存块;\n[0009] 2)数据提供线程通过调用数据放入接口,将数据放入数据缓存块中;\n[0010] 3)数据消费线程通过调用数据获取接口读取数据缓存块中的数据,实现快速的数据交换。\n[0011] 所述缓存数据结构中,包括n+1个缓存块,其中n个缓存块用于循环放入数据;第n+1个缓存块称作置换块,用于获取数据时与存有数据的缓存块进行置换。\n[0012] 采用数据可放事件描述缓存数据结构中是否有用于放入数据的未满缓存块;数据可取事件描述缓存数据结构中是否有存有数据的缓存块用于获取数据;操作临界区用于数据提供线程和数据消费线程对n个缓存块进行访问操作时实现同步。\n[0013] 当数据提供线程调用数据放入接口时,首先进入操作临界区,检查当前缓存块是否还有足够的空间放入数据,如果空间足够,则将数据放入当前缓存块,离开操作临界区,数据放入成功;\n[0014] 如果当前缓存块没有足够的空间放入数据,触发数据可取事件,判断下一个缓存块是否为空,如果下一个缓存块为空,则将当前缓存块移动到下一个缓存块,将数据放入当前缓存块。\n[0015] 如果下一个缓存块不为空,等待数据可放事件,重新进入操作临界区,并将数据放入缓存块中。\n[0016] 等待数据可放事件的时间为可设置的参数,如果等待超时,则数据放入失败。\n[0017] 当数据消费线程调用数据获取接口时,首先等待数据可取事件,进入操作临界区,如果判断不存在有数据的缓存块,则重置数据可取事件,离开操作临界区,数据获取失败。\n[0018] 如果判断存在有数据的缓存块,则将置换块中的数据清空,并与置换块之外有数据的缓存块进行置换。如果置换块之外不存在有数据的缓存块,则重置数据可取事件。\n[0019] 最后触发数据可放事件,离开操作临界区,数据获取成功。\n[0020] (三)有益效果\n[0021] 根据以上技术解决方案可以看出,本发明具有以下有益效果:\n[0022] 1、本发明提出了以批量方式获取数据的数据交换方法,当某个缓存块满了,或者等待数据可取事件超时之后,数据消费线程才会读取缓存块中的数据。而且,本发明在获取缓存块数据时,采用缓存块置换的方式,有效地减少了数据消费线程抢占操作临界区的时间,从而减少了数据提供线程的等待时间,提高了并发度,能有大大提高数据交换的性能。\n[0023] 2、本发明对零星数据交换的实时性也能够得到保证,数据消费线程在读取数据之前等待数据可取事件的超时时间为p毫秒,在最坏情况下,等待超时,此时数据交换的延迟为p毫秒。因此,在零星数据交换时,数据交换的最大延迟小于等于p毫秒。\n[0024] 3、本发明提供两个简洁的数据放入和数据获取接口,支持各种类型的软件系统,尤其能够满足具有实时性要求的高性能软件系统的需求。\n附图说明\n[0025] 图1为本发明数据交换组件结构示意图;\n[0026] 图2为本发明数据交换方法中数据放入操作流程图;\n[0027] 图3为本发明数据交换方法中数据获取操作流程图;\n[0028] 图4为数据交换组件初始化方法流程图。\n具体实施方式\n[0029] 下面结合附图和具体实施方式对本发明的方法进行详细描述。\n[0030] 如图1所示,实现本发明方法的线程间数据交换组件主要包括三个部分:1、缓存数据结构;2、数据放入接口;3、数据获取接口。数据提供线程通过调用数据放入接口,将数据放入缓存中,数据消费线程通过调用数据获取接口读取缓存中的数据,内部具有多个数据缓存块实现快速的数据交换。需要注意的是,线程间数据交换组件只支持单向的数据交换,如果要支持双向的数据交换,需实现两套线程间数据交换组件,分别支持两个不同方向的数据交换。\n[0031] 线程间数据交换组件的缓存数据结构中,预先分配n+1个大小为blocksize的缓存块,其中n和blocksize都是可配置的参数。这n+1个缓存块中有n个缓存块用于循环放入数据。当数据提供线程调用数据放入接口时,如果当前缓存块的剩余空间大于需要放入的数据大小,那么直接将数据放入当前缓存块即可,否则判断下一个缓存块是否是空块,如果是,则将当前缓存块移动到下一个缓存块,并将数据放入当前缓存块中,如果否,则需要等待数据消费线程获取数据,使得下一个缓存块为空块时,再将当前缓存块移动到下一个缓存块,并将数据放入当前缓存块中。而另外一个缓存块称作置换块,则用于获取数据时与存有数据的缓存块进行置换。数据消费线程调用获取数据接口时,置换块是空的,假设n个缓存块中最早的有数据的缓存块为缓存块k,那么缓存块k将与置换块的内容进行置换,置换块内变成最早的有数据的缓存块内容,而缓存块k变成置换块的内容,即为空。然后,数据消费线程就可以直接访问置换块获得其中的数据了。\n[0032] 由于数据提供线程和数据消费线程访问共享内存,需要提供高效的线程间通信和同步机制。为此,本发明方法定义了三个变量:数据可放事件、数据可取事件和操作临界区。\n数据可放事件描述线程间数据交换组件中是否有未满的缓存块,可以用于放入数据;数据可取事件描述线程间数据交换组件中是否有存有数据的缓存块,可以用于获取数据;操作临界区用于数据提供线程和数据消费线程对n个缓存块进行访问操作时实现同步。\n[0033] 线程间数据交换组件的初始化过程如下:首先,根据配置参数n,分配n+1个缓存块;然后,设置每个缓存块已有数据大小为0,即为空缓存块;第三,将最后一个缓存块设置为置换块;最后,创建数据可放事件和数据可取事件,初始化操作临界区。\n[0034] 当数据提供线程调用数据放入接口时,首先进入操作临界区,检查当前缓存块是否还有足够的空间放入数据,如果空间足够,则将数据放入当前缓存块,离开操作临界区并返回成功;否则,触发数据可取事件,判断下一个缓存块是否为空,如果下一个缓存块为空,则将当前缓存块移动到下一个缓存块,将数据放入当前缓存块,离开操作临界区并返回成功,否则,重置数据可放事件,离开操作临界区,等待数据可放事件,等待超时时间为可设置的参数,如果等待超时,则返回失败,否则重新进入操作临界区,并将数据放入缓存块中,并返回成功。\n[0035] 当数据消费线程调用数据获取接口时,首先等待数据可取事件,等待超时时间为可设置的参数,无论等待超时或者成功,都将进入操作临界区,判断是否存在有数据的缓存块,如果存在有数据的缓存块,则将置换块中的数据清空,并与最早的有数据的缓存块进行置换,如果除了置换块之外不存在有数据的缓存块,则重置数据可取事件,最后触发数据可放事件,离开操作临界区并将置换块的指针返回;如果不存在有数据的缓存块,则重置数据可取事件,并返回空指针。\n[0036] 1、线程间数据交换组件的实现方法如下:\n[0037] 缓存块结构体定义:\n[0038] \n[0039] \n[0040] 其中,wDataLen为该缓存块中已放入数据的长度,如果为0,则表示该缓存块为空缓存块,lpData为存放数据的内存区域,DATA_EXCHANGE_BLOCK_SIZE可根据软件系统需求定义的缓存块大小参数。注意:置换块的结构体与缓存块的结构体定义一致。\n[0041] 线程间数据交换组件定义如下:\n[0042] \n[0043] 其中,定义了四个公共方法。CDataExchangePipe和~CDataExchangePipe为构造函数和析构函数;PutData为数据放入接口方法,供数据提供线程调用;\nGetDataExchangeBlock为数据获取接口方法,供数据消费线程调用。\n[0044] 另外,还定义了八个私有成员变量。m_lDataBufferCount为缓存块个数(不包括置换块),即n;m_pBuffer为m_lDataBufferCount个缓存块和1个置换块所在的大内存指针;m_ppDataBuffers为缓存块指针数据,第m_lDataBufferCount+1个元素为置换块指针;m_hDataAvailableEvent是数据可取事件句柄;m_hBufferAvailableEvent是数据可放事件句柄;m_CriticalSection是操作临界区;m_lFirstIndex为最早缓存块;m_lCurrentIndex为当前缓存块。\n[0045] 参见图4,本发明线程间数据交换组件初始化方法实现如下:\n[0046] CDataExchangePipe的析构函数为初始化方法,具体定义如下:\n[0047] CDataExchangePipe(long lDataBufferCount=1000);\n[0048] 其中的参数lDataBufferCount为线程间数据交换组件中缓存块的个数。\n[0049] 初始化方法的具体实现代码如下:\n[0050] \n[0051] 其中,第1行设置缓存块的个数m_lDataBufferCount;第2行分配一个大内存块,大小为m_lDataBufferCount+1个缓存块的大小;第3行分配指针数组,可存放m_lDataBufferCount+1个块指针,前m_lDataBufferCount个指针为缓存块指针,最后一个指针为置换块指针;4~10行将初始化指针数组,指向大内存块的相应位置,并将缓存块和置换块的数据大小设置为0;第11、12行分别创建数据可取事件m_hDataAvailableEvent和数据可放事件m_hBufferAvailableEvent;第13、14行初始化m_lFirstIndex和m_lCurrentIndex为零,即最早缓存块和当前缓存块都设置为第一个缓存块(空块);第15行初始化操作临界区m_CriticalSection。\n[0052] 3、数据放入接口方法实现\n[0053] 数据放入接口方法具体定义如下:\n[0054] BOOL PutData(void*pData,WORD wDataLen,DWORD nTimeOut);\n[0055] 其中,pData为需要放入的数据存放的内存地址,wDataLen为需要放入的数据大小,nTimeOut为等待超时时间。该接口的返回值为布尔类型,返回值为TRUE,表示放入成功,否则表示放入失败。\n[0056] 数据放入接口方法具体实现代码如下:\n[0057] \n[0058] 该方法的具体实现中,首先将bRes和bTimeOut初始设置为FALSE,表明数据尚未放置成功且尚未等待超时;第5行进入操作临界区;第6行判断当前缓存块是否有足够的空间放置需要放入的数据,如果空间足够,则到第21行执行,将数据放入当前缓存块,否则,先触发数据可取事件,以通知数据消费线程能够获取数据;在当前缓存块空间不够的前提下,第9行判断下一个缓存块是否是最早缓存块,如果是,说明已经没有可用的空缓存块了,则在第11、12行分别重置数据可放事件、离开操作临界区,并在第13行等待数据可放事件,如果等待超时,则在第25行循环条件不成立,在第26行返回放入失败,如果等待成功,则从第5行开始继续执行;如果第9行发现下一个缓存块不是最早缓存块,说明下一个缓存块是空块,则在第18行将当前缓存块移动到下一个缓存块,并继续第21行执行,将数据放入当前缓存块;第21行将需要放入的数据拷贝到当前缓存块中;第22行将当前数据块的数据大小增加新放入数据的大小;第23行离开操作临界区;第24行将bRes赋值为TRUE,表明数据放入成功。参见图2,为数据放入操作流程。\n[0059] 4、数据获取接口方法实现\n[0060] 数据获取接口方法具体定义如下:\n[0061] DataExchangeBlock*GetDataExchangeBlock(DWORD nTimeOut);\n[0062] 其中,nTimeOut为等待超时时间。该接口的返回值为置换块指针,如果返回值为非空值,则可以访问该置换块中的数据,否则,表示获取数据失败。\n[0063] 数据获取接口方法具体实现代码如下:\n[0064] \n[0065] 该方法的具体实现中,第1行等待数据可取事件,不管等待是否成功,都在第2行进入操作临界区;第3行判断最早缓存块的数据大小是否为零,如果等于零,则在第5~7行中重置数据可取事件、离开操作临界区并返回空指针,否则,则进行数据获取操作;第10行将置换块的数据大小设置为零,即清空置换块中的数据;第11、12、13行将置换块和最早缓存块进行置换;第14行判断当前缓存块是否等于最早缓存块,如果相等,说明所有数据都已经取完,那么在第16~18行将当前缓存块和最早缓存块都恢复为初始状态,即第一个缓存块,并重置数据可取事件,如果不相等,则将最早置换块移动到下一个缓存块;第24行触发数据可放事件;第25行离开操作临界区;第26行返回置换块指针。参见图3,为数据放入操作流程。
法律信息
- 2013-07-10
- 2011-08-31
实质审查的生效
IPC(主分类): G06F 9/54
专利申请号: 201110051971.5
申请日: 2011.03.04
- 2011-07-20
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2009-07-08
|
2008-10-21
| | |
2
| |
2010-01-20
|
2009-08-18
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |