基于亲和性感知的dma缓冲区管理方法及装置的制作方法

文档序号:6366752阅读:117来源:国知局
专利名称:基于亲和性感知的dma缓冲区管理方法及装置的制作方法
技术领域
本发明涉及到计算机系统的内存管理方法,一种基于亲和性感知的DMA缓冲区管理方法及装置。
背景技术
外设的输入输出各需要经历4个步骤。输入的4个步骤是(I)将数据从外设复制到内核空间。如果没有提供DMA (direct memory access)方式,贝1J复制操作由CPU执行,数据将两次经过存储总线;(2)对数据进行校验和计算,此操作涉及到所有的传输数据,数据将再次经过存储总线;(3)将数据从内核复制到用户空间,此操作必须由CPU执行,数据跨越内核与用户空间,经过两次存储总线;(4)应用从用户空间获取数据。与接收过程相对,输出也需要类似的4个步骤。显然,在整个输入/输出过程中,数据最多会6次经过存储总线,存储总线需要提供6倍于I/O数据流的带宽。随着片上多处理器系统的普及,多个线程会共享使用片上Cache资源,包括应用程序和内核线程,其中I/O处理属于典型的内核线程。但是传统的最近最少使用(LRU)的Cache替换策略并不能区分不同线程的访问,因此一个线程的Cache失效可能会替换属于另一个线程的Cache块,该问题被称为线程间干扰。为了减少线程间的干扰,相关工作使用亲和性描述数据的分布与访存性能的关系。进程在包含其所需数据的处理器上运行,能减少数据在处理器之间的流动,提高处理器的访存效率,即数据在存储层次中的位置决定了访存的开销。特别是在近几年高速带宽和设备的出现,系统含有大量用于处理I/O的线程,其与应用程序并行执行。因此,Cache的干扰问题不仅仅局限于应用程序之间,在I/O和应用之间同样会存在Cache干扰的问题。由于I/O的数据重用度较低,并且每次外设进行I/O时,Cache中的部分数据会因替换而写回主存。一旦设备I/O的过程结束,被写回的数据需要再次被使用时,又需要从主存中读取。因此,针对处理器中各个线程间共享的存储资源,特别是对于资源受限和设计较为简单的嵌入式系统,需要借助操作系统来管理资源,更需要从软件的角度提供一种改进的内存管理方法,方法的灵活性和通用性,从而实现对系统性能的优化。

发明内容
本发明要解决的技术问题是提出一种基于亲和性感知的DMA缓冲区管理方法及装置,解决如何减少I/o处理过程引入的偏外存储访问,包含两个方面1.)降低I/O处理过程自身的访存开销;2.)缓解I/O处理过程引入的Cache污染问题。本发明所采用的技术方案为一种基于亲和性感知的DMA缓冲区管理方法,包括以亲和性的高低将缓冲区分为两类,并确定不同I/O处理过程对缓冲区亲和性的需求。并 使用纯软件的手段,在操作系统层来标识缓冲区的亲和性。具体的说,以输出处理过程的特点来标识低亲和性缓冲区,具体包括输出过程中,由于一致性维护操作后,处理器不再访问输出缓冲区,所以将最近释放的输出缓冲区记录为低亲和性。以输入处理过程的特点来标识高亲和性缓冲区,具体包括当输入过程中,缓冲区释放前,处理器需要将输入缓冲区中的数据拷贝到用户缓冲区,所以将最近释放的输入缓冲区标识为高亲和性。将不同亲和性的缓冲区集中管理,具体包括所有最近被释放的低亲和性缓冲区存放于低亲和性链表中,最近被释放的高亲和性缓冲区存放于高亲和性链表中。针对不同亲和性的缓冲区采用不同的管理策略,具体包括对于高亲和性的缓冲区采用先进先出的管理策略,使高亲和性的缓冲区能尽快被重用,避免高亲和性缓冲区中的数据被挤出Cache ;对于低亲和性的缓冲区采用后进先出的管理策略,使推迟低亲和性缓冲区被重用的时机,保证缓冲区中尽可能多的数据位于Cache之外。
同时,本发明还提供了一种基于亲和性感知的DMA缓冲区管理装置,包括缓冲区亲和性分析模块,缓冲区收集模块和缓冲区管理模块,其中缓冲区亲和性分析模块,用于分析系统中缓冲区亲和性的高低;高亲和性的缓冲区中的数据会大量占据Cache资源;而亲和性低的缓冲区中的数据会大量位于Cache之外;该模块将被释放缓冲区的亲和性信息传递给缓冲区收集模块;缓冲区收集模块,用于收集被标了亲和性的缓冲区;其中高亲和性和低亲和性的缓冲区被分开存放,分别保存于两个不同的链表中,便于后续分配缓冲区时能够快速定位不同亲和性的缓冲区;缓冲区收集模块将链表中是否含有对应缓冲区的信息传递给缓冲区分配模块,供后续的分配过程进行决策;缓冲区管理模块,用于给不同的I/O处理过程分配对应的缓冲区;其中,给输出过程分配亲和性较高的缓冲区,减少I/o处理过程的偏外存储访问;给输入过程分配亲和性较低的缓冲区,减少一致性维护操作的开销。本发明所述缓冲区管理模块包括低亲和性缓冲区管理单元和高亲和性缓冲区管理单元,其中输入缓冲区分配单元,用于给输入过程分配缓冲区;对于输入过程,由对应的设备驱动程序向内存管理器提出分配请求,因此所有在驱动程序中分配的DMA缓冲区可以被标识为输入缓冲区;在分配输入缓冲区时,如果LAL链表非空,直接从该链表头部获取缓冲区;否则,使用默认的分配函数获取函数;在释放输入缓冲区时,如果HAL链表非满,将缓冲区插入链表头部;否则,使用默认的函数释放缓冲区;输出缓冲区分配单元,用于给输出过程分配缓冲区;对于输出过程,在驱动程序以外的范围内申请的DMA缓冲区可以被标识为输出缓冲区;在分配输入缓冲区时,如果HAL链表非空,直接从该链表头部获取缓冲区;否则,使用默认的分配函数获取函数;在释放输入缓冲区时,如果LAL链表非满,将缓冲区插入链表尾部;否则,使用默认的函数释放缓冲区。本发明的有益效果是将亲和性的概念引入到DMA缓冲区的管理中,通过操作系统实时追踪缓冲区的亲和性,即明确缓冲区中的数据在存储层次中的分布状况。根据输入/输出过程的特征分配不同特性的缓冲区。对于输入过程,分配亲和性低的缓冲区,减少软件维护I/O数据一致性的开销;对于输出过程,分配亲和性高的缓冲区,在用户态缓冲区向内核态缓冲区拷贝数据时,使得处理器的访存能直接在Cache中命中,避免从主存中读回数据,同时由于没有数据被替换出Cache,因此也不需要将数据写回。本发明完全工作在系统软件层,直接操作系统系统提供的信息来追踪缓冲区的亲和性,既不依赖特殊的底层硬件,也不需要使用模拟器来来收集处理器的访存序列,同时避免使用LRU Stack模型引入的较大开销。


下面结合附图和实施例对本发明进一步说明。图I为基于亲和性感知的DMA缓冲区管理方法的实施方法; 图2为本发明标识缓冲区亲和性方法的示意图;图3是本发明的输出缓冲区分配的示意图;图4是本发明的输入缓冲区分配的示意图;图5是本发明的基于亲和性感知的DMA缓冲区管理装置实施例的结构示意图。
具体实施例方式现在结合附图和优选实施例对本发明作进一步详细的说明。这些附图均为简化的示意图,仅以示意方式说明本发明的基本结构,因此其仅显示与本发明有关的构成。本发明利用I/O处理过程中处理器访存和一致性维护操作的时机,追踪缓冲区的亲和性。通过修改操作系统的内存分配器,使用两个链表分别管理亲和性不同的缓冲区。对于不同的I/O处理过程,分别向对应的链表中申请缓冲区。本发明提供的基于亲和性感知的DMA缓冲区管理方法实例,其流程如图2所示,包括如下步骤110 :根据I/O处理过程中处理器访存和一致性维护操作的时机,标识最近释放的DMA缓冲区的亲和性。为了明确缓冲区的亲和性,需要知道缓冲区当中数据在存储层次中的分布。本发明基于I/o处理过程的特征来追踪缓冲区的亲和性,如图2所示。对于输入过程,由于输出过程结束前,操作系统需要在内核态和用户态缓冲区之间拷贝I/O数据。因此,最近被释放的输入缓冲区能够暂时维持较高的亲和性。对于输出过程,一旦操作系统完成一致性维护操作后,知道缓冲区被释放处理器都不会读写缓冲区中的数据,因此输出缓冲区能够维持较低的亲和性。120 :将不同的亲和性的缓冲区集中管理,以便后续的分配过程能够快速获取对应的缓冲区。本发明使用两个链表来存放被释放的缓冲区。HAL(High Affinity List)存放接收过程释放的缓冲区,LAL(Low Affinity List)存放发送过程释放的缓冲区,并且链表分别包含头指针和尾指针。130:根据不同的输入/输出过程,从对应的链表中获取不同亲和性的缓冲区。本发明分别为两个链表添加对应的分配和释放函数Alloc_in_HAL、Alloc_in_LAL、Free_to_HAL和Free_to_LAL。前两个函数负责在对应的链表中申请缓冲区,后两个函数将缓冲区插入对应链表。操作系统不能无止境地向链表中填充缓冲区,特别是在发送和接收的数据量不均衡的情况下,会占用大量的内存资源,甚至导致OS无法为应用程序分配物理内存。因此,本文对HAL和LAL的长度进行了限制,二者的最大长度均为2048。如图3 所示,表示输出过程DMA缓冲区分配和释放实例各步骤中的具体实施步骤,包括310 :分配输出缓冲区。根据HAL链表的状态判断是否能获取亲和性高的缓冲区;如果HAL不为空,直接从HAL链表的头部获取缓冲区;否则,通过系统默认的内存分配函数获取缓冲区。320 :数据拷贝。由操作系统将I/O数据从用户缓冲区拷贝至DMA缓冲区。330 :一致性维护。有操作系统进行I/O —致性维护操作,将I/O数据写回到主存,保证DMA缓冲区中的数据在存储层次中只有一个数据副本。这使得外设能够获取最近被修改的I/O数据。340 :将数据写入外设。由驱动程序触发DMA操作,DMA将缓冲区中的I/O数据搬移到外设。350 :释放输出缓冲区。根据LAL链表的状态决定缓冲区释放后所属的位置。如果释放时,LAL链表未满,缓冲区插入LAL链表的尾部;否则,调用默认的内存释放函数。当缓冲区被插入LAL链表时,在头一个字中记录输出数据的字节数(记为output_data_size)。由于这部分数据经过一致性维护操作后不会存在与Cache中,因此该缓冲区下一次作为输入缓冲区使用时,可以跳过对前output_data_size个字节的一致性维护操作。如图4所示,表示输入过程DMA缓冲区分配和释放实例各步骤中的具体实施步骤,包括410 :分配输入缓冲区。根据LAL链表的状态判断是否能获取亲和性低的缓冲区;如果LAL不为空,直接从LAL链表的头部获取缓冲区;否则,通过系统默认的内存分配函数获取缓冲区。420 :一致性维护。由操作系统进行I/O —致性维护操作,对缓冲区中的I/O数据进行Cache Invalidate操作,避免缓冲区中的数据在Cache和主存中出现不一致。430 :将数据写入主存。由驱动程序触发DMA操作,DMA将外设中的数据写入到DMA缓冲区。440:数据拷贝。处理器将DMA缓冲区中的数据拷贝到用户缓冲区。450 :释放输入缓冲区。根据HAL链表的状态决定缓冲区释放后所属的位置。如果释放时,HAL链表未满,缓冲区插入HAL链表的头部;否则,调用默认的内存释放函数。本发明通过I/O处理过程的特征,实时追踪被释放缓冲区的亲和性,无需特殊硬件或代码插桩,保证了整个优化过程的低开销。另外通过两个独立的链表管理最近被释放的缓冲区,使得被释放的缓冲区尽快被重用。例如,DMA缓冲区被释放后,缓冲区中的数据不回再被重用,即无用的数据占据了 Cache行。通过传统随机分配DMA缓冲区的方式,会使数据占据其它包含有效数据的Cache行,导致重用度高的数据被替换。通过集中管理缓冲区,被释放的缓冲区能立即在下一次I/O处理过程中被再次使用,即后续的I/O数据使用之前包含无效数据的Cache行,缓解I/O处理过程带来的Cache污染。本发明根据上述方法实施例,相应地还提供了一种基于亲和性感知的DMA缓冲区管理装置实施例,包括相互连接的缓冲区亲和性分析模块,缓冲区收集模块,缓冲区管理模块,其中缓冲区亲和性分析模块,用于分析系统中缓冲区亲和性的高低。高亲和性的缓冲区中的数据会大量占据Cache资源;而亲和性低的缓冲区中的数据会大量位于Cache之外。该模块将被释放缓冲区的亲和性信息传递给缓冲区收集模块。缓冲区收集模块,用于收集被标了亲和性的缓冲区。其中高亲和性和低亲和性的缓冲区被分开存放,分别保存于两个不同的链表中,便于后续分配缓冲区时能够快速定位不同亲和性的缓冲区。缓冲区收集模块将链表中是否含有对应缓冲区的信息传递给缓冲区分配模块,供后续的分配过程进行决策。缓冲区管理模块,用于给不同的I/O处理过程分配对应的缓冲区。其中,给输出过程分配亲和性较高的缓冲区,减少I/O处理过程的偏外存储访问;给输入过程分配亲和性较低的缓冲区,减少一致性维护操作的开销。 在上述装置实施例中,缓冲区分配模块包括输入缓冲区管理单元和输出缓冲区管理单元;其中输入缓冲区分配单元,用于给输入过程分配缓冲区。对于输入过程,由对应的设备驱动程序向内存管理器提出分配请求,因此所有在驱动程序中分配的DMA缓冲区可以被标识为输入缓冲区。在分配输入缓冲区时,如果LAL链表非空,直接从该链表头部获取缓冲区;否则,使用默认的分配函数获取函数。在释放输入缓冲区时,如果HAL链表非满,将缓冲区插入链表头部;否则,使用默认的函数释放缓冲区。输出缓冲区分配单元,用于给输出过程分配缓冲区。对于输出过程,在驱动程序以外的范围内申请的DMA缓冲区可以被标识为输出缓冲区。在分配输入缓冲区时,如果HAL链表非空,直接从该链表头部获取缓冲区;否则,使用默认的分配函数获取函数。在释放输入缓冲区时,如果LAL链表非满,将缓冲区插入链表尾部;否则,使用默认的函数释放缓冲区。以上说明书中描述的只是本发明的具体实施方式
,各种举例说明不对本发明的实质内容构成限制,所属技术领域的普通技术人员在阅读了说明书后可以对以前所述的具体实施方式
做修改或变形,而不背离发明的实质和范围。
权利要求
1.一种基于亲和性感知的DMA缓冲区管理方法,其特征在于,包括 以亲和性的高低将缓冲区分为两类,并确定不同I/O处理过程对缓冲区亲和性的需求。
2.按照权利要求I所述的缓冲区管理方法,其特征在于,还包括 使用纯软件的手段,在操作系统层来标识缓冲区的亲和性。
3.按照权利要求I或2所述的缓冲区管理方法,其特征在于以输出处理过程的特点来标识低亲和性缓冲区,具体包括 输出过程中,由于一致性维护操作后,处理器不再访问输出缓冲区,所以将最近释放的输出缓冲区记录为低亲和性。
4.按照权利要求I或2所述的缓冲区管理方法,其特征在于以输入处理过程的特点来标识高亲和性缓冲区,具体包括 当输入过程中,缓冲区释放前,处理器需要将输入缓冲区中的数据拷贝到用户缓冲区,所以将最近释放的输入缓冲区标识为高亲和性。
5.按照权利要求I或2所述的缓冲区管理方法,其特征在于将不同亲和性的缓冲区集中管理,具体包括 所有最近被释放的低亲和性缓冲区存放于低亲和性链表中,最近被释放的高亲和性缓冲区存放于高亲和性链表中。
6.按照权利要求I或2所述的缓冲区管理方法,其特征在于针对不同亲和性的缓冲区采用不同的管理策略,具体包括 对于高亲和性的缓冲区采用先进先出的管理策略,使高亲和性的缓冲区能尽快被重用,避免高亲和性缓冲区中的数据被挤出Cache ;对于低亲和性的缓冲区采用后进先出的管理策略,使推迟低亲和性缓冲区被重用的时机,保证缓冲区中尽可能多的数据位于Cache之外。
7.一种基于亲和性感知的DMA缓冲区管理装置,其特征在于包括缓冲区亲和性分析模块,缓冲区收集模块和缓冲区管理模块,其中 缓冲区亲和性分析模块,用于分析系统中缓冲区亲和性的高低;高亲和性的缓冲区中的数据会大量占据Cache资源;而亲和性低的缓冲区中的数据会大量位于Cache之外;该模块将被释放缓冲区的亲和性信息传递给缓冲区收集模块; 缓冲区收集模块,用于收集被标了亲和性的缓冲区;其中高亲和性和低亲和性的缓冲区被分开存放,分别保存于两个不同的链表中,便于后续分配缓冲区时能够快速定位不同亲和性的缓冲区;缓冲区收集模块将链表中是否含有对应缓冲区的信息传递给缓冲区分配模块,供后续的分配过程进行决策; 缓冲区管理模块,用于给不同的I/O处理过程分配对应的缓冲区;其中,给输出过程分配亲和性较高的缓冲区,减少I/O处理过程的偏外存储访问;给输入过程分配亲和性较低的缓冲区,减少一致性维护操作的开销。
8.按照权利要求7所述的内存管理装置,其特征在于所述缓冲区管理模块包括低亲和性缓冲区管理单元和高亲和性缓冲区管理单元,其中 输入缓冲区分配单元,用于给输入过程分配缓冲区;对于输入过程,由对应的设备驱动程序向内存管理器提出分配请求,因此所有在驱动程序中分配的DMA缓冲区可以被标识为输入缓冲区;在分配输入缓冲区时,如果LAL链表非空,直接从该链表头部获取缓冲区;否贝U,使用默认的分配函数获取函数;在释放输入缓冲区时,如果HAL链表非满,将缓冲区插入链表头部;否则,使用默认的函数释放缓冲区; 输出缓冲区分配单元,用于给输出过程分配缓冲区;对于输出过程,在驱动程序以外的范围内申请的DMA缓冲区可以被标识为输出缓冲区;在分配输入缓冲区时,如果HAL链表非空,直接从该链表头部获取缓冲区;否则,使用默认的分配函数获取函数;在释放输入缓冲区时,如果LAL链表非满,将缓冲区插入链表尾部;否则,使用默认的函数释放缓冲区。
全文摘要
本发明涉及一种基于亲和性感知的DMA缓冲区管理方法和装置,包括1)标识缓冲区的亲和性;2)对于输入过程,分配亲和性较低的缓冲区;由于缓冲区中大部分的数据位于Cache之外,避免部分软件一致性维护操作,其中包括物理地址计算和一致性维护指令的开销。3)对于输出过程,分配亲和性较高的缓冲区。由于缓冲区中大部分的数据在Cache中,当把I/O数据从用户态缓冲区拷贝到内核态缓冲区时,将数据直接写入Cache,避免Cache替换将原本属于应用的数据写回主存引入的开销,同时使得应用重用度高的数据尽量驻留在Cache中,减少Cache的污染问题。
文档编号G06F12/08GK102662891SQ20121007836
公开日2012年9月12日 申请日期2012年3月22日 优先权日2012年3月22日
发明者王晶, 程旭, 管雪涛, 钟祺 申请人:北京北大众志微系统科技有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1