一种多核环境下实现免锁队列的方法和设备的制造方法
【技术领域】
[0001]本发明涉及数据处理领域,尤其涉及一种多核环境下实现免锁队列的方法和设备。
【背景技术】
[0002]在数据处理领域,队列是一种常见的数据结构,队列通常是多个应用模块间保存共享数据的一种方式,典型的队列是先入先出(First Input First Output, FIFO)队列,其应用模式通常是,一个应用模块把数据保存到队列的一端中(通常可以称这种产生数据的模块为生产者),而另一个应用模块在队列的另一端把数据按照先后顺序从队列中取出(通常可以称这种取数据的模块为消费者)。
[0003]简单的单生产者单消费者FIFO队列模型中,生产者把生产出来的数据存入队列尾中,而消费者则从队列头中取出数据,生产者和消费者各司其职,不存在并发访问,所以没有资源竞争的冲突。
[0004]而在有多个应用模块同时共享一个队列时,就可能出现以下另外三种情形:多生产者单消费者、单生产者多消费者和多生产者和多消费者。这就导致了可能出现多个生产者或者多个消费者同时对队列进行访问的情况(通常称为并发访问),这种情况下,如果没有很好的解决并发访问时的冲突问题,就会导致数据错误。在计算机软件领域中,通过采用锁机制来解决并发访问时的冲突问题。
[0005]锁机制的原理如下:当某个模块要对队列进行访问时,先要取得队列的锁,把队列占为己有,然后才对队列进行相应的读写访问;当队列的锁被某个模块取得时,其它模块无权对队列进行访问。
[0006]这种运用锁机制把队列独占的机制,当出现并发冲突时,没有取得队列锁的模块可能需要一直空等待而无法执行其它操作(当其它操作必需要访问队列之后才能执行)。这在单核中央处理器(Central Processing Unit,CPU)的系统中,不会存在浪费CPU资源的问题。
[0007]然而,在多核CPU系统中,假如每个CPU核运行一个单独的应用模块,那么,当出现并发访问冲突时,等待获取队列锁的CPU核则会出现空等待而导致CPU资源浪费的情况,进而导致系统效率低下的问题。
【发明内容】
[0008]本发明的目的是提供一种多核环境下实现免锁队列的方法和设备,以解决当出现并发访问冲突多核CPU在获取共享队列锁时由于空等待导致系统效率低的问题。
[0009]本发明的目的是通过以下技术方案实现的:
[0010]一种多核环境下实现免锁队列的方法,包括:
[0011]确定一个环形队列,所述环形队列的存储结构采用数组形式存储,所述环形队列包括生产者子队列和消费者子队列;
[0012]当生产者有M个数据入队时,获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针,从所述生产者子队列初始头指针开始依次将M个数据加入到所述环形队列中,获取所述生产者子队列的尾指针作为生产者子队列初始尾指针,确定所述生产者子队列初始尾指针等于所述生产者子队列初始头指针时,将所述生产者子队列初始尾指针加M作为新的生产者子队列尾指针,入队完成,其中M为正整数;
[0013]当消费者有N个数据出队时,获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针,从所述消费者子队列初始头指针开始依次将N个数据从所述环形队列中清除,获取所述消费者子队列的尾指针作为消费者子队列初始尾指针,确定所述消费者子队列初始尾指针等于所述消费者子队列初始头指针时,将所述消费者子队列初始尾指针加N作为新的消费者子队列尾指针,出队完成,其中N为正整数。
[0014]这样,在多核环境下实现免锁队列的过程中在队列的入队和出队操作中,没有使用队列锁的机制独占队列,而是让多个模块同时访问队列的不同部分,从而有效解决了多生产者或多消费者并发访问时的冲突,减少了 CPU核空等待的时间,进而提高了多核系统的效率。
[0015]可选的,所述生产者子队列与所述消费者子队列均可以占据所述环形队列的任何存储空间,且针对所述生产者子队列和所述消费者子队列的操作方向相同。
[0016]可选的,进一步包括:
[0017]在系统初始化阶段,将所述生产者子队列的头指针、所述生产者子队列的尾指针、所述消费者子队列的头指针和所述消费者子队列的尾指针均设置为所述环形队列对应的数组结构的第一个元素。
[0018]可选的,确定所述环形队列未满,具体包括:
[0019]当生产者有M个数据入队时,判断所述消费者子队列第一尾指针是否等于所述生产者子队列初始头指针加1,若是,则判定所述环形队列已满,不能执行生产者的入队操作;否则,判定所述环形队列未满,继续执行生产者的入队操作。
[0020]可选的,当生产者有M个数据入队时,在确定所述环形队列未满之后,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针之前,进一步包括:
[0021]获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,再次获取当前生产者子队列的头指针,并判断当前生产者子队列的头指针是否等于所述生产者子队列初始头指针,执行后续操作。
[0022]可选的,确定所述环形队列未空,具体包括:
[0023]当消费者有N个数据出队时,判断当前生产者子队列的尾指针是否等于所述消费者子队列初始头指针,若是,则判定所述环形队列已空,不能执行消费者的出队操作;否则,判定所述环形队列未空,继续执行消费者的出队操作。
[0024]可选的,当消费者有N个数据出队时,确定所述环形队列未空之后,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针之前,进一步包括:
[0025]获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,若是,则执行后续操作;否则,重新开始获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,再次获取当前消费者子队列的头指针,并判断当前消费者子队列的头指针是否等于所述消费者子队列初始头指针,执行后续操作。
[0026]—种多核环境下实现免锁队列的设备,包括:
[0027]确定单元,用于确定一个环形队列,所述环形队列的存储结构采用数组形式存储,所述环形队列包括生产者子队列和消费者子队列;
[0028]第一处理单元,用于当生产者有M个数据入队时,获取所述生产者子队列的头指针作为生产者子队列初始头指针,获取所述消费者子队列的尾指针作为消费者子队列第一尾指针,基于所述生产者子队列初始头指针和所述消费者子队列第一尾指针,确定所述环形队列未满时,将所述生产者子队列初始头指针加M作为新的生产者子队列头指针,从所述生产者子队列初始头指针开始依次将M个数据加入到所述环形队列中,获取所述生产者子队列的尾指针作为生产者子队列初始尾指针,确定所述生产者子队列初始尾指针等于所述生产者子队列初始头指针时,将所述生产者子队列初始尾指针加M作为新的生产者子队列尾指针,入队完成,其中M为正整数;
[0029]第二处理单元,用于当消费者有N个数据出队时,获取所述消费者子队列的头指针作为消费者子队列初始头指针,获取所述生产者子队列的尾指针作为生产者子队列第一尾指针,基于所述消费者子队列初始头指针和所述生产者子队列第一尾指针,确定所述环形队列未空时,将所述消费者子队列初始头指针加N作为新的消费者子队列的头指针,从所述消费者子队列初始头指针开始依次将N个数据从所述环形队列中清除,获取所述消费者子队列的尾指针作为消费者子