一种基于队列的异步IO处理方法技术

技术编号:20484200 阅读:24 留言:0更新日期:2019-03-02 18:42
一种基于队列的异步IO处理方法,该方法的模块包含一个私有队列、一组功能接口和一个队列提交接口。在模块外部,生产者需要先创建一个临时队列,然后通过功能接口生产者可连续多次调用该模块的功能。在生产者调用该模块功能的过程中,模块根据生产者调用的功能类型以及调用该功能所使用的参数创建IO请求结点并将请求结点放入生产者创建的临时队列,若模块功能单一也可将参数中提交的数据结点直接放入临时队列。最后生产者通过队列提交接口将临时队列中的所有结点批量提交到模块的私有队列。由于每个生产者会创建一个临时队列,而生产者在调用模块功能过程中创建的IO请求结点放入各自的临时队列是不需要加锁的,因此大幅度减少了生产者之间存在互斥的可能性。从而大幅提高了提交异步IO操作的性能。

【技术实现步骤摘要】
一种基于队列的异步IO处理方法
本专利技术涉及计算机系统软件编程领域,特别是一种基于队列的异步IO处理方法。
技术介绍
在计算机系统软件中异步IO操作是常用的IO模式,相对于同步IO模式,异步IO对减少线程占用量和提高IO吞吐量有明显帮助。但在实际编程中还有一些不足,例如在提交异步IO后无法确定提交的IO操作是否已经开始执行,在多线程环境中每一次提交异步IO都需要考虑线程之间的互斥,即每一次提交异步IO请求到目标对象的队列中都需要使用锁机制保证请求投放到队列的正确性,在有大量IO操作需要提交的情况下会显著降低性能,即便使用原子操作实现的提交请求到队列的方式也只能解决多线程之间线程因为互斥而频繁挂起的问题,处理器的开销依然很大。
技术实现思路
本专利技术的目的是克服现有技术的上述不足而提供一种基于队列的异步IO处理方法,使异步IO操作的提交变得可控且更加高效。本专利技术的技术方案是:一种基于队列的异步IO处理方法,该方法的模块包含一个私有队列、一组功能接口和一个队列提交接口。功能接口用于向模块外部提供对该模块的相关操作,例如读操作、写操作。队列提交接口用于将模块外部临时队列中的结点批量提交到模块的私有队列。在模块外部,生产者需要先创建一个临时队列,然后通过功能接口生产者可连续多次调用该模块的功能。在生产者调用该模块功能的过程中,模块根据生产者调用的功能类型以及调用该功能所使用的参数创建IO请求结点并将请求结点放入生产者创建的临时队列,若模块功能单一也可将参数中提交的数据结点直接放入临时队列。在一系列连续的调用完成后生产者通过队列提交接口将临时队列中的所有结点批量提交到模块的私有队列。在多处理器系统中,当多个生产者同时调用该模块的功能时,由于每个生产者会创建一个临时队列,而生产者在调用模块功能过程中创建的IO请求结点放入各自的临时队列是不需要加锁的,因此大幅度减少了生产者之间存在互斥的可能性。若将临时队列中的所有结点批量提交到私有队列的过程使用原子操作实现会进一步提高整体的性能。将临时队列中的所有结点批量提交到私有队列的过程可以使用原子交换操作实现。先使用原子交换操作将私有队列的尾指针原子化的替换为指向临时队列尾结点的指针同时将私有队列原尾指针取出并判断,若私有队列原尾指针是空指针则将私有队列的首指针指向临时队列的首结点,若私有队列原尾指针不是空指针则将私有队列原尾结点的链接指针指向临时队列的首结点。在向外提供多种功能的模块中,消费者从私有队列中依次取出生产者提交的IO请求结点,并根据每个请求的功能类型进行处理。若IO请求结点需要等待硬件IO且未处理完,则等硬件IO完成后将请求结点放回私有队列,重复上述过程直到全部处理完。对于单一功能的模块,若消费者从私有队列中取出的是数据结点则直接对数据结点进行处理。本专利技术与现有技术相比具有如下特点:专利技术阐述一种先通过临时队列将生产者调用模块功能产生的IO请求记录下来,再通过队列提交接口将临时队列中的所有请求结点批量提交到模块的私有队列,从而减少在多处理器环境下生产者之间的互斥来提高性能的方法。这样,提交IO请求的可控性和效率将大幅度提高。以下结合附图和具体实施方式对本专利技术的详细结构作进一步描述。附图说明附图1为将队列A的所有结点批量添加到队列B之前的状态;附图2为将队列B的尾指针替换为指向队列A尾结点的指针;附图3为将队列B原尾结点的链接指针指向队列A的首结点;附图4为当队列B为空时,将队列B首指针指向队列A的首结点。具体实施方式如附图1、附图2所示:在生产者完成一系列功能调用之后,模块将所有请求结点放入生产者创建的临时队列A。然后生产者通过队列提交接口将队列A的所有结点提交到队列B,先使用原子交换操作将队列B的尾指针替换为指向队列A尾结点的指针同时取出队列B原尾指针并判断。如附图3所示:若队列B原尾指针不是空指针则将队列B原尾结点的链接指针指向队列A的首结点。如附图4所示:若队列B原尾指针是空指针则将队列B的首指针指向队列A的首结点。本专利技术涉及到计算机专业领域里原子操作的概念,对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现这些原子操作。例如本专利技术中使用的原子交换操作在Intelx86处理器平台上可以用XCHG指令和LOCKCMPXCHG指令实现,其中XCHG指令的功能可用LOCKCMPXCHG指令加条件循环来替代,且不同的处理器硬件平台实现这些原子操作的机器指令是不同的,不能将这种差异解释为超出本专利技术的范畴。名词解释锁机制:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。生产者和消费者:在线程世界里,生产者就是提交数据的线程,消费者就是处理数据的线程。在多线程开发当中,如果生产者提交速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续提交数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。生产者消费者模式:生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。本文档来自技高网...

【技术保护点】
1.一种基于队列的异步IO处理方法,该方法的模块包含一个私有队列、一组功能接口和一个队列提交接口;功能接口用于向模块外部提供对该模块的相关操作;队列提交接口用于将模块外部临时队列中的结点批量提交到模块的私有队列;其特征在于:模块外部的生产者需要先创建一个临时队列,然后通过功能接口生产者可连续多次调用该模块的功能;在生产者调用该模块功能的过程中,模块根据生产者调用的功能类型以及调用该功能所使用的参数创建IO请求结点并将请求结点放入生产者创建的临时队列;最后生产者通过队列提交接口将临时队列中的所有结点批量提交到模块的私有队列。

【技术特征摘要】
1.一种基于队列的异步IO处理方法,该方法的模块包含一个私有队列、一组功能接口和一个队列提交接口;功能接口用于向模块外部提供对该模块的相关操作;队列提交接口用于将模块外部临时队列中的结点批量提交到模块的私有队列;其特征在于:模块外部的生产者需要先创建一个临时队列,然后通过功能接口生产者可连续多次调用该模块的功能;在生产者调用该模块功能的过程中,模块根据生产者调用的功能类型以及调用该功能所使用的参数创建IO请求结点并将请求结点放入生产者创建的临时队列;最后生产者通过队列提交接口将临时队列中的所有结点批量提交到模块的私有队列。2.根据权利要求1所述的一种基于队列的异步IO处理方法,该方法的模块还包含一种使用原子交换操作将存在多个结点的队列中所有结点批量添加到另一个队列的方法,该方法的队列包含一个首指针和一个尾指针,队列中的每个结点包含一个链接指针,结点与结点之间通过链接指针连接起来,队列的首指针指向第一个结点即首结点,队列的尾指针指向最后一个结点即尾结点;其特征是:将存在多个结点的队列A中所有结点批量添加到队列B时,先使用原子交换操作将队列B的尾指针原子化的替换为指向队列A尾结点的指针同时将队列B原尾指针取出并判断,若队列B原尾指针是空指针则将队列B的首指针指向队列A的首结点,若队列B原尾指针不是空指针则将队列B原尾结点的链接指针指向队列A的首结点。3.根据权利要求1所述的一种基于队列的异步IO处理方法,其特征是...

【专利技术属性】
技术研发人员:龙恢管志坚
申请(专利权)人:长沙新弘软件有限公司
类型:发明
国别省市:湖南,43

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1