信息处理装置及信息处理方法

文档序号:6360667阅读:138来源:国知局
专利名称:信息处理装置及信息处理方法
技术领域
本发明涉及信息处理技术、具体涉及处理多个线程(thread)的信息处理装置及信息处理方法。
背景技术
近年的信息处理装置具备多线程技术,该多线程技术实现可同时执行多个处理的多任务环境,并且这些处理能在处理内部生成多个线程进行并行处理。处理在执行时被分配固有的资源和地址空间,无法访问其它处理的区域。与此不同,线程为处理内部生成的执行单位,各线程可对处理内的区域自由地相互访问。线程为操作系统分配CPU (CentralProcessing Unit :中央处理单元)的执行时间的基本执行单位。在这样并行处理多个线程的环境中,通过在共有存储器内设置队列,使得能生成请求要消费的数据和资源的线程的等待队列,可在保持处理器和线程的独立性的同时实现·排他控制。

发明内容
〔发明所要解决的课题〕一般来说,某线程试图从队列中取出数据时,如果队列中不存在数据,则该线程成为忙循环(busy loop)状态,直到由其它线程保存新数据。在此期间,CPU资源被浪费,因此,存在如下问题,即,这种状态越出现,整体的处理效率就越下降。此外,在上述那样的技术中,线程请求访问数据和资源时,首先需要操作队列,进入等待队列。但为了保障保存在队列中的等待队列的数据的匹配性,需要在队列的操作中设置控制机构。因此,最终线程实现对数据和资源的访问需要多个手续。本发明是鉴于这样的课题而研发的,其目的在于提供一种可防止因线程访问队列而导致的处理效率下降的信息处理技术。本发明的目的还在于提供一种可提高线程对数据和资源的访问的处理效率的信息处理技术。〔用于解决课题的手段〕本发明的一个方案涉及信息处理装置。该信息处理装置包括保存由各个数据的队列构成的数据用队列的存储器,和对将所生成的数据加入到数据用队列中的数据生成线程和将数据从数据用队列中取出的数据消费线程的至少任一者进行处理的一个以上的处理器;处理器在数据消费线程的处理中,当数据用队列中不存在应取出的数据时,向该数据用队列中加入数据消费线程的识别信息,在数据生成线程的处理中,在将数据加入数据用队列中时,若该数据用队列中有数据消费线程的识别信息,则改变数据的存储位置,以使得该数据消费线程能够取得它。本发明的另一个方案涉及信息处理方法。该信息处理方法包括在由处理器执行的第I线程的处理中,在尝试从保存于存储器的队列取出数据时,若应取出的数据不存在,则将第I线程的识别信息加入该队列的步骤;在由处理器执行的第2线程的处理中,在向队列加入数据时,若该队列中有第I线程的识别信息,则将数据提供给该第I线程的步骤。本发明的另一个方案涉及信息处理装置。该信息处理装置包括处理器,对访问需要同步管理的对象的线程进行处理;存储器,保存具有链接列表构造的队列,该队列表示请求访问对象的线程的等待队列,该链接列表将各线程的识别信息用指向队列中的下一线程的识别信息的指针连结;作为指向链接列表中的第一个线程的识别信息的指针的头指针被附加了关于对象的当前状态的信息;线程请求访问对象时,在参照被附加于头指针的关于对象的当前状态的信息,判断可否访问,若不能访问,则将线程的识别信息加入队列。本发明的另一方案涉及信息处理方法。该信息处理方法包括当需要访问需进行同步管理的对象时,参照存储于存储器中的具有链接列表构造的队列的步骤,该队列表示请求访问该对象的线程的等待队列,该链接列表将各线程的识别信息用指向队列中的下一个线程的识别信息的指针连结;取得作为指向链接列表中的第一个线程的识别信息指针的头指针所被附加的、关于对象的当前状态的信息,判断是否可以访问的步骤;以及无法访问时,将线程的识别信息加入队列的步骤。·
此外,将以上构成要素的任意组合、本发明的表现形式在方法、装置、系统、计算机程序、记录有计算机程序的记录介质等间变换后的实施方式,作为本发明的方案也是有效的。〔发明效果〕通过本发明,可实现与排他控制相关的处理效率下降较少的信息处理。


图I是表示本实施方式中的信息处理装置的结构的图。图2是示意性地表示本实施方式中存储在队列中的等待队列的数据结构例的图。图3是表示向本实施方式中处于无元素状态的队列中推入(push)元素的操作方式的图。图4是表示向本实施方式中存有元素的状态的队列中推入新元素的操作方式的图。图5是表示从本实施方式中存有多个元素的状态的队列中移除(pop)元素的操作方式的图。图6是表示从本实施方式中只存有一个元素的状态的队列中移除该元素的操作方式的图。图7是表示本实施方式中线程操作队列的步骤的流程图。图8是表示在本实施方式中,假定队列中没有要移除的数据时的基本处理的流程图。图9是表示在本实施方式中,假定队列中没有要移除的数据时的基本处理的流程图。图10是表示本实施方式中将线程的等待队列编入数据队列和包队列这两者中的流程图。图11是表示本实施方式中将线程的等待队列编入数据队列和包队列这两者中的流程图。
图12是示意性地表示本实施方式中为实现信号量(semaphore)功能而存储于队列的链接列表的结构及其操作方式的图。图13是表示本实施方式中资源与请求数相比不足时操作链接列表的方式的图。图14是表示本实施方式中在有等待获得资源的线程的情况下释放资源时的链接列表的操作方式的图。图15是表示本实施方式中请求资源时的处理步骤的流程图。图16是表示本实施方式中释放资源时的处理步骤的流程图。图17是表示本实施方式中,在由其它线程获得了 Wlock (写锁)的期间,产生请求 Rlock (读锁)的线程时的链接列表的操作方式的图。图18是表示本实施方式中获得了 Wlock的线程解除Wlock时的链接列表的操作方式的图。
具体实施例方式图I表示本实施方式中的信息处理装置的结构。信息处理装置10包括处理单元12a、…、12η和共有存储器14,它们连接于主总线20。处理单元12a、…、12η分别包括处理器16a、…、16η,以及本地存储器18a、…、18η。处理单兀12a、…、12η可以分别包括处理器16a、…、16η,以及本地存储器18a、…、18η以外的构成部件,此处省略图不。信息处理装置10中,为实现各种功能而生成的多个线程在处理单元12a、…、12η中被并行处理。共有存储器14中存储用于处理线程的程序及各种数据,处理器16a、…、16η将所需数据从共有存储器14读出到属于自己的处理单元的本地存储器18a、…、18η后,开始进行线程处理。当分配给开始的线程的时间片(time slice)期满时,以及根据处理内容而变为待机状态时等,处理器16a、…、16η将处理对象切换成其它线程。此外,在之后的说明中,为方便理解,有时将处理的主体称作“线程”,但从硬件意义上讲,是指“对线程进行处理的处
理器”。决定线程处理的顺序及CPU时间的分配的调度(scheduling)可由OS提供的调度器执行,也可以由用户级的调度器执行。这样的调度处理也作为一个线程,由处理器16a、...、16n中的一者执行。在本实施方式中,如后述的那样存在两种情况根据队列的状态,处理中的线程释放处理器并转为待机状态的情况,和通过其它线程的处理,已成为待机状态的线程变得能开始进行处理的情况。因此,在这样的情况下预先准备实现线程的状态转移的处理,使得能够按照来自线程的请求而执行。这样的处理可以由OS提供,也可由用户级来准备。共有存储器14包括队列22。队列22是存储数据、线程等的等待队列的存储区域。如后面详述的那样,可根据等待队列的目的而设置多个队列,但在此,将它们统括为队列22。图2示意性地表示了本实施方式中存储于队列22中的等待队列的数据结构例。图2表示的等待队列的目的没有特别限定,只要是线程处理的过程中所需要的等待队列即可,等待的主体可以是线程本身,也可以是线程处理所需要的数据。例如考虑如下情况,即,某线程产生事件,将该事件的识别信息存储于队列22中,其它线程将该识别信息按照存储于队列22中的顺序读出,并基于此处理事件。此时,队列22中形成等待处理的事件的识别信息的等待队列。如图2所示,本实施方式的等待队列具有链接列表的形态。链接列表具有将多个数据通过指向下一数据的地址的指针而连结的构造。本实施方式中的链接列表28表示等待队列,故链接的顺序就成为被存储于队列22中的顺序。如上所述根据目的的不同,等待队列的主体可以有多种,在此,将它们统称为“元素”。在图2中,Ea、Eb、Ec表示按照此顺序存储的元素,Ph、Pa、Pb、Pt表示指针,由各指针延伸出的箭头所指的元素为存储于指针所示的地址中的元素。首先,指针Ph为头指针,表示第一个保存的元素Ea的存储位置地址。与元素Ea对应的指针Pa表示第二个被存储的元素Eb的存储位置地址。与元素Eb对应的指针Pb表示第三个被存储的元素Ec的存储位置地址。指针Pt为尾指针,如果如图所示最后被存储的元素为元素Ec,则指针Pt表示该元素Ec的存储位置地址。 通过这样的数据结构,存储任何数量的元素都可以表示出元素与其存储顺序。按FIFO (First In,First Out :先进先出)原则将元素从等待队列中排除时(以下称为“移除”),首先参照头指针Ph,取得等待队列中最先存储的元素Ea的地址。然后,在将元素Ea从该地址读出后,将头指针Ph更新为下一个元素Eb的存储位置地址。具体来说,将与元素Ea对应的指针Pa的值复制到头指针Ph中。将元素追加于等待队列中时(以下统称“推入”),在将该元素存储于队列22的空区域中后,参照尾指针Pt,取得等待队列中最后的元素Ec的地址。然后,使表示追加的元素的地址的新指针与该元素Ec建立对应,并将尾指针Pt也更新为元素Ec的地址。无论是否使用链接列表,操作队列等多个线程所共享的信息时,一般为确保信息的匹配性而需要访问的排他控制。在该情况下,直到一个线程完成获得锁定(lock)、操作队列、解除锁定这一系列处理,其它线程即使优先度高也须等待队列的操作。为缩短如上那样发生的对队列的访问等待时间,本实施方式将实现无锁定地进行操作的非阻塞(non-blocking)队列。具体来说,以多个原子操作(Atomic Operation)(不可分操作)阶段性地进行对队列的一系列操作,在原子操作之间允许插入其它线程的队列操作。原子操作是被保证不受其它线程干渉地执行的操作。然后,因插入而被中断了的操作中的剩余部分再接着所插入的线程而继续完成。图3 6是用于详细说明本实施方式的非阻塞队列的操作方法的图。图3表示向无元素状态的队列中推入元素Ea的操作方式。假设从该图中上方起,队列状态按状态50、52、54、56的顺序发生变化。基本的显示方法与图2的链接列表28 —样,仅用箭头表示了头指针Ph、尾指针Pt以外的指针。即,箭头的起点为与各指针相对应的元素、箭头的终点为存储于指针所示的地址中的元素。图4 6也是一样。首先,状态50表示队列中没有元素的初始状态。此时,将虚设的元素E—dummy推入链接列表中。虚设的元素E—du_y并不是有效元素,将其事先放入预定的地址。如此,将虚设的元素E—du_y放入队列中时,将表示元素是虚设的元素E—du_y的信息附加于表示该元素的指针中,在该图的示例中附加于头指针Ph。对指针附加其它信息的方法与后面参照图12详述的方法相同。或者,也可以通过在指针所指示的地址中保存表示元素为虚设的元素的识别信息,从而识别虚设的元素E—dummy。在状态50下,头指针Ph及尾指针Pt都表示了虚设的元素E—dummy的地址。当从该状态起某线程要推入元素Ea时,首先将元素Ea存储于空着的存储区域。然后,将表示该存储区域的地址的指针与虚设的元素E—dummy建立对应,由此成为状态52 (第I操作)。其次,将尾指针Pt更新,使其表示存储元素Ea的存储区域的地址,成为状态54(第2操作)。接着,通过将头指针Ph更新为与在第I操 作中与虚设的元素E—dummy建立了对应的指针的值,成为头指针Ph表示元素Ea的地址的状态56 (第3操作)。通过以上步骤,向队列中推入第一个元素的处理完成。在本实施方式中,像这样分阶段地更新指针。并且,将第I操作、第2操作、第3操作分别作为原子操作。图4表示向存有元素Ea、Eb的队列中推入新元素Ec的操作方式。首先,在状态60下,头指针Ph表示最初保存的元素Ea的地址,与元素Ea相对应的指针以及尾指针表示在元素Ea之后被保存、且是最后被保存的元素Eb的地址。从状态60起某线程要推入元素Ec时,首先将元素Ec保存在空着的存储区域中。然后,使表示该存储区域的地址的指针与元素Eb建立对应,从而成为状态62 (第I操作)。其次,将尾指针Pt更新,使其表示存有元素Ec的存储区域的地址,成为状态64(第2操作)。通过以上步骤,向原本存有元素的队列中推入新元素的处理完成。此时,指针的更新也是阶段性地实施的,并使第I操作、第2操作为原子操作。图5表示从存有多个元素Ea、Eb的状态的队列中移除元素Ea的操作方式。状态70与图4的状态60 —样。当从该状态70起某线程要移除第一个被存储的元素Ea时,首先参照头指针Ph取得元素Ea的地址,将该地址中存有的元素Ea读出到本地存储器18a等。然后,将头指针Ph更新为与所读出的元素Ea相对应的指针的值,成为状态72 (第I操作)。通过以上步骤,从存有多个元素的队列中移除第一个被保存的元素的处理完成。将此时的对队列的操作、即第I操作作为原子操作。图6表示从仅存有元素Ea的状态的队列中移除该元素的操作方式。首先,在状态80下,头指针Ph以及尾指针Pt表示了唯一的元素Ea的地址。当从该状态起某线程要移除元素Ea的情况下,由于头指针Ph与尾指针Pt表示了同一个地址,故判断为元素Ea是队列中最后一个元素、且队列中不包含虚设的元素E—dummy后,首先将虚设的元素E—dummy存储于预定的存储区域中等,对虚设的元素E—dummy进行必要的初始化,成为状态82 (第I操作)。然后,将表示虚设的元素E—dummy的地址的指针与元素Ea建立对应,由此成为状态84 (第2操作)。其次,将尾指针Pt进行更新,使其表示虚设的元素E—dummy的地址,成为状态86 (第3操作)。其次,参照头指针Ph取得元素Ea的地址,将头指针Ph更新为与元素Ea相对应的指针的值、即元素E—dummy的地址,由此成为状态88 (第4操作)。此时,事先将元素Ea读出到本地存储器18a等中。通过以上步骤,从队列中移除最后一个元素的处理完成。与之前一样,将第I操作、第2操作、第3操作、第4操作分别作为原子操作。通过图3 6中分别表示的一系列操作,可实现所有对队列的操作。在此,由于队列没有被锁定,故在原子操作之间的期间、即在图3的状态52、54、图4的状态60、图6的状态82、84、86下,有可能发生其它线程进行的队列操作的插入。此时,在某条件下,所插入的线程在开始自己的目的操作之前,继续进行被其它线程中断的操作中所剩余的操作。接下来说明用于实现队列操作的继续的线程动作。图7是表示线程操作队列的步骤的流程图。在图7 11、图15、16所示的流程图中,用S (Step的首字母)和数字的组合表示各部分的处理步骤。此外,当在S和数字的组合所表示的处理中执行某判断处理,其判断结果为肯定时,附加Y (Yes的首字母),例如表示为“S10的Y”。与此相反,其判断结果为否定时,附加N (No的首字母),表示为“S10的N”。图7的流程图中的处理在某线程访问队列时开始。首先,线程以元素的移除或推入为目的访问队列(S10)。之后,尝试进行图3 6的某一操作。例如要推入元素时,如果当前状态为图3的状态50或图4的状态60,则可以进行操作;在要移除元素时,若状态为图5的状态70或图6的状态80,则操作可以进行。此时(S12的Y),执行该线程本来目的的操作(S16)。即使不处于状态50、60、70、80,只要可能,就进行操作。例如考虑如图6的状态84那样尾指针Pt没有表示最后的元素的地址的情况。即使在这种状态下,元素的移除仍然可以实现。因为,元素的移除只参照头指针Ph所示的地址就可执行。另一方面,如图4中说明的那样,元素的推入需要执行第一操作,将尾指针Pt所示的最末尾的元素与表示要推入的元素的地址的新指针相对应。因此,当如状态84那样尾指针Pt表示最末尾的元素以外的地址时,该元素立刻就被与指向其它元素的指针建立对应,因此无法执行第I操作。
·元素的地址时,从尾指针Pt所示的元素起循着链接确定最末尾的元素,用其地址来更新尾指针Pt。将阻碍本来操作的非法状态的变化(variation)与针对各状态应在S14中执行的操作事先建立对应地存入共有存储器14,根据需要进行参照。然后,再次尝试执行本来目的的操作(S12)。如果无法执行操作,则再执行与此时的非法状态对应的操作(S12的N、S14)。反复进行这些处理,直至本来目的的操作能够执行,由此,实质上之前的线程就能继续进行剩余的操作了。在此基础上,执行本来的操作(S12 的 Y、S16)。此外,其它线程在图6的第3操作结束后的状态86下以元素的移除为目的进行了插入时,之前的线程的剩余操作、即元素Ea的移除与进行了插入的线程的目的操作一致,故作为当前线程的本来操作而执行。此时,被插入的线程在下次访问队列时,从用于移除元素的最初的操作、即图6的第I操作开始实施。此时,如果队列中只有虚设的元素E—du_y,则作为错误而结束操作。如上所述,在本实施方式中,不对队列进行锁定,而是以多个原子操作阶段性地实施一系列操作。由此,线程等待访问队列的状态不会再发生,信息处理装置整体的处理效率得到提升。此外,插入了队列访问的线程通过继续进行之前线程所进行的操作中的剩余操作,即便因插入而导致队列暂时出现非法状态,也能每次都修正,保持队列的一贯性。下面,利用前述的非阻塞队列说明使处理效率得到进一步提升的各种方案。( I)考虑了等待数据的线程的队列在存储于队列中的数据全部已读出的情况等时,有时尽管某线程以数据的移除为目的访问队列,但队列中却不存在数据。在这样的情况下,一般会成为忙循环状态直到有数据被存储于队列中,这会无用地消耗CPU资源。在本实施方式中,作为上述非阻塞队列的说明中的“元素”,将用于线程的处理的“数据”与线程的识别信息等“线程信息”混入一个队列中,由此使无数据存在和线程的等待状态直接相连,来提高处理效率。此时,信息处理装置的构成可以与图I中说明的构成一样。此外,由于需要利用非阻塞队列,故针对队列的操作可以与图3 7中说明的操作相同。图8及图9是表示考虑到队列中没有要移除的数据时的基本的处理步骤的流程图。图8是想要移除数据时的流程图,此处理在线程以移除数据为目的访问队列时开始执行。线程首先确认所访问的队列中是否有可以移除的数据,如果有,则移除该数据(S22的Y、S24)。如果没有数据,则线程向该队列中推入包含本线程的识别信息的线程信息后,释放处理器,转为待机状态(S22的N、S28、S30)。即,在没有移除的数据的情况下,线程将对队列的操作切换为线程信息的推入后,转为待机状态。此时,线程信息就被保存在队列中。此时,可以向表示所推入的线程信息的头指针附加表示存储有线程信息的信息。此外,在S22中,若队列中仅存有虚设的元素或线程信息,则判断为该队列中没有数据(S22的N)。图9是想要推入数据时的流程图,该处理在线程以推入数据为目的访问队列时开 始执行。此时,线程首先确认所访问的队列中是否有线程信息,如果没有,则就此推入数据,实现目的(S32的Y、S34)。反之,如果有线程信息,则判断为有正在等待数据的线程,将该线程信息移除后,向基于此所确定的线程直接传递数据(S32的N、S36、S38)。在加入了线程信息时将表示存有线程信息的信息附加于头指针的方案中,通过参照头指针来进行S32的判断。S38的处理实际上是试图推入数据的线程在将该数据保存到被分配给要传递数据的线程的共有存储器14的区域中后,向使线程处理开始的处理传递所移除的线程信息,由此来使该线程的处理重新开始的。如此,在推入数据时也是一样,若队列中存有线程信息,则将操作切换为该线程信息的移除。通过这样的处理,能在一个队列中同时管理数据的等待队列和线程的等待队列。使数据的不存在与线程的待机状态直接相连,能原子地操作双方,因此能缩短用于管理的处理所需的时间。此外,在没有数据的情况下,线程能够不变为忙循环状态地立即释放处理器,故信息处理装置整体的处理效率得到提升。图8、9是向线程处理所需的数据的队列中推入线程的等待队列的处理步骤,但该方法也适用于数据队列以外的处理。例如,可以对将数据推入队列时所需的空包队列执行同样的操作。这里,包是将存储数据的预定单位的存储区域实体化为数据的存放器的结构,通过事先规定可以使用的包数,能限制共有存储器中可为队列使用的区域。包的概念已经被广泛地引入介由网络的通信等领域中。图10、11是表示将线程的等待队列编入数据队列与空包队列这两者时的处理步骤的流程图。此时,作为空包的队列,设有用于保存数据的数据用空包队列和用于保存线程信息的线程信息用空包队列。这些队列都由非阻塞队列构成。数据用空包队列、线程信息用空包队列是表示在被划分为包的共有存储器的各区域中的、读出前的未存储有数据或线程信息的区域、即空包的地址的队列。与此不同,数据队列是表示读出前的存储有数据或线程信息的区域的地址的队列。如,从数据用空包队列移除数据用空包、向该包中放入数据的一系列处理实际上为取得从数据用空包队列连结空的存储区域的指针并写入新数据,将该区域的指针放入数据队列的处理。反之,从数据队列移除数据,将不需要的空包推入数据用空包队列等一系列处理实际上为数据队列的指针将显示区域的数据读出,将与该区域相对应的指针推入数据用空包队列的处理。此处理方法同样适用于线程信息。图10是表示想要从队列移除数据时的处理步骤的流程图,该处理在线程处理中需要移除数据时开始执行。首先,线程从线程信息用空包队列中确保线程信息用空包(S40)。然后访问数据队列,执行移除处理(S42)。此时如图8中说明的那样,如果有能移除的数据,则将数据移除,如果没有,则推入线程信息。在推入线程信息时,向步骤S40所获得的线程信息用空包中存储线程信息后,将该信息存入数据队列。在步骤S42中若无法移除数据地推入了线程信息,则该线程成为待机状态,因此暂且结束数据的移除处理(S44的N)。反之,若能够移除数据(S44的Y),则将不再需要的线程信息用空包返还给线程信息用空包队列(S46)。此处理实际上成为向线程信息用空包队列的推入。为返还存有移除后向本地存储器中读入完毕的数据的数据用空包,访问数据用空包队列,进行推入处理(S48)。此处理可通过将图9的流程图中的“数据”置换为“数据用空·包”而以相同的处理步骤实现。即,如果数据用空包队列中存在线程信息,则移除该信息,并直接向该线程传递数据用空包,如果数据用空包队列中不存在线程信息,则推入数据用空包。图11是表示想要向队列中推入数据时的处理步骤的流程图,此处理在线程处理中需要推入数据时开始执行。首先,线程从线程信息用空包队列中确保线程信息用空包(S50)。然后访问数据用空包队列,执行数据用空包的移除处理(S52)。此处理可通过将图8的流程图中的“数据”置换为“数据用空包”,以相同的处理步骤实现。即,如果有数据用空包,则移除它,如果没有,则推入线程信息。在推入线程信息时,向在步骤S50中确保的线程信息用空包中存入线程信息后,再存入数据用空包队列。若在步骤S52中无法移除数据用空包地推入了线程信息,则该线程变为待机状态,因此暂时结束数据的推入处理(S54的N)。反之,若能移除数据用空包(S54的Y),则将变得不再需要的线程信息用空包返还于线程信息用空包队列(S56)。此处理实际上成为向线程信息用空包队列的推入。进而,访问数据队列,使用在S52中移除的数据用空包进行数据的推入处理(S58)。此时,如图9中说明的那样,如果数据用空包队列中存在线程信息,则将之移除,并直接将数据传递给该线程,如果数据用空包队列中不存在线程信息,则推入数据。通过上述构成,不仅对于线程处理所需的数据的移除、推入,在其前后的处理所需要的空包的确保、返还的处理中,线程也不会因队列的访问等待而成为忙循环状态,而是能释放处理器。因各队列是非阻塞队列,故可在空包获得处理和数据读出处理这两者中减少因等待访问队列而产生的线程等待时间。(2)信号量信号量作为针对多个线程共同使用的资源进行资源使用的同步的方法而被广泛利用。具体来讲,是在共有存储器中准备表示可利用的资源数的计数器,在要使用资源时,使计数器的值减少所要使用的数量,在使用完资源而释放资源时,使计数器的值增加相应数量。例如在将对器件和存储器等的访问权作为资源时,将能同时访问的线程数的上限作为计数器的初始值,如将计数器的值限制为整数,则当访问数达到上限时计数器变为0,无法进行更多的访问。在此,利用非阻塞队列的构成说明高效地实现信号量的功能的方法。图12示意性地表示了为实现信号量的功能而存储于队列22中的链接列表的构造及其操作的方式。链接列表的构造和对队列的基本操作与之前说明的一样,但在实现信号量时,对链接列表的指针附加关于资源数的信息。在该图中,状态90的头指针Ph被附加了表示当前可使用的资源数的计数器值Nr。当任何一个线程都没有使用该资源时,计数器值Nr为事先设定的上限值。在本实施方式中,如下述那样对信号量的机构编入用于获得资源的线程的等待队列。因此,计数器值Nr不限定于整数,资源数不足时以负值表示。所请求的资源数也以负值表示。
在从状态90起某线程请求资源时,首先参照头指针Ph,取得附加于该指针的计数器值Nr。然后,如果资源的请求数在计数器值Nr以下,则可获得所请求数量的资源,故从原来的计数器值Nr减去请求数,更新计数器值(该图中表示为“Nr’”)。通过该第I操作,成为状态92,资源数满足请求数时的资源获取完成。此处的第I操作也作为原子操作。因此,将计数器值Nr与指针加起来作为可进行原子操作的数据大小。例如若能实施原子操作的数据大小为4字节单位,则将3字节分配给指针,将I字节分配给计数器值Nr。在数据大小不足的情况下,例如将指针作为目录构造进行链接列表的操作时,仅操作指针的目录,可以只在需要数据访问时抽取实际的地址。此夕卜,在从状态90起某线程释放资源时,只要将释放的资源数加入到计数器值Nr中进行更新即可。图13表示资源不足请求数时的链接列表的操作方式。在此,为了方便理解,将计数器值和请求数用具体的数值例表示。首先,在状态100中,被附加于头指针Ph的计数器值Nr为“5”,表示可以利用5个资源。假设从该状态100起某线程请求10个资源。此时,该线程参照附加于头指针Ph的计数器值“5”,判断为资源数比请求数小后,开始向队列推入自己的线程信息的操作。此时,首先将线程信息存于空着的存储区域。然后,将资源请求数以负值附加于表示该存储区域的地址的指针,并通过与虚设的元素Edummy建立对应,成为状态102 (第I操作)。在状态102等中,表示头指针Ph、尾指针Pt以外的指针的箭头上所示的数值为该指针所被附加的资源请求数。在此例中,请求资源数为10,因此,“一10”被附加于指针。如此,将附加于头指针Ph以外的指针中的信息作为该指针所示的、下一线程请求的资源数。然后,将尾指针Pt更新,使其表示所推入的线程信息的地址,成为状态104 (第2操作)。其次,通过将头指针Ph更新为与虚设的元素E—du_y相对应的指针的值,成为头指针Ph表示线程信息的地址的状态。此时,同时在头指针Ph所被附加的计数器值中加入与虚设元素E—dummy相对应的指针所被附加的资源的请求数,将其结果附加于更新后的头指针Ph。在该图中,5 — 10 =一 5被附加于头指针Ph。通过以上的第3操作,变为状态106。如此,被附加于头指针Ph的计数器值Nr为负值时表示资源的不足数。此时,形成正在等待获得资源的线程的等待队列。在从状态106起有其它线程请求资源时,推入其线程信息,并对表示所追加的线程信息的指针附加该线程的资源请求数。此外,与此前一样,第I操作、第2操作、第3操作分别原子地执行。图14表示有正在等待获得资源的线程的情况下,释放资源时的链接列表的操作方式。在该图中,在状态108下有2个线程正在等待获得资源,其各自的线程信息、即线程信息a、线程信息b按照此顺序被存储于队列中。相对于等待队列的最初的线程所请求的资源数不足的部分由头指针Ph所被附加的计数器值表示,在该情况下表示为“一 5”。与线程信息b对应的等待队列的下一线程的资源请求数被附加于与线程信息a相对应的指针。该图中附加了 “一 2”。假设针对该状态108,某线程公开资源数6。此时,该线程首先参照被附加于头指针Ph的计数器值,由于该值为负值,故判断为有等待获得资源的线程。然后,使该计数器值与释放的资源数相加,作为新的计数器值。如果该值在O以上,则等待队列的最初的线程能获得所请求的资源数,故通过将对应的线程信息a移除而将之从等待队列中排除。在该例中,释放的资源数为“6”,计数器值为“一 5”,新的计数器值成为“ I ”,故移除线程信息a。
此时,将头指针Ph更新为与所移除的线程信息a相对应的指针值,并将附加于该指针的下一线程的资源请求数再与之前算出的新的计数器值相加,将其结果附加于头指针Ph。在该图的例子中,最初的线程获得资源后的计数器值如上所述为“1”,下一线程的请求数为“一 2”,因此,将I 一 2 =— I的计数器值附加于头指针Ph。通过上述的第I操作,成为线程信息a被移除了的状态110。如该例这样如果计数器值为负,则相对于头指针Ph所示的线程的资源请求数,可利用的资源不足,因此,更多线程信息在下一次有资源被释放之前不会移除。反之,当状态110中计数器值为正时,下一个等待获得资源的线程可也获得所请求的资源,故可继续移除线程信息。通过将移除的线程信息提供给开始进行线程处理的处理(process),使用所获得的资源,线程的处理恢复进行。在将等待队列中的最后的线程信息移除时,同图6 —样推入虚设的元素。图15是表示请求资源时的处理步骤的流程图。此流程图中的处理在请求资源的线程访问队列时开始执行。首先,线程参照被附加于头指针Ph的计数器值,判断相对于请求数,可利用的资源是否足够(S60)。如果够(S60的Y),则通过将计数器值减掉请求数来更新计数器值,并获得请求的资源(S62)。可利用的资源数不足时(S60的N),将自己的线程信息推入队列(S64)。然后通过将计数器值的数减掉请求数来更新计数器值(S66)。此时的计数器值成为负值。此后,该线程释放处理器,转为待机状态(S68 )。图16是表示释放资源时的处理步骤的流程图。此流程图中的处理在要释放资源的线程访问队列时开始执行。首先,线程通过确认附加于头指针Ph的计数器值是否为负,来判断是否有等待获得资源的线程(S70)。没有等待获得资源的线程时(S70的N),通过将计数器值与释放的资源数相加来更新计数器值,完成释放处理(S72)。有等待获得资源的线程时(S70的Y),判断释放的资源数是否满足等待队列的第一个线程所请求的资源的不足量(S74)。如上述那样,若将释放的资源数加入原计数器值后的新计数器值为O以上,则可以判断为资源数足够。释放的资源数足够时(S74的Y),移除该线程的线程信息,使之从等待队列中排除(S76),利用所获得的资源继续进行该线程的处理(S78)。等待队列中有后续的线程时(S70的Y),若释放的资源的剩余数满足其资源请求数(S74的Y),则依次实施线程信息的移除和线程处理的再次开始(S76、S78)。若已没有等待获得资源的线程(S70的N)、或释放的资源数不够(S74的N),则将此时的计数器值作为该时点的最终计数器值而附加于头指针Ph,结束释放处理(S72 )。通过这样的构成,能够同时实现信号量的功能与等待获得资源的线程的队列的功能。这些功能可通过针对同一队列的原子操作来实现,因此,资源不足时可使请求资源的线程立刻成为待机状态,释放处理器。并且,一旦成为可获得资源的状态,立刻就能使已成为待机状态的线程的处理再次开始。这些处理被非阻塞地执行,因此,可以在对队列的访问、资源的请求及释放、线程的待机及处理再次开始这些各步骤中缩短线程的等待时间。(3) RW 锁定作为控制多个线程访问存储于共有存储器中的数据的方法,R (Reader) lock (读锁)及W (Writer) lock (写锁)。一般来讲,在某线程为读出数据而获得了 Rlock的期间,其它线程也能获得Rlock,使得多个线程可同时进行读取。另一方面,在某线程为写入数据而获得了 Wlock的期间,其它线程无法访问该数据。通过以上手段,保证数据的匹配性。Rlock与Wlock不会同时发生,例如想要进行写入的线程要等待其它线程获得的·Rlock被解除,在获得Wlock后再进行写入。想要进行读取的线程在其它线程已经获得了Rlock的情况下,该线程本身也会立刻获得Rlock开始读取。另一方面,若其它线程获得了Wlock,则要等待其解除,在获得Rlock后再进行读取。在此,说明利用非阻塞队列的结构高效率地实现RW锁定的管理的方法。在该情况下,对于信号量也同上述一样,将用于获得锁定的线程的等待队列编入RW锁定的管理机构。因此,向链接列表的指针附加RW锁定的信息。在此,RW锁定的信息包含当前的锁定的状态及正等待获得锁定的线程所请求的锁定的种类的信息。所谓当前的锁定的状态,是指获得了 Rlock的线程数和获得了 Wlock的线程数。在以下的说明中,以变量R表示前者,以变量W表示后者。如上所述,变量W的最大值为I,变量R没有上限。此外,变量R取O以外的值时变量W为0,变量W为I时变量R为O。链接列表的构造及其操作方式基本上与说明信号量时的一样。例如,在没有等待获得锁定的线程的状态下,以当前的锁定的状态代替图12中的计数器值Nr来附加于头指针Ph。另一方面,有等待获得锁定的线程时,头指针Ph还被附加链接列表的第一个线程所请求的锁定的种类、即表示是Rlock还是Wlock的信息。在R = 0、w = 0,即任何一个线程都没有获得锁定的状态下,线程可立刻获得任何一种锁定。具体来讲,线程首先参照头指针Ph,取得其所被附加的当前的锁定的状态。如上述那样,R = O、W = O时,线程根据自己请求的锁定的种类而使变量R或变量W增量,由此获得Rlock或Wlock。R为O以外的值时,线程若请求Rlock,则也可通过使变量R增量而获得 Rlock0图17表示在由其它线程获得了 Wlock的期间出现请求Rlock的线程时的链接列表的操作方式。在该图中,为了方便理解,以具体例子表示RW锁定的信息。首先,在状态120下,被附加于头指针Ph的RW锁定的信息为“R = O7W= 1”,表示其它线程已经获得了Wlock0请求Rlock的线程首先要参照被附加于头指针Ph的RW锁定的信息,确认Wlock已被获得了时,向队列推入自己的线程信息。此时,首先将线程信息存入空着的存储区域,向表示该存储区域的地址的指针附加表示所请求的锁定的种类的识别信息,在该图中,附加“Rlock”,并通过使之与虚设的元素E—dummy建立对应,而成为状态122 (第I操作)。然后,将尾指针Pt更新,使其表示该线程信息的地址,成为状态124 (第2操作)。接着,将头指针Ph更新为与虚设的元素E—dummy相对应的指针的值,由此成为头指针Ph表示线程信息的地址的状态。与此同时,将被附加于与虚设的元素E—dummy相对应的指针的、表示等待线程所请求的锁定的种类的识别信息“Rlock”追加于头指针Ph的附加信息中。通过这些第3操作,成为状态126。结果,头指针Ph就被附加了表示当前的锁定的状态的信息、和头指针Ph所示的线程所请求的锁定的种类。从状态126起,其它线程请求了 Rlock或Wlock时,推入其线程信息,并对表示所追加的线程信息的指针附加该线程所请求的锁定的种类。此外,于之前一样,分别原子地实施第I操作、第2操作、第3操作。因此,如针对信号量所说明的那样,使附加于指针的RW锁定的信息与指针一起成为可进行原子操作的数据大小。该图表示了最初Wlock被获得的情况,但在最初Rlock被获得的状态下请求Wlock时也是同样的操作。
图18表示获得了 Wlock的线程解除Wlock时的链接列表的操作方式。在该图中,在状态130下,请求Rlock的线程和请求Wlock的线程按此顺序形成了等待队列,其各自的线程信息、即线程信息a、线程信息b按此顺序被存储于队列中。在此,要解除Wlock的线程首先参照附加于头指针Ph的RW锁定的信息,由于其中包含有表示被请求的锁定的种类的识别信息,故判断为有等待获得锁定的线程。之后,移除链接列表的等待队列中的第一个线程信息a。此时,将头指针Ph更新为与移除的线程信息a相对应的指针的值,并更新附加于头指针Ph的RW锁定的信息。在该图中,由于是解除Wlock,所以使变量W减量,由于要使与所移除的线程信息a对应的线程获得Rlock,所以使变量R增量。此外,由于与后续的线程信息b对应的线程是请求Wlock的,所以在附加于头指针Ph的RW锁定的信息中将“Rlock”改写为“Wlock”。由此,成为状态 132。在此,当与后续的线程信息b对应的线程请求Rlock时,能够接着使其获得Rlock,因此,将线程信息b也移除。如此,解除自己的锁定的线程在有其它等待获得锁定的线程的情况下,移除等待队列的第一个线程信息,使与该线程信息对应的线程获得锁定。如果使之获得的锁定是Rlock,则进一步确认等待队列,如果有连续请求Rlock的线程,则依次移除它们的线程信息,使其获得Rlock。通过将移除的线程信息提供给使线程处理开始执行的处理,已获得锁定的线程的处理将再次开始。在移除等待队列中的最后的线程信息时,与图6一样,推入虚设的元素。此外,也可以使得解除Wlock的线程仅移除最前面的线程信息a,不确认后续的线程信息。在该情况下,可以如下这样连锁地确认能否获得锁定开始了处理的线程信息a的线程确认后续的线程、即接下来来到等待队列的最前面的线程信息b,如果是Rlock,则移除该线程信息b,使对应的线程处理开始执行。请求锁定时的处理步骤与图15的流程图中所示的步骤一样。但,S60的判断为判断是否可获得所请求的锁定,在S62及S66中更新的信息为RW锁定的信息。解除锁定时的处理步骤与图16的流程图中所示的步骤一样。但,S74的判断为判断是否可获得所请求的锁定,在S72中更新的信息为RW锁定的信息。通过以上这样的构成,可同时实现RW锁定的管理功能与等待获得锁定的线程的队列的功能。这些功能可通过针对同一队列的原子操作来实现,因此,能使无法获得锁定的线程立刻变为待机状态,释放处理器。此外,当成为可获得锁定的状态时,能立刻使已变为待机状态的线程的处理再次开始。这些处理被非阻塞地进行,因此,能在对队列的访问、锁定的获得及解除、线程的待机及处理的再次开始这些各步骤中减少线程的等待时间。以上基于实施方式对本发明进行了说明。本领域技术人员当理解上述的实施方式为例示,其各构成要素和各处理过程的组合可以有各种变形例,且该变形例同样包括在本发明的范围内。标号说明10信息处理装置、12a处理单元、14共有存储器、16a处理器、18a本地存储器、22队列、28链接列表。工业可利用性·
如上,本发明可用于计算机、游戏机等信息处理装置。
权利要求
1.一种信息处理装置,其特征在于,包括 保存由各个数据的队列构成的数据用队列的存储器,和 对将所生成的数据加入到上述数据用队列中的数据生成线程和将数据从上述数据用队列中取出的数据消费线程的至少任一者进行处理的一个以上的处理器; 其中,上述处理器 在上述数据消费线程的处理中,当上述数据用队列中不存在应取出的数据时,向该数据用队列中加入上述数据消费线程的识别信息, 在上述数据生成线程的处理中,在将数据加入上述数据用队列中时,若该数据用队列中有上述数据消费线程的识别信息,则改变数据的存储位置,以使得该数据消费线程能够取得它。
2.如权利要求I所述的信息处理装置,其特征在于, 上述处理器在上述数据消费线程的处理中,在将该数据消费线程的识别信息加入上述数据用队列中后,休止该数据消费线程的处理。
3.如权利要求2所述的信息处理装置,其特征在于, 上述处理器在上述数据生成线程的处理中,若上述数据用队列中有上述数据消费线程的识别信息,则使已休止的该数据消费线程的处理转为再次开始的状态。
4.如权利要求I至3的任一项所述的信息处理装置,其特征在于, 上述处理器按预先规定的原子操作的单位阶段性地实施上述数据生成线程的处理中的将数据加入数据用队列的操作、和上述数据消费线程的处理中的从数据用队列取出数据的操作,并且在该原子操作期间以外,即使在将上述数据加入数据用队列的操作或将上述数据从数据用队列中取出的操作的中途,也不阻碍用于其它线程处理的对数据用队列的操作。
5.如权利要求4所述的信息处理装置,其特征在于, 上述处理器在上述其它线程的处理中,若在上述原子操作期间以外也无法进行用于该其它线程处理的对数据用队列的操作,则判断为是将上述数据加入数据用队列的操作或从数据用队列取出上述数据的操作的中途状态,通过根据该中途状态进行所规定的操作,使将上述数据加入数据用队列的操作或从数据用队列取出上述数据的操作的至少一部分推进执行。
6.如权利要求4或5的任一项所述的信息处理装置,其特征在于, 上述数据用队列具有将各数据用指向队列中的下一数据的指针连结的链接列表的构造,并通过使各指针的更新分别为原子操作,来阶段性地实施将上述数据加入数据用队列的操作和从数据用队列取出上述数据的操作。
7.如权利要求I至6的任一项所述的信息处理装置,其特征在于, 上述存储器还保存由表示空存储区域的信息的空包的队列构成的包用队列,该包用队列能保存应加入上述数据用队列的预定单位的数据; 上述处理器 在上述数据生成线程的处理中,在将生成的预定单位的数据加入上述数据用队列前,尝试从上述包用队列取出空包,如果应取出的空包不存在,则向该包用队列加入上述数据生成线程的识别信息,在上述数据消费线程的处理中,在将预定单位的数据从上述数据用队列取出后,将不再需要的空包返回给上述包用队列时,若该包用队列中有上述数据生成线程的识别信息,则改变空包的保存位置,以使得该数据生成线程能够取得它。
8.如权利要求I至5的任一项所述的信息处理装置,其特征在于, 上述数据用队列具有将各数据用指向队列中的下一数据的指针连结的链接列表的构造; 在上述数据用队列中,在没有上述应取出的数据及上述数据消费线程的识别信息任一者的状态下,保存虚设数据; 指向上述链接列表中的上述虚设数据的指针被附加了识别虚设数据的信息。
9.如权利要求I至5的任一项所述的信息处理装置,其特征在于, 上述数据用队列具有将各数据用指向队列中的下一数据的指针连结的链接列表的构造; 上述处理器 在上述数据消费线程的处理中,在向上述数据用队列加入上述数据消费线程的识别信息时,对指向上述链接列表的该识别信息的指针附加表示有识别信息的信息, 在上述数据生成线程的处理中,通过参照上述链接列表的指针,判断上述数据用队列中是否有上述数据消费线程的识别信息。
10.一种信息处理方法,其特征在于,包括 在由处理器执行的第I线程的处理中,在尝试从保存于存储器的队列取出数据时,若应取出的数据不存在,则将上述第I线程的识别信息加入该队列的步骤;和 在由处理器执行的第2线程的处理中,在向上述队列加入数据时,若该队列中有上述第I线程的识别信息,则将数据提供给该第I线程的步骤。
11.一种计算机程序,其特征在于,使计算机实现以下功能 在第I线程的处理中,尝试从保存于存储器中的队列取出数据时,如果应取出的数据不存在,则将上述第I线程的识别信息加入该队列; 在第2线程的处理中,在向上述队列加入数据时,若该队列中有上述第I线程的识别信息,则向该第I线程提供数据。
12.一种信息处理装置,其特征在于,包括 处理器,对访问需要同步管理的对象的线程进行处理; 存储器,保存具有链接列表构造的队列,该队列表示请求访问上述对象的线程的等待队列,该链接列表将各线程的识别信息用指向队列中的下一线程的识别信息的指针连结;作为指向上述链接列表中的第一个线程的识别信息的指针的头指针被附加了关于上述对象的当前状态的信息; 上述线程请求访问上述对象时,在参照被附加于上述头指针的关于上述对象的当前状态的信息,判断可否访问,若不能访问,则将上述线程的识别信息加入上述队列。
13.如权利要求12所述的信息处理装置,其特征在于, 上述线程在结束对上述对象的访问时,参照上述链接列表中的头指针所被附加的、关于上述对象的当前状态的信息,判断请求访问的线程是否存在于队列中,如果存在,则将该线程的识别信息从队列中取出。
14.如权利要求13所述的信息处理装置,其特征在于, 上述线程在无法访问上述对象时,将该线程的识别信息加入上述队列后,转为休止状态; 其它线程在结束对上述对象的访问时,如果队列中存在请求访问的线程的识别信息,则使处于休止状态的与上述识别信息对应的线程的处理转为再次开始执行的状态。
15.如权利要求12至14的任一项所述的信息处理装置,其特征在于, 上述链接列表中的指针被附加关于该指针所指向的线程的访问请求的信息; 上述线程在将请求访问的线程的识别信息从队列中取出时,将上述头指针更新,使其指向下一个线程的识别信息,并基于取出的识别信息的指针所被附加的、关于上述下一个线程的上述访问请求的信息,更新附加于上述头指针中的关于上述对象的当前状态的信肩、O
16.如权利要求12至15的任一项所述的信息处理装置,其特征在于, 按预先规定的原子操作单位阶段性地实施将线程的识别信息加入队列的操作及从队列中取出的操作,在该原子操作期间以外,即使在上述加入队列的操作或从上述队列取出的操作的中途,也不阻碍其它线程对队列的操作。
17.如权利要求16所述的信息处理装置,其特征在于, 上述其它线程在上述原子操作期间以外也无法进行对上述队列的操作时,判断为是向上述队列加入的操作或从上述队列取出的操作的中途状态,通过根据该中途状态进行所规定的操作,使向上述队列加入的操作或从上述队列取出的操作的至少一部分推进执行。
18.如权利要求12至17的任一项所述的信息处理装置,其特征在于, 通过使各指针的更新分别为原子操作,来阶段性地实施将线程的识别信息加入队列的操作及从队列取出的操作。
19.如权利要求15所述的信息处理装置,其特征在于, 对上述对象的访问是资源的利用; 附加于上述头指针的、关于上述当前状态的信息是该资源的可利用数; 附加于各指针的、关于上述下一个线程的访问请求的信息是资源的请求数。
20.如权利要求19所述的信息处理装置,其特征在于, 上述资源的可利用数通过取负值来表示资源的不足数。
21.如权利要求15所述的信息处理装置,其特征在于, 对上述对象的访问是对存储于共有存储器中的数据的读出及写入; 附加于上述头指针的上述关于现在状态的信息是正在读出该数据的线程数及正在写入该数据的线程数; 附加于各指针的、关于上述下一个线程的访问请求的信息是读出和写入的区别。
22.一种信息处理方法,其特征在于,包括 当需要访问需进行同步管理的对象时,参照存储于存储器中的具有链接列表构造的队列的步骤,该队列表示请求访问该对象的线程的等待队列,该链接列表将各线程的识别信息用指向队列中的下一个线程的识别信息的指针连结; 取得作为指向上述链接列表中的第一个线程的识别信息指针的头指针所被附加的、关于上述对象的当前状态的信息,判断是否可以访问的步骤;以及无法访问时,将上述线程的识别信息加入上述队列的步骤。
23.一种计算机程序,其特征在于,使计算机实现以下功能 当需要访问需进行同步管理的对象时,参照存储于存储器中的具有链接列表构造的队列的步骤,该队列表示请求访问该对象的线程的等待队列,该链接列表将各线程的识别信息用指向队列中的下一个线程的识别信息的指针连结; 取得作为指向上述链接列表中的第一个线程的识别信息指针的头指针所被附加的、关于上述对象的当前状态的信息,判断是否可以访问的步骤;以及无法访问时,将上述线程的识别信息加入上述队列的步骤。
全文摘要
想要针对队列移除数据的线程首先确认所访问的队列中是否有能移除的数据,如果有数据,则将其移除(S22的Y、S24)。而如果没有数据,则线程将含有自己的线程的识别信息的线程信息推入同一队列后,释放处理器,并转为待机状态(S22的N、S28、S30)。之后,若队列中有线程信息,则想要推入数据的线程判断为有等待数据的线程,将该线程信息移除后,提供数据,再次开始处理。
文档编号G06F9/54GK102906706SQ20118002545
公开日2013年1月30日 申请日期2011年3月23日 优先权日2010年5月24日
发明者永田章人 申请人:索尼电脑娱乐公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1