在多处理器环境中在多个任务当中分配共享的存储器的制作方法

文档序号:15736746发布日期:2018-10-23 21:36阅读:143来源:国知局

本公开的实施例一般涉及用于在多个处理器当中高效地共享有限的存储器的方法和系统。



背景技术:

在具有共享的存储器的多处理器硬盘驱动器(hard disk drive,HDD)或SSD环境中,每个处理器需要以以下限制来分配用于使用的存储器:(1)已被另一处理器在使用的存储器不可以被分配给另外的处理器;以及(2)太多的存储器不可以被分配给任何单独的处理器。如果将太多的存储器分配给任何一个处理器,其他处理器可能由于缺乏存储器而“饥饿”。通常情况下,存储器被分成固定大小的被称为页面的块。每个处理器当需要页面时分配页面。由于不再需要已经被分配给处理器的页面,所以将该页面返回到全局页面池,以便该页面可以被系统中的任何处理器(重新)使用。

页面是在诸如SSD设备的存储器设备中的写入操作所需的存储器粒度(granularity)。码字是针对在诸如SSD设备的存储器设备中的读取操作的存储器粒度。单个读取操作利用一个或多个码字。在许多存储器设备中,页面大小是码字大小的倍数。

根据工作负荷,每个处理器可能只需要页面的一小部分用于处理器正在处理的任务。简单的解决方案是忽略不需要的页面的大部分,并且当处理器利用所需的存储器完成时,将整个页面返回到池中。对于具有大量可支配的存储器的系统,只使用页面的一小部分不是问题。但是,对于更小的嵌入式系统(诸如运行在HDD或SSD上的系统),通常没有足够的高性能存储器来允许浪费分配的页面的大部分。特别地,分配存储器是一种低开销操作(即,低处理器周期),并且当前缺乏效率。此外,存储器的总利用率非常高,其能够导致效率低下。存储器的总利用率和存储器的分配往往是冲突的。

因此,本领域需要一种在多个处理器当中高效利用和分配存储器的方法和系统。



技术实现要素:

本公开总体上涉及一种用于在多个处理器当中高效地共享有限的存储器的方法和系统。每个处理器具有本地链表。本地链表标识被分配给特定处理器的页面以及每个所分配页面的空闲码字的数量。另外,本地链表包括每个所分配页面的下一(多个)空闲码字的位置。当所有码字都可用时,页面被认为是空闲的,并且可以被发送回由所有处理器使用的页面池。如果在所分配的页面上有足够数量的连续的空闲码字,则新的码字数据可以被存储在页面中。如果在任何所分配的页面上都没有足够数量的连续的空闲码字,则从页面池将新的页面分配给处理器。实现了存储器资源的高效分配,因为除非在页面中没有码字保持被分配,页面不被交换回空闲池,这减少了分配和空闲页面的开销;在整个页面被释放之前,页面内的码字能够被重新使用,从而保持更高的缓冲器的整体利用率;并且随着码字被释放,页面被添加到码字连续空闲计数,从而允许进行更大的分配以使得增加整体的缓冲器的利用率。

在本公开中提到“存储设备”。应该理解,“存储设备”不限于诸如SSD、HDD或其他存储器设备的任何特定的存储设备。相反,应该理解,除非特别说明,否则“存储设备”将包含任何通用存储设备的可能性。

在一个实施例中,一种系统包括主机设备;以及耦合到该主机设备的存储设备。该存储设备包括多个处理器。每个处理器包括:创建本地链表的装置;从页面池中分配空闲页面的装置;将空闲页面返回到页面池的装置;从页面分配和释放码字的装置;检查本地链表的装置;改变本地链表中的第一空闲码字的标识的装置;以及改变本地链表中空闲码字的数量的标识数量的装置。存储设备还包括被耦合到多个处理器中的每个处理器的存储器设备。

在另一实施例中,一种方法包括:检查多个处理器中的第一处理器上的本地链表;确定本地链表上被分配的页面具有大于或等于将要被分配的码字的数量的数量的连续码字;从分配的页面分配码字;增加本地链表中对所分配的页面为空闲的第一码字的编号;以及减少本地链表中对所分配的页面空闲的码字的数量。

在另一实施例中,一种方法包括:释放在所分配的页面中的一个或多个码字,其中所分配的页面被分配给多个处理器中的第一处理器;增加针对第一处理器的本地链表中的所分配的页面中空闲的码字的数量;确定所分配的页面是否具有任何被分配的码字;并将所分配的页面返回给页面池,其中页面池被多个处理器共享。

附图说明

为了能够详细理解本公开的上述特征的方式,可以通过参考实施例(其中的一些在附图中被示出)来进行对上面简要总结的本公开的更具体的描述。然而,要注意的是,附图仅示出了本公开的典型实施例,并且因此不被认为是对其范围的限制,因为本公开可以允许其他等效的实施例。

图1是根据一个实施例的系统的示意图。

图2A是图1的系统的处理器的示意图。

图2B是具有多个页面的存储器设备的示意图。

图3是根据一个实施例的访问公共存储器设备的多个处理器的示意图。

图4A-图4E是根据一个实施例的用于处理器的本地链表的示意图。

图5是示出本公开的实施例的流程图。

图6是示出本公开的另一实施例的流程图。

为了便于理解,在可能的情况下已经使用相同的附图标记来指定对于附图共同的相同元件。可以预期的是,在没有特定叙述的情况下在一个实施例中公开的元件可以有权用于其他实施例。

具体实施方式

在下文中,对本公开的实施例进行参考。然而,应该理解,本公开不限于具体描述的实施例。相反,无论是否涉及不同实施例,以下特征和元件的任何组合都被考虑为实施和实践本公开。此外,虽然本公开的实施例可以实现优于其他可能的解决方案和/或现有技术的优点,但是给定实施例是否实现特定优点不是对本公开的限制。因此,以下方面、特征、实施例和优点仅仅是说明性的,并且不被认为是所附权利要求的元素或限制,除非在(多个)权利要求中明确地叙述。同样地,对“本公开”的提及不应被解释为对本文公开的任何发明主题的概括,并且不应被认为是所附权利要求的元素或限制,除非在(多个)权利要求中明确叙述。

本公开总体上涉及一种用于在多个处理器当中高效地共享有限的存储器的方法和系统。每个处理器具有本地链表。本地链表标识分配给特定处理器的页面以及每个所分配页面的空闲码字的数量。另外,本地链表包括每个所分配页面的下一(多个)空闲码字的位置。当所有码字都可用时,页面被认为是空闲的,并且可以被发送回由所有处理器使用的页面池。如果在所分配的页面上有足够数量的连续的空闲码字,则新的码字数据可以被存储在页面中。如果在任何所分配的页面上都没有足够数量的连续空闲码字,则从页面池将新的页面分配给处理器。实现了存储器资源的高效分配,因为除非在页面中没有码字保持被分配,页面不被交换回空闲池,这减少了分配和空闲页面的开销;在整个页面被释放之前,页面内的码字能够被重新使用,从而保持更高的缓冲器的整体利用率;并且随着码字被释放,页面被添加到码字连续空闲计数,从而允许进行更大的分配以使得增加整体的缓冲器的利用率。

图1是根据一个实施例的系统100的示意图。该系统包括与存储设备104交互的主机设备102。控制器106被耦合到主机设备102和存储设备104两者。存储设备104存储主机设备102在各种时间可能需要的数据。当需要数据时,主机设备102联系存储设备104以获得数据。控制器106控制存储设备104和主机设备102之间的通信。

存储设备104包括控制器108和多个CPU或处理器110A-110N。存储设备104还包括存储器设备112。存储器设备112被耦合到所有CPU110A-110N以及控制器108。

图2A是图1的系统100的通用CPU或处理器110的示意图。在图2A中,CPU 110被示出为具有与高速缓存存储204以及存储器设备112交互的控制器202。如将在下面讨论的,存储器设备112包括能够被分配给多个处理器110A-110N的多个页面。每个处理器110A-110N具有本地链表,该本地链表包括一个或多个所分配的页面的标识、本地链表中对于每个所分配的页面空闲的第一码字的列表、以及本地链表中对于每个所分配的页面空闲的码字的总数量的列表。

控制器106、202是数字电路,其管理去往存储设备104和来自存储设备104的数据流(在控制器106的情况下)以及去往单独的CPU 110A-110N和来自单独的CPU 110A-110N的数据流(在控制器202的情况下)。控制器106、202能够是单独的芯片或被集成到其他芯片中,诸如被放置在相同的裸芯上或作为CPU的集成部分(如在控制器202的情况下)。控制器106、202可以被称为集成存储器控制器(integrated memory controllers,IMC)、存储器芯片控制器(memory chip controller,MCC)或存储器控制器单元(memory controller unit,MCU)。控制器202用于创建本地链表;在所分配的页面当中分配码字;检查本地链表;改变本地链表中第一空闲码字的标识;以及改变在本地链表中空闲的码字的数量的标识数量。

图2B是具有多个页面210A-210I的存储器设备112的示意图。应该理解的是,尽管已经示出了九个单独的页面,但是存储器设备112可以具有更多或更少的页面。九个页面210A-210I仅用于示例目的,而不是限制性的。

图3是根据一个实施例的访问公共存储器设备112的多个处理器110A-110C的示意图。如图3所示,每个处理器110A-110C都可以访问整个存储器设备112中的所有多个页面210A-210I。然而,尽管每个处理器110A-110C都可以访问所有页面210A-210I,但是当某些页面210A-210I当前不被任何处理器110A-110C需要时,某些页面210A-210I已经被分配给某些处理器110A-110C,因此仍然在未分配的或可用的页面210A-210I的页面池中。特别地,如线302、304所示,处理器110A当前具有分配给其的页面210A、210E;如线306、308所示,处理器110B具有分配给其的页面210D、210G;并且如线310所示,处理器110C具有分配给其的页面210H。

如上所述,本领域需要一种在多个处理器当中高效地分配存储器的方法和系统。为了解决这个需要,需要实施一些参数。用于特定读取请求的码字分配应该是连续的。单个页面应该被用于尽可能多的码字分配。不应该从存储器或页面池中分配新的页面,直到没有已经分配的页面具有满足新的码字分配请求的在其中可用的足够的连续码字。用于特定读取请求的码字不能跨多个存储器页面,因为由处理器分配的页面不能保证是连续的,因此一旦页面未被使用,这些页面能够尽可能快地被释放以用于其它使用。

为了确保多个处理器当中存储器的高效分配,在每个处理器上创建本地链表。表中的每个元素都包含页面唯一ID(PageUID);页面中空闲的第一码字的唯一ID(FirstCwFree);以及从第一码字空闲的连续码字的数量(NumCwFree),其中numCwFree小于或等于页面中的码字数量(NumCwPerPage)。

当处理器需要分配码字(NumCwToAllocate)时,处理器首先检查处理器上的本地的、相关联的链表以寻找其中NumCwFree大于或等于NumCwToAllocate的节点。如果找到节点,则处理器将FirstCwFree增加NumCwToAllocate并将NumCwFree减少NumCwToAllocate。处理器然后完成所分配的任务。

如果没有找到节点,则处理器从全局页面池分配新的页面。处理器然后将新节点添加到处理器的本地链表中,其中FirstCwFree被设置为NumCwToAllocate,且NumCwFree被设置为NumCwPerPage-NumCwToAllocate。处理器然后完成所分配的任务。

当处理器利用码字完成时,处理器首先检查处理器的本地链表以寻找具有与将要被释放的码字的PageUID相同的PageUID的节点以及寻找紧接在将要被释放的范围之前或之后的空闲码字的范围。如果找不到匹配的节点,则处理器为将要被释放的码字范围将新节点添加到处理器的本地链表。

如果找到匹配节点,则处理器将NumCwFree增加NumCwToAllocate,并且如果要释放的新范围在现有空闲范围之前,则也将FirstCwFree减少NumCwToAllocate。如果NumCwFree等于NumCwPerPage,则将该节点从处理器的本地链表中删除,并将整个页面返回到全局池。

图4A-图4E是根据一个实施例的用于处理器的链表400的示意图。图4A表示已经将两个页面分配给处理器的一些时间点。如图4A所示,处理器具有分配给其的两个页面,PageUID 2和PageUID 5。对于PageUID 2,FirstCwFree为5且NumCwFree等于45。PageUID 5,在另一方面,具有FirstCwFree为0且NumCwFree等于5。此外,PageUID 5还具有尚未被分配的额外码字,其从10开始且NumCwFree等于5。因此,在PageUID 2上,码字0-4被分配并且码字5-49为可用的。对于PageUID 5,码字0-4和10-14是可用的,而码字5-9和从15到最后一个码字的所有码字被分配。

现在转到图4B,来自PageUID 2的五个被使用的码字(即,码字0-4)已经被释放。因此,对于PageUID 2,所有码字已经被释放,并且整个PageUID2未处于使用中。因此,PageUID 2能够被返回到页面池以用于另一处理器分配。因此,在图4B中,PageUID 2不再显示,因为PageUID 2已经被返回到池中。

现在转到图4C,现在需要为处理器分配10个码字。PageUID 5仍然具有为0的FirstCwFree且NumCwFree等于5,并且PageUID 5具有额外的码字空闲,具有下一码字在10处空闲,且NumCwFree等于5。因此,PageUID5没有10个或更多个顺序的或连续的码字空闲,并且因此PageUID 5不足以分配10个码字。因此,需要将新的页面PageUID 1从池中分配给处理器。PageUID 1在被分配给处理器时具有50个码字,其中没有一个正被使用。因此,在PageUID 1中有10个连续的码字可用,并且PageUID 1被用于10个码字。一旦从PageUID 1分配了10个码字,则PageUID 1具有为10的FirstCwFree,且NumCwFree等于40。

现在转到图4D,从在PageUID 5上的码字5-9释放五个码字。因此,PageUID 5现在与先前一样具有为0的FirstCwFree,但是NumCwFree是15。因此,码字0-14现在是空闲的,并且假设PageUID 5中有超过15个码字,剩下的码字被分配。如果PageUID 5中没有码字被分配,则可以将PageUID5返回到池中。

现在转到图4E,需要分配8个码字。PageUID 5具有从码字0开始的15个码字空闲。PageUID 1具有从码字10开始的40个码字空闲。因此,PageUID 1和PageUID 5均具有至少8个连续码字空闲。如果PageUID 5被用于8个码字,如图4E所示,则在将8个码字分配给PageUID 5之后,对于PageUID 5,FirstCwFree是8且对于PageUID 5,NumCwFree是7。在PageUID 5中剩余的7个码字以及在PageUID 1中剩余的40个码字可以在以后使用。

图5是示出本公开的实施例的流程图500。该过程开始于处理器具有多个码字要分配开始。在块502中,处理器搜索分配给其的页面。在块504中,做出关于在所分配的页面中是否有用于从页面分配码字的足够数量的连续码字可用的确定。如果没有足够数量的连续码字可用,则在块506中从页面池中分配新的页面,然后在块508中从新的页面分配码字。如果在块504中存在足够数量的连续码字块,则在块508中从具有足够数量的连续码字的页面分配码字。

图6是示出本公开的另一实施例的流程图600。该过程开始于在块602处,处理器释放已经分配给该处理器处理器的页面中的一个或多个码字。随后在块604处,处理器将本地表中的NumCwFree增加等于所释放码字的数量的量。在块606中,根据已经被释放的第一连续码字,处理器可能需要改变FirstCwFree以反映第一空闲码字的位置。如果在块608中现在FirstCwFree为0且在块610中NumCwFree等于页面上的码字的总数量,则在块614中该页面被返回到池中;如果在块606中FirstCwFree不为0或NumCwFree小于页面上的码字的总数量,则在块612中页面保持被分配给处理器。

在操作中,该方法涉及检查多个处理器中的第一处理器上的本地链表;确定本地链表上被分配的页面具有大于或等于将要被分配的码字的数量的数量的连续码字;从所分配的页面分配码字;增加本地链表中对所分配的页面为空闲的第一码字的编号;以及减少本地链表中对所分配的页面空闲的码字的数量。该方法可以额外包括:检查第一处理器上的本地链表;确定所分配的页面没有具有足够的连续码字可用;以及从由多个处理器共享的页面池中获得新的页面。该方法可以还包括从新的页面分配码字并更新本地链表。该方法可以还包括从被分配给第一处理器的第二页面释放多个码字;确定第二页面的所有码字是空闲的;以及将第二页面返回到页面池。该方法可以还包括检查多个处理器中的第二处理器上的本地链表;确定第二处理器的本地链表上的被分配的页面具有大于或等于将要被分配的码字的数量的数量的连续码字;从所分配的页面分配码字;增加本地链表中对所分配的页面为空闲的第一码字的编号;以及减少本地链表中对所分配的页面空闲的码字的数量。另外,该方法可以包括从分配给第二处理器的第二页面释放多个码字;确定第二页面的所有码字是空闲的;并且将第二页面返回到页面池。最后,该方法可以包括检查第二处理器上的本地链表;确定所分配的页面不具有足够的连续码字可用;以及从由多个处理器共享的页面池中获得新的页面。

此外,在操作中,该方法可以包括检查多个处理器中的第一处理器上的本地链表,其中检查包括:寻找具有与将要被释放的一个或多个码字相同的PageUID的第一处理器的所分配页面;以及寻找紧接在将要被释放的一个或多个码字之前或之后的空闲码字的范围;确定是否有页面将要被释放;以及如果页面被确定为不具有从其分配的码字,则将该页面返回到页面池。

通过在所分配的页面中以连续的方式分配码字,多个处理器能够高效地共享有限的存储器。存储器分配是连续的,没有SGL,并且单个页面用于尽可能多的存储器分配,以最大化所分配的页面的使用。没有单个存储器分配跨多个页面。此外,随着码字被释放,做出关于所分配的页面是否仍然具有被分配的任何码字的确定。如果在所分配的页面中没有分配码字,则该页面被返回到页面池并且可用于对任何其他处理器的分配。通过这样做,存储器分配是快速和高效的。

虽然前述内容针对本公开的实施例,但是在不脱离本公开的基本范围的情况下可以想出本公开的其他和进一步的实施例,并且其范围由所附的权利要求所确定。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1