首页 / 专利库 / 银行与财务事项 / 证券 / 一种适用于证券交易系统的订单内存分配方法

一种适用于证券交易系统的订单内存分配方法

阅读:683发布:2020-05-11

专利汇可以提供一种适用于证券交易系统的订单内存分配方法专利检索,专利查询,专利分析的服务。并且本 发明 涉及计算机 数据处理 技术领域,具体来说是一种适用于 证券 交易系统的订单内存分配方法,方法具体如下:S1:内存的分配将按单只股票隔离,分别进行,每只股票同一价格档位的订单将依次从一系列的微型内存池中分配;S2:当一个微型内存池被分配满之后,系统将从每只股票各自拥有的一个订单 块 内存池中分配一个新的内存池,用于后续的新订单分配;S3:系统启动时需要预先给单个订单块内存池分配的内存池;本发明使得撮合成交时,对订单的 访问 基本落在CPU的一级缓存内,比 现有技术 快100倍,只有在每273笔订单撮合完成时,访问才会有一次落在三级缓存内,即使在三级缓存内,访问的时延也比已有方案快十倍。,下面是一种适用于证券交易系统的订单内存分配方法专利的具体信息内容。

1.一种适用于证券交易系统的订单内存分配方法,其特征在于所述方法具体如下:
S1:内存的分配将按单只股票隔离,分别进行,每只股票同一价格档位的订单将依次从一系列的微型内存池中分配;
S2:当一个微型内存池被分配满之后,系统将从每只股票各自拥有的一个订单内存池中分配一个新的内存池,用于后续的新订单分配;
S3:系统启动时需要预先给单个订单块内存池分配的内存池;
S4:除了启动时的预分配外,系统将在运行时根据订单的增长情况,动态的分配新的内存池加入到订单块内存池中进行管理。
2.如权利要求1所述的一种适用于证券交易系统的订单内存分配方法,其特征在于微型内存池大小为CPU一级缓存的大小。
3.如权利要求1所述的一种适用于证券交易系统的订单内存分配方法,其特征在于单个订单块内存池的内存大小完全落在CPU三级缓存范围内。
4.如权利要求1所述的一种适用于证券交易系统的订单内存分配方法,其特征在于每个股票拥有一个订单块内存池,管理的单位是局部订单内存池,局部订单内存池的每个空闲订单槽,用于分配给一个个订单。
5.如权利要求4所述的一种适用于证券交易系统的订单内存分配方法,其特征在于所述方法具体如下:给新订单分配一块内存是先尝试从已经被链在对应价格档位上的局部订单内存池中空闲的订单槽中分配,当这个档位上没有含空闲订单槽的局部订单内存池,就会从这个股票的订单块内存池中拿空闲的内存池出来链入这个价格档位内存池列表中,并从这个新的内存池上面取空闲订单槽分配给新订单。

说明书全文

一种适用于证券交易系统的订单内存分配方法

技术领域

[0001] 本发明涉及计算机数据处理技术领域,具体来说是一种适用于证券交易系统的订单内存分配方法。

背景技术

[0002] 证券交易系统在交易的过程中,我们需要在内存中维护一个订单容器,里面存放着所有还未成交的订单,这个容器记作“订单簿(OrderBook)”。
[0003] 在一个“订单簿”中,所有价格相等并且买卖方向相同的订单被视作同一档订单,属于同一档位的订单我们需要用链表串联起来,并用一个数据结构(记作priceLeader)保存这个链表的信息、以及保存这个价格档位上所有订单的汇总信息(价格,总下单股数,剩余未成交股数,已成交股数),如图1所示。一个订单簿包含买卖方向相反的两个priceLeader的集合,记作leaderBookBuy和leaderBookSell,订单簿的结构如图2所示。
[0004] 由于股票的交易规则中有最小价格变动单位的限制(记作tickSize),在单个股票的最高价(记作highLimit)和最低价(记作lowLimit)构成的涨跌幅范围内,价格档位数量(记作levelCount)可通过下面的公式计算出来:levelCount=int((highLimit-lowLimit)/tickSize)+1。
[0005] 在交易的过程中,每收到一笔新订单(记作newOrder),系统会尝试与交易方向相反的最优价格档位上的订单进行撮合成交,如果交易方向相反的最优价格档位不满足newOrder所设定的价格或newOrder只有部分数量被撮合时,则系统会为newOrder分配一内存,结构为技术订单(记作TechOrder),TechOrder内会复制newOrder的订单业务信息,并且记录TechOrder在订单簿中的索引信息,然后将TechOrder插入到它自己所属的priceLeader记录的未成交订单链表中去,等待将来被其它新订单撮合。
[0006] 内存的大小我们使用字节为单位,一个字节用大写字母“B”表示,1024个字节我们用“KB”表示,1024个“KB”我们用“MB”表示,1024个“MB”我们用“GB”表示。在计算中度量时间时,最小单位可以精确到0.1纳秒。我们使用“ns”表示纳秒,使用“us”表示微妙,使用“ms”表示毫秒,使用“s”表示秒。
[0007] 现在在内存中分配TechOrder的方法是从整个主机的一个共享内存池中进行分配的。一个主机的交易进程会负责几百只股票的撮合操作,这些股票的所有TechOrder会共享一个内存池。
[0008] 每只股票的订单到达主机的顺序是随机的,每次从共享内存分配TechOrder的内存地址也是随机的。同一只股票的所有订单基本上不会被分配在共享内存中的连续内存地址上,地址的跨度(MemSpan)可以通过每笔订单大小(orderSize)和当天的订单总数(orderCount)来计算:MemSpan=orderSize*orderCount。
[0009] 根据一个订单大小为120字节来计算,一个交易主机上每天处理的订单量是2000万,计算出的内存地址跨度为2.23GB。在撮合成交时,每只股票的订单是按订单进入订单簿的价格顺序、时间顺序被撮合的;即相同价格档位的订单,先进入订单簿的先被撮合。
[0010] 以主机配置Intel Core i7 CPU为例,当一笔新订单依次与对手方档位上多笔订单撮合时,按现有TechOrder随机分布在不同物理地址上的情况,CPU在依次读取每次被撮合的订单时,跨越的内存范围会超过CPU一级缓存的大小(32KB),二级缓存的大小(512KB),甚至三级缓存的大小(4-32MB),导致CPU去主存上读取被撮合订单。
[0011] 而CPU的一、二、三级缓存、及主存对应的访问延迟分别为:0.9ns、2.8ns、12.9ns、120ns。
[0012] 可以看到,现有的TechOrder内存分配方法,每次访问下一个被撮合订单时,CPU需要耗费120ns在等待上,增加了交易系统的整体延时,降低了交易系统的吞吐量。

发明内容

[0013] 本发明的目的在于解决现有技术的不足,提供一种适用于证券交易系统的订单内存分配方法,将同一个档位的TechOrder分配在连续的内存地址上,处于CPU的缓存跨度范围内,使得访问每笔被撮合订单的时间缩短为0.9ns到12.9ns之间。
[0014] 为了实现上述目的,设计一种适用于证券交易系统的订单内存分配方法,其特征在于所述方法具体如下:
[0015] S1:内存的分配将按单只股票隔离,分别进行,每只股票同一价格档位的订单将依次从一系列的微型内存池中分配;
[0016] S2:当一个微型内存池被分配满之后,系统将从每只股票各自拥有的一个订单块内存池中分配一个新的内存池,用于后续的新订单分配;
[0017] S3:系统启动时需要预先给单个订单块内存池分配的内存池;
[0018] S4:除了启动时的预分配外,系统将在运行时根据订单的增长情况,动态的分配新的内存池加入到订单块内存池中进行管理。
[0019] 微型内存池大小为CPU一级缓存的大小。
[0020] 单个订单块内存池的内存大小完全落在CPU三级缓存范围内。
[0021] 每个股票拥有一个订单块内存池,管理的单位是局部订单内存池,局部订单内存池的每个空闲订单槽,用于分配给一个个订单。
[0022] 所述方法具体如下:给新订单分配一块内存是先尝试从已经被链在对应价格档位上的局部订单内存池中空闲的订单槽中分配,当这个档位上没有含空闲订单槽的局部订单内存池,就会从这个股票的订单块内存池中拿空闲的内存池出来链入这个价格档位内存池列表中,并从这个新的内存池上面取空闲订单槽分配给新订单。
[0023] 本发明同现有技术相比,其优点在于:
[0024] 1.本发明使得撮合成交时,对订单的访问基本落在CPU的一级缓存内,比现有技术快100倍,只有在每273笔订单撮合完成时,访问才会有一次落在三级缓存内,即使在三级缓存内,访问的时延也比已有方案快十倍。
[0025] 2.撮合效率得到了极大的提升,使得系统拥有了更大的订单处理吞吐量和更低的时延。
[0026] 3.实现了按订单分布自然规律进行特别优化的分级内存池,即有大的订单内存池,同时又做到遵循mechanical sympathy设计思想,尽可能做到每个档位上的订单和CPU缓存亲和。而且支持动态扩展订单的内存池,和老的系统在启动系统前配置固定大小订单内存池相比,可以动态支持更多订单,应对突发的证券报单量。附图说明
[0027] 图1是本发明程序流程示意图1;
[0028] 图2是本发明程序流程示意图2

具体实施方式

[0029] 下面结合附图对本发明作进一步说明,本发明的原理对本专业的人来说是非常清楚的。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0030] 参见图1:各编号所指图形含义如下:1.一个订单簿的结构体,2.订单簿包含的买卖价格档位集合,3.特定于这个订单簿的订单块内存池,4.买方价格档位集合,5.买方价格档位集合,6.订单块内存池结构,7.价格档位双向链表,8.该买卖方向所有订单的剩余未成交报单量,9.该内存池中所有未分配的订单块组成的双向链表。
[0031] 参见图2:各编号所指图形含义如下:6.订单块内存池结构,9.该内存池中所有未分配的订单块组成的双向链表,10.在内存池中未分配的订单块结构11.用于链接订单块的双向链表元素,内含该元素的前一个链表元素的指针,后一个链表元素的指针,12.订单块将来分配给价格档位时用于保存价格档位的指针,13.订单从这个订单块上分配时,通过这个值来记录已经从15.techOrders数组中分配了多少订单出去,14.这个订单块上还未被分配的订单结构在15.techOrders数组中的下标位置,下次从这个位置开始分配,记录这个订单块上所有可被分配给价格档位的订单。
[0032] TechOrder内存分配方法:
[0033] 内存的分配将按单只股票隔离,分别进行;每只股票同一价格档位的订单将依次从一系列的微型内存池(记作orderChunk)中分配,如图2所示,这种微型内存池的大小为CPU一级缓存的大小。根据背景技术中所述的订单大小和CPU一级缓存的大小,我们可以按下面的公式计算出一个orderChunk可以分配的订单数量(记作OrderPreChunk)为:OrderPreChunk=32KB/120B。
[0034] OrderPreChunk约等于273个订单,即图2中的15号元件中数组大小OrderPreChunk。
[0035] 当一个orderChunk被分配满之后,系统将从每只股票各自拥有的一个订单块内存池(记作orderChunkPool)中分配一个新的orderChunk,用于后续的新订单分配,如图1所示。
[0036] 现有系统每只股票平均每天大约有三万笔订单,单个orderChunkPool的内存大小(Mempool)可以按以下公式计算得出:Mempool=30000*120B,Mempool等于3.42MB,可以完全落在CPU三级缓存范围内。
[0037] 系统启动时需要预先给单个orderChunkPool分配的orderChunk个数(记作orderChunkCountpool)可以计算得出:orderChunkCountpool=30000/OrderPreChunk。
[0038] orderChunkCountpool等于109个,除了启动时的预分配外,系统将在运行时根据订单的增长情况,动态的分配新的orderChunk加入到orderChunkPool中进行管理。
[0039] 实施例一:每个股票拥有一个OrderChunkPool,这个是订单块内存池,管理的单位是OrderChunk;OrderChunk是局部订单内存池,管理的单位是每个空闲订单槽,即Slot,用于分配给一个个订单。
[0040] 给NewOrder分配一块内存是先尝试从已经被链在对应价格档位上的OrderChunk中空闲的Slot中分配,这个档位上没有含空闲Slot的OrderChunk,我们就会从这个股票的OrderChunkPool中拿空闲的OrderChunk出来链入这个价格档位OrderChunk列表中,并从这个新的OrderChunk上面取空闲Slot分配给NewOrder。
[0041] OrderChunk在预分配阶段,采用的是分配一个大的内存块,在上面切成一个个OrderChunk的方式,所以它们也是局限在一定内存地址范围内的。尽量和CPU的三级四级缓存亲和。
[0042] 实施例二:本发明中所述的订单内存分配方法已经在【上海证券交易所-交易系统升级建设一期项目】中进行了实施,并取得了上述的性能提升,源代码位于内部代码仓库地址GTS/orderbook.git中,主要逻辑在order_chunk.go实现,下面是order_chunk.go的部分源代码:
[0043]
[0044]
[0045]
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈