对共享内存进行控制的方法和装置的制作方法

文档序号:7595835阅读:156来源:国知局
专利名称:对共享内存进行控制的方法和装置的制作方法
技术领域
本发明总体上涉及对网卡上的数据进行处理的技术,特别的本发明涉及网卡、计算机设备、对网卡上的共享内存进行读写操作控制的方法及对网卡进行调度的方法。
背景技术
分布式应用程序是指应用程序分布在不同计算机节点上,通过网络来共同完成一项任务(Task)。所述任务可能被分割成多个进程(Process),不同的进程可能分布于不同的计算机节点上。多个进程之间经常需要相互调用,或对相同数据执行多次读写操作。分布在不同节点的分布式应用程序的进程通常使用TCP/IP协议进行网络通信。TCP/IP是一种通用通信协议,用以在传输层/网络层上支持几乎各种应用程序的通信。当然TCP/IP协议并没有为分布式应用程序定制专门的协议架构。传统的计算机节点体系结构,为每个计算机节点上的分布式应用程序分配独立的程序缓冲区。每个分布式程序的进程独立的对所述程序缓冲区进行操作,并且通过TCP/IP网络进行数据的传输。按照传统的体系结构,数据在经网络传输前需要经过多层的封装过程,并且在经网络传输后也需要多层的解封装过程。上述封装与解封装的过程导致在整个数据传输过程中多次出现延迟,并且造成了很多不必要的系统开销。图I示出了现有技术中在两个计算机节点间进行数据通信的系统示意图。具体而言在图I所示的例子中,计算机节点A请求向计算机节点B读取一段数据。计算机节点A的体系结构中包括应用程序进程(ProcessM、语言运行库(Runtime)A,网络协议堆栈(Network Stack) A、设备驱动模块(Device Driver) A、网卡(NIC) A 和程序缓冲区(ProgramBuffer)A,所述程序缓冲区通常驻留于计算机节点的物理内存(Physical Memory)中。计算机节点A中还可以包括图I中未示出的其它装置,比如CPU。计算机节点B的体系结构与计算机节点A的体系结构一致。在步骤SI中,应用程序进程A通过专用编程接口向语言运行库A发出读数据请求;在步骤S2中,语言运行库A将所述读数据请求转换成网络数据发送请求,并交给网络协议堆栈A处理;在步骤S3中,网络协议堆栈A对数据进行TCP/IP封装后,调用设备驱动模A以启动网卡A的直接存储器存取(DMA)操作;在步骤S4中,网卡A通过DMA操作将程序缓冲区A的地址复制到网卡A上的网卡内存(Memory,图中未示出)内;在步骤S5中,网卡A将其网卡内存中的内容发送到另一计算机节点B的网卡B ;在步骤S6中,网卡B收到来自网卡A的数据请求包之后形成中断信号,并通知设备驱动模块B ;在步骤S7中,设备驱动模块B将数据请求包从网卡B的网卡内存复制到程序缓冲区B中;在步骤S8中,设备驱动模块B将数据请求包到来事件通知给网络协议堆栈B,并请求网络协议堆栈B对到来的数据请求包进行分析;在步骤S9中,网络协议堆栈B通过解析数据请求包获知其中的内容是读数据请求,并通过语言运行库B通知应用程序进程B ;在步骤SlO中,应用程序进程B读取计算机节点A所需要的数据,并构造网络应答通知,之后再调用语言运行库B以请求传输所述数据;在步骤Sll中,语言运行库B将所述网络应答通知交给网络协议堆栈B以形成网络、信息发送请求;在步骤S12中,网络协议堆栈B对数据进行TCP/IP协议封装后,调用设备驱动模块B并指明需要传输的数据所在的程序缓冲区B的地址以启动网卡B进行DMA操作;在步骤S13中,网卡B通过DMA操作将数据从程序缓冲区B中复制到网卡B上的网卡内存;在步骤S14中,网卡B将数据发送到计算机节点A的网卡A ;在步骤S15中,网卡A从网络收到数据后,形成中断信号,并通知设备驱动模块A ;在步骤S16中,设备驱动模块A将数据从网卡A的网卡内存复制到网络协议堆栈A中;在步骤S17中,设备驱动模块A将数据到来事件通知给网络协议堆栈A以请求网络协议堆栈A对到来的数据进行解析;在步骤S18中,网络协议堆栈A通过解析数据包获知其内容为读数据请求的应答信息,并通过语言运行库A通知应用程序进程A,从而使得应用程序进程A最终获得结果。

发明内容
本发明的发明人发现,在上述数据读取过程中,步骤S8、S9、S17、S18会产生较明 显的延迟。其中在步骤S8和S17中会产生操作系统的调度延迟,只有操作系统调度目标应用程序运行时,才能完成数据接收,这一延迟很难估计,一般介于I 1000毫秒之间。而在步骤S9和S18中则会产生语言运行库的调度延迟,这一延迟在最坏情况可能长达数秒。除了时间上的延迟以外,整个数据读取过程还会造成大量的网络数据包包头/包尾开销(overhead)。因为在整个数据的读取过程中,网络协议堆栈都将负责对数据进行TCP/IP封装和解封装。图2A示出了现有技术中网络上传输的数据帧的封装结构示意图。在图2A的示意图中可以看出数据在网络上传输经过了 TCP、IP、物理层三层封装过程。TCP包的包头与包尾共20字节,IP包的包头与包尾共20字节,物理层的包头和包尾共26字节。因此,经过网络协议堆栈处理后,在网络上传输的数据包如果原来的数据只有I个字节,最终形成的网络层数据帧包含67(20+20+26+1)字节。对于分布式应用程序而言,需要频繁在几个特定的计算机节点上进行共享数据的传输和同步,从而需要频繁地在多个计算节点之间进行通信,在每个计算节点上完成程序缓冲区和网卡内存进行传递。显然,对于分布式应用程序任务而言,其主要目的是使得各个计算节点上应用程序进程之间获得一致的数据视图,保证数据更新的一致性。TCP/IP协议堆栈的处理不仅是不必要的,还带来了额外的处理和存储开销。针对分布式应用程序的上述特点,本发明提出了一种在网卡上应用共享内存的技术方案。具体而言,本发明提供了一种网卡,包括共享内存,被配置为为分布式应用程序的任务提供共享的存储空间,并且所述共享内存可以被运行同一任务的多个计算节点访问,以及微控制器,被配置为对所述共享内存进行读写操作的控制。此外,本发明还提供了一种计算机设备,包括上述网卡,以及设备驱动模块,被配置为为所述网卡上的共享内存进行物理层的封装。此外,本发明还提供了一种对网卡的共享内存进行读写操作控制的方法,其中所述共享内存被配置为为分布式应用程序的任务提供共享的存储空间,并且所述共享内存可以被运行同一任务的多个计算节点上所访问,所述方法包括判断本地网卡上是否配置有支持所述读写操作的共享内存,以及在本地网卡上配置有支持所述读写操作的共享内存的情况下,对本地网卡上的共享内存进行读写操作。此外,本发明还提供了一种对网卡进行调用的方法,所述方法包括提供所述分布式应用程序的程序缓冲区,通过语言运行库上的专用接口调用语言运行库,调用设备驱动模块以进行物理层的封装,以及通过所述网卡上的专用接口对网卡的共享内存进行读写操作控制,其中所述共享内存被配置为为分布式应用程序的任务提供共享的存储空间,并且所述共享内存可以被运行同一任务的多个计算节点上所访问。采用本发明所提供的技术方案,绕过了网络协议堆栈的处理过程,而直接由语言运行库对设备驱动模块进行调用,因此可以避免图I中步骤S8、S9、S17、S18所带来的时间延迟。此外本发明中由于绕过了网络协议堆栈的处理过程,也无需对数据包进行TCP/IP封装,而仅需要进行物理层封装,以便数据包可以按照现有的物理层传输模式进行传输。大大节省了 TCP/IP层数据封装所带来的额外包头包尾开销。


本说明中所参考的附图只用于示例本发明的典型实施例,不应该认为是对本发明范围的限制。 图I示出了现有技术中在两个计算机节点间进行数据通信的系统示意图。图2A示出了现有技术中网络上传输的数据帧的封装结构示意图。图2B示出了按照本发明的一个实施例在网络上传输的数据帧的封装结构示意图。图3示出了现有技术中网卡内部结构示意图。图4A示出了按照本发明的一个实施例的网卡结构示意图。图4B示出了按照本发明的另一个实施例的网卡结构示意图。图5A示出了按照本发明的一种实施例的命令端口的字段结构示意图。图5B示出了按照本发明的一种实施例的命令端口的写操作实例结构示意图。图5C示出的按照本发明的又一个实施例的命令端口的分配操作实例结构示意图。图6示出了按照本发明的一种实施例的共享内存中分配表的结构示意图。图7A示出了按照RFC894以太网网络传输标准传输的物理层数据帧示意图。图7B示出了按照RFC1042以太网网络传输标准传输的物理层数据帧示意图。图8示出了按照本发明的一个实施例的在两个计算机节点间进行数据通信的系统示意图。图9示出了按照本发明的另一个实施例的在两个计算机节点间进行数据通信的系统不意图。图10示出了对网卡的共享内存进行读写操作控制的方法流程图。图11示出了按照本发明的一个实施例判断本地是否配置有支持读写操作的共享内存的方法流程图。图12示出了按照本发明的一个实施例对网卡进行调用的方法流程图。
具体实施例方式下列讨论中,提供大量具体的细节以帮助彻底了解本发明。然而,很显然对于本领域技术人员来说,即使没有这些具体细节,并不影响对本发明的理解。并且应该认识到,使用如下的任何具体术语仅仅是为了方便描述,因此,本发明不应当局限于只用在这样的术语所表示和/或暗示的任何特定 应用中。图3示出了现有技术中网卡内部结构示意图。现有技术中的网卡包括控制器(Control Logic)、网卡内存(NIC Memory), DMA 接口(DMAInterface)以及介质访问单兀(Medium Access Unit)。其中控制器可以被配置为可编程芯片(programmable chip)以控制DMA操作,从而实现对网卡内存的数据读写。DMA接口对外与计算机节点的总线连接以执行DMA操作。介质访问单元负责从网络接收数据帧,及向网络发送网卡内存中的数据帧。网卡内存是数据帧的临时存储单元。图4A示出了按照本发明的一个实施例的网卡结构示意图。图4A的网卡在保持现有的网卡结构不变的基础上增加了共享内存(Shared Memory)和微控制器(MicroController)。其中所述共享内存被配置为为分布式应用程序的任务提供共享的存储空间,并且所述共享内存可以被运行同一任务的多个计算节点访问。所述微控制器被配置为对所述共享内存进行读写操作的控制。进一步所述微控制器被配置为判断所述共享内存是否支持所接收到的读写请求,在判断所述共享内存支持所接收到的读写请求的情况下,对所述共享内存进行读写操作。所述微控制器可以仅由简单的现场可编程门阵列(FPGA)实现,而不一定设计成一种复杂的通用处理器。网卡的原有控制器通过特定端口与上层的设备驱动模块通信,相似的,微控制器也可以通过特定端口与上层的设备驱动模块通信。通常情况下与控制器通信的设备驱动模块和与微控制器通信的设备驱动模块为不同的设备驱动模块。按照本发明的一个实施例,网卡内存可以被配置为缓冲所述共享内存所读写的数据。按照本发明的另一个实施例所述共享内存直接与所述本机物理内存中的程序缓冲区进行读写操作而无需网卡内存进行缓冲。具体的缓冲过程将在下文中进行更加详细的描述。按照本发明的一种实施例,网卡上还包括命令端口 CMD (图中未示出),所述命令端口与所述微控制器和上层的设备驱动模块相连,并且所述命令端口被配置为向微控制器发送控制命令以实现共享内存的读写操作。进一步,网卡上还可以包括状态端口 STAT(图中未示出),所述状态端口与所述微控制器和上层的设备驱动模块相连,负责提供网卡上共享内存的数据读写操作状态结果,供设备驱动模块读取检查。命令端口与状态端口一起实现对为控制器的控制。在不同的体系结构上可采用不同的1/0原语来完成端口读写。例如,以IA32体系结构为例,假定CMD和STAT的端口地址分别为0x4A0和0x4Al,那么由驱动程序发出的如下指令可以完成端口读与MOV cmd_word, EAX #将命令字放入EAX寄存器OUT 0x4A0, EAX# 将命令字写到 CMD 端口IN EAX,0x4Al # 从 STAT 端口读入状态字按照本发明的一种实施例,在具体硬件实现中,CMD端口可以是16位或32位的寄存器,通过不同的位来控制片上存储模块的读写。图5A示出了按照本发明的一种实施例的命令端口的字段结构示意图。在图5A的实施例中CMD端口实现为32位寄存器。其包括TID字段、SIZE/KEY字段、UNIT字段、OP字段以及FLAGS字段。其中位24-31的TID字段用于指示任务识别码(TID),所述任务识别码用于指示所读写的数据属于分布式应用程序的哪个任务。一个分布式应用程序可以包含多个任务,本发明可以为每个任务都应用网卡上的共享内存进行数据的共享,也可以为一个或多个任务应用网卡上的共享内存进行数据的共享。并且对于多个计算机节点而言,既可以由一个计算机节点的网卡为所有任务提供一个公共的共享内存,也可以由不同计算机节点的网卡为不同的任务分别提供共享内存。位8-11的OP字段用来指示操作类型,如0011表示对共享内存执行数据读操作,0100表示对共享内存执行数 据写操作,0001表示对共享内存执行内存分配操作,0010表示对共享内存执行内存释放操作。其中,读操作和写操作是数据的两项基本操作。分配操作用于在数据读写操作前先要求分配一段内存空间,释放操作用于在数据读写操作后释放先前分配的内存空间。对于不同的操作类型,命令端口位16-23的SIZE/KEY字段含义可能也有所不同。如对于分配操作而言,位16-23存储的是请求共享内存分配的存储空间大小。每个经分配的共享内存存储空间都将被赋予一个键值KEY,用以标识某一段被占用的存储空间。对于写操作、读操作和释放操作而言,位16-23存储的所述键值用以表示写操作、读操作和释放操作所对应的共享内存的存储空间。命令端口位12-15的UNIT字段用来表示分配粒度。在分配操作中,由于位16_23只有8个字节,其所能表示的请求共享内存分配的存储空间的大小是很有限的。因此UNIT字段可以实现对存储空间的大小进行扩展。按照本发明的一种实施例,UNIT字段用来表示字段SIZE的倍数。比如对于分配操作而言,如果位16-23间存储的是00000001,那么当命令端口位12-15中存储的是0001时,表示请求分配的共享内存的存储空间大小为1X1 ;当命令端口位12-15中存储的是0010时,表示请求分配的共享内存的存储空间大小为1X2 ;当命令端口位12-15中存储的是0011时,表示请求分配的共享内存的存储空间大小为1X3,以此类推。按照本发明的另一种实施例,UNIT字段用来表示字段SIZE的多个倍数。例如,当位12-15中存储的是0001时,表示请求分配的共享内存的存储空间大小为1X1 ;当位12-15中存储的是0010时,表示请求分配的共享内存的存储空间大小为1X8等等,以此类推。可选的,命令端口位0-7的FLAGS字段用来表示其它控制选项,包括所分配的共享内存的存储空间是否允许修改等等。图5B示出了按照本发明的一种实施例的命令端口的写操作实例结构示意图。其中 TID 字段为 00000011,KEY 字段为 00000001,UNIT 字段为 0001,OP 字段为 0100,FLAGS字段为00000000。图4B表示对于任务识别码TID为3的任务而言,其要通过CMD端口执行向共享内存键值为I的一段存储空间写数据操作的命令端口实例。图5C示出的按照本发明的又一个实施例的命令端口的分配操作实例结构示意图。其中TID字段为00000011, SIZE字段为00001010,UNIT字段为000L0P字段为0001,FLAGS字段为00000000。图4C表示对于任务识别码为3的任务而言,其要通过CMD端口要求共享内存分配10个字节的共享内存的存储空间。CMD端口的结构设计可以根据具体应用的不同进行调整,而不限于上述列举的几种实例。STAT端口的结构设计也可以根据具体应用的不同进行调整,在本发明的一个实施例中STAT端口的结构中包含KEY字段与TID字段,用以表示某一读写命令的执行状态,比如某一读写操作是否被成功执行,或者某一读写操作是否调用了远程的计算机节点等。本发明对STAT端口的格式没有特别的限定。
图6示出了按照本发明的一种实施例的共享内存中分配表的结构示意图。为了实现对网卡内的共享内存进行有效控制,按照本发明的一种实施例,共享内存中维护一张分配表。所述分配表记录了本共享内存所支持的任务。具体而言,图6中的分配表包括TID字段、KEY字段、ADDR字段、LEN字段、以及FLAGS字段。其中TID字段记录了本共享内存所支持的任务识别码,KEY字段记录了本共享内存为该任务分配的存储空间所对应的键值,ADDR字段记录了所述键值对应的共享内存起始地址,LEN字段记录了所述键值对应的共享内存的存储空间大小,FLAGS字段记录了其它有关信息。这样微控制器通过查询所述分配表就可以得知本地的共享内存是否存在可分配空间,是否可以支持设备驱动模块所要求的读写操作。按照本发明的一个实施例,网卡上可以进一步配置有状态开关,所述状态开关指示本地网卡内是否配置有处于有效工作状态的共享内存。所述微控制器可以进一步被配置为根据所述状态开关判断本地网卡上是否配置有共享内存模块。并且所述状态开关中的状态可以被改变以表示本地网卡上的共享内存是否处于有效(enable)还是无效(disable)工作状态。进一步,如果本地网卡上配置有共享内存,则所述微控制器可以根据上述分配表中的所述任务识别码TID判断本地网卡上配置的共享内存是否支持某次读写操作。这一功能在多个计算机节点的网卡上都配备有不同的共享内存用以支持不同分布式程序任务的情况下尤其有用,微控制器可以借此判断本地网卡上配置的共享内存是否是某次读写操作所针对的共享内存。为了表明写操作是要向共享内存而非网卡内存写入数据,或为了表明读操作是要从共享内存而非网卡内存读出数据,设备驱动模块在执行物理层数据封装时为物理层数据的帧结构中写入特殊的标识符以表明所述数据是由共享内存进行存储的。在本发明的一种实施例中所述特殊的标识符被记录在所述数据的物理层包头的类型字段中。图7A示出了按照RFC894以太网网络传输标准传输的物理层数据帧示意图。图7B示出了按照RFC1042以太网网络传输标准传输的物理层数据帧示意图。两种传输标准中都包含两个字节的类型字段。设备驱动模块向共享内存写数据之前,先要设置物理层网络帧的帧类型,以标识与普通网络数据包的区别。比如通常情况下类型字段为0x0800时,表示数据帧中承载的是IP包。本发明可以通过设置类型字段为OxOOFF使共享内存存储数据包与网络数据包相区别。在本发明的其它实施例中,也可以利用物理层帧结构包头的其它字段记录所述特殊的标识符,或者对物理层帧结构进行改变以增加特殊的标识符字段。正如上文中所描述的,本发明既可以仅由多个计算机节点中的一个计算机节点的网卡为所有任务提供一个公共的共享内存,也可以由不同计算机节点的网卡为不同的任务提供不同的共享内存。在前一种实施例中,多个计算机节点仅有一个计算机节点的网卡同时配备有共享内存和微控制器,而其它计算机节点的网卡仅配备有微控制器用于实现对远程共享内存的读写操作的控制。图4B示出了按照本发明的另一个实施例的网卡结构示意图。图4B的网卡包括控制器、网卡内存、介质访问单元、DMA接口以及微控制器。与图4A所不同的是,图4B的网卡中不包含共享内存。图4B中的微控制器仅用于实现对远程的计算机节点的共享内存进行控制,而不用于控制本地的共享内存。具体细节将在下文中进行更详细的描述。下面结合计算机节点的体系结构对上述两种实施例中不同的数据流程进行详细描述。实施例1,多个计算机节点中仅有一个计算机节点配置有共享内存:以图8为例,计算机节点A的网卡A内配置有共享内存A,而计算机节点B的网卡B内没有配置有共享内存。实施例I.1,由配置有共享内存的计算机节点的应用程序进程发出读写请求:以图8为例,假设计算机节点A的应用程序进程A发出数据读写请求。
_2] 实施例I. I. I发出的读写请求为写数据请求:以图8为例,假设应用程序进程A发出写数据请求,请求将程序缓冲区A中的一段数据写入共享内存。对于应用程序而言,是否使用共享内存进行数据的存储是透明的。首先,应用程序进程A提供分布式应用程序的程序缓冲区A的地址,所述程序缓冲区A中存储着待写入共享内存的数据。并且应用程序进程A通过语言运行库A上的专用接口调用语言运行库A,以执行数据的分割。语言运行库A调用设备驱动模块A,以将数据封装成物理层的数据帧,包括封装物理层数据帧的包头和包尾。其中所述设备驱动模块A是专用于进行共享内存存储的设备驱动模块。除此以外,计算机节点A中还包括与网卡A中的控制器所对应的设备驱动模块(图中未示出),也就是传统网卡中所使用的设备驱动模块。接下来,设备驱动模块A将调用该传统设备驱动模块,从而将数据由程序缓冲区A复制到网卡A的网卡内存上(图中未示出)。作为上述实施例的一个变形,也可以由所述传统设备驱动模块执行数据的物理层封装。下面,由微控制器A根据网卡A上的状态开关判断本地网卡上是否配置有共享内存。在本实施例中,微控制器A经过判断确定本地网卡上存在共享内存。那么由于多个计算机节点中只有一个计算机节点配置有共享内存,因此上述数据写请求所执行的对象就是本地网卡上的共享内存。接下来微控制器A将数据包从网卡A上的网卡内存复制到共享内存A中。上述步骤有多种实施方式,在一种实施方式中,将数据包的包头和包尾去掉,并将其中的有效数据部分复制到共享内存A中。在另一种实施方式中,将整个数据包复制到共享内存A中。为了支持数据的共享,共享内存的存储空间通常会比较大,可能会比网卡内存的存储空间大很多。在这种情况下,如果进行大量数据的写入操作,可能无法将全部待写入数据复制进网卡内存。因此,还需要对大块数据进行拆分,从而将拆分后的数据逐份从程序缓冲区A经网卡内存写入共享内存A。在本实施例中可以看出网卡内存相当于共享内存的缓冲区。从程序缓冲区A中读出的数据都是经过网卡内存的缓冲才最终写入共享内存A的。作为本实施例的一个变形,设备驱动模块A也可以直接通过写微控制器A的命令端口将数据从程序缓冲区A中复制到共享内存A。比如,命令端口中的KEY字段可以用来描述待写入数据在程序缓冲区A的地址,这样微控制器才能够控制将所述地址下的数据从程序缓冲区A复制到共享内存A。上述方式可以实现程序缓冲区和共享内存间的直接数据交 换,但是也会带来额外的控制成本。
实施例1. I. 2发出的读写请求为读数据请求:以图8为例,假设应用程序进程A发出读数据请求,请求读取共享内存中的数据以写入程序缓冲区A中。首先应用程序进程A提供用于接收数据的程序缓冲区A的地址。并且应用程序进程A通过语言运行库A的专用接口调用语言运行库A。语言运行库A调用设备驱动模块A以将程序缓冲区A的地址封装成简单的物理层数据帧。并且设备驱动模块A调用与网卡A中的网卡内存对应的传统设备驱动模块(图中未示出),从而将程序缓冲区A的地址复制到网卡A的网卡内存上(图中未示出)。接下来微控制器A根据网卡A上的状态开关判断本地网卡上是否配置有共享内存。在本实施例中,微控制器A经过判断确定本地网卡上存在共享内存。由于多个计算机节点中只有一个计算机节点配置有共享内存,因此上述数据读请求所执行的对象就是本地网卡上的共享内存。接下来,微控制器A将数据从共享内存A复制到网卡A的网卡内存,再由网卡A的控制器根据网卡内存中存储的程序缓冲区A的地址,将数据从网卡内存复制到程序缓冲区A中。作为本实施例的一个变形,设备驱动模块A也可以通过写微控制器A的命令端口将数据从共享内存A直接复制到程序缓冲区A中。在这种方式下,命令端口的结构中应当增加程序缓冲区地址的字段,以指明数据写入的地址。实施例I.2,由未配置有共享内存的计算机节点的应用程序进程发出读写请求:以图8为例,假设计算机节点B的应用程序进程B发出数据读写请求。实施例I. 2. I发出的读写请求为写数据请求:以图8为例,假设应用程序进程B发出写数据请求,请求将程序缓冲区B中的一段数据写入共享内存A。首先,应用程序进程B提供分布式应用程序的程序缓冲区B的地址,所述程序缓冲区B中存储着待写入共享内存的数据。并且应用程序进程B通过语言运行库B上的专用接口调用语言运行库B,以执行数据的分割。语言运行库B调用设备驱动模块B,以将数据封装成物理层的数据帧。其中所述设备驱动模块B是专用于进行共享内存存储的设备驱动模块。除此以外,计算机节点B中还包括与网卡B中的控制器所对应的设备驱动模块(图中未示出),也就是传统网卡中所采用的设备驱动模块。接下来,设备驱动模块B将调用该传统设备驱动模块,从而将数据由程序缓冲区B复制到网卡B的网卡内存上(图中未示出)。作为上述实施例的一个变形,也可以由所述传统设备驱动模块执行数据的物理层封装。下面,由微控制器B根据网卡B上的状态开关判断本地网卡上是否配置有共享内存。在本实施例中,微控制器B经过判断确定本地网卡上不存在共享内存。接下来,由微控制器B调用网卡B上的控制器,从而将网卡B的网卡内存中的数据通过介质访问单元(图中未示出)发送到其他计算机节点,在本实施例中为计算机节点A。之后,计算机节点A的网卡A接收到数据并复制到共享内存A中。具体而言,网卡A接收数据后,由网卡A的控制器通过查询数据帧中的特殊的标识,比如类型字段,判断该数据是否是要被写入共享内存的数据。如果该数据要被写入共享内存,那么由微控制器A进一步根据自己网卡上的状态开关判断本地是否配置有共享内存。在本实施例中,微控制器A判断本地配置有共享内存A,由于多个计算机节点中只有一个计算机节点配置有共享内存,因此上述数据写请求所执行的对象就是网卡A上的共享内存。接下来,微控制器A将数据写入本地的共享内存A中。需要说明的是,在网络中传输的数据帧可以包含任务标识符字段TID和键值字段KEY。所述TID和KEY可以记录在图7A、7B所示的数据字段内。并且所述TID和KEY的值将被记录在共享内存的分配表中。关于分配表的结构,参见上文对图6的说明。实施例I. 2. I发出的读写请求为读数据请求:
以图8为例,假设应用程序进程B发出读数据请求,请求读取共享内存中的数据以写入程序缓冲区B中。首先,应用程序进程B提供用于接收数据的程序缓冲区B的地址。并且应用程序进程B通过语言运行库B的专用接口调用语言运行库B。之后,语言运行库B调用设备驱动模块B以将程序缓冲区B的地址封装成简单的物理层数据帧。并且设备驱动模块B调用与网卡B中的网卡内存对应的传统设备驱动模块(图中未示出),从而将程序缓冲区B的地址复制到网卡B的网卡内存上(图中未示出)。下面,微控制器B根据网卡B上的状态开关判断本地是否配置有共享内存。在本实施例中微控制器B经过判断确定本地网卡上不存在共享内存,于是设备驱动模块B通过写微控制器B的命令端口将读数据请求发送到其他计算机节点,在本实施例中为计算机节点A。接下来,网卡A中的控制器可以通过数据帧中的类型字段判断所请求的数据是否是在共享内存中存储的数据。如果是,微控制器A进一步判断本地是否配置有共享内存。如果有,微控制器A解析所述读数据请求并将共享内存A中的数据构造成物理层网络帧。之后网卡A将数据发送到计算机节点B。计算机节点B收到数据后,在网卡B的控制器的控制下,将数据复制到程序缓冲区B中,从而完成数据读操作。
_9] 实施例2,多个计算机节点上都配置共享内存以支持不同任务:以图9为例,计算机节点A的网卡A内配置有共享内存A,且计算机节点B的网卡B内配置有共享内存B。共享内存A和共享内存B支持不同的任务。下面仅对实施例2中与实施例I不同的部分进行详细描述,而对于与实施例I中各个实施例一致的部分仅做简要描述。实施例2. I,对本地共享内存发出读写请求:以图9为例,假设计算机节点A的应用程序进程A发出数据读写请求,请求对本地共享内存进行读写操作。实施例2. I. I发出的读写请求为写数据请求:以图9为例,假设应用程序进程A发出写数据请求,请求将程序缓冲区A中的一段数据写入共享内存A。首先,应用程序进程A提供分布式应用程序的程序缓冲区A的地址。并且应用程序进程A调用语言运行库A。语言运行库A又调用设备驱动模块A,以将数据封装成物理层的数据帧。然后,设备驱动模块A将调用网卡A的传统设备驱动模块(图中未示出),从而将数据由程序缓冲区A复制到网卡A的网卡内存上(图中未示出)。下面,由微控制器A根据网卡A上的状态开关判断本地网卡上是否配置有共享内存。在本实施例中,微控制器A经过判断确定本地网卡上存在共享内存。接下来,微控制器A进一步根据所述共享内存A的分配表中存储的任务识别码TID来判断本地网卡上配置的共享内存A是否支持所述写操作,也就是是否要向共享内存A中,而不是其它计算机节点的共享内存中,写入数据。具体而言,微控制器A可以通过比较分配表中的任务识别码TID和通过网卡A的命令端口获得的写命令的TID字段,来判断所述写操作是否要针对本地共享内存执行。在本实施例中,微控制器A经判断确定对本地的共享内存A执行写操作。接下来,微控制器A将数据从网卡A上的网卡内存复制到共享内存A中。实施例2. I. 2发出的读写请求为读数据请求:以图9为例,假设应用程序进程A发出读数据请求,请求读取共享内存中的数据以写入程序缓冲区A中。首先应用程序进程A提供用于接收数据的程序缓冲区A的地址。并且应用程序进 程A调用语言运行库A。然后,语言运行库A调用设备驱动模块A以将程序缓冲区A的地址封装成简单的物理层数据帧。并且设备驱动模块A调用与网卡A中的网卡内存对应的传统设备驱动模块(图中未示出),从而将程序缓冲区A的地址复制到网卡A的网卡内存上(图中未示出)。接下来,微控制器A根据网卡A上的状态开关判断本地网卡上是否配置有共享内存。在本实施例中,微控制器A经过判断确定本地网卡上存在共享内存。然后,微控制器A进一步根据所述共享内存A的分配表中存储的任务识别码TID来判断本地网卡上配置的共享内存A是否支持所述读操作,也就是是否要从共享内存A中,而不是其它计算节点上的共享内存中,读出数据。下面,微控制器A将数据从共享内存A复制到网卡A的网卡内存,再由网卡A的控制器根据网卡内存中存储的程序缓冲区A的地址,将数据从网卡内存复制到程序缓冲区A中,从而完成所述数据读操作。实施例2. 2,对远稈共享内存发出读写请求:以图9为例,假设计算机节点A的应用程序进程A发出数据读写请求,请求对远程共享内存B进行读写操作。实施例2. 2. I发出的读写请求为写数据请求:以图9为例,假设应用程序进程A发出写数据请求,请求将程序缓冲区A中的一段数据写入共享内存B。首先,应用程序进程A提供分布式应用程序的程序缓冲区A的地址,所述程序缓冲区A中存储着待写入共享内存的数据。并且应用程序进程A调用语言运行库A。然后,语言运行库A再调用设备驱动模块A,以将数据封装成物理层的数据帧。接下来,设备驱动模块A将调用网卡A中控制器所对应的传统设备驱动模块(图中未示出),从而将数据由程序缓冲区A复制到网卡A的网卡内存上(图中未示出)。下面,由微控制器A根据网卡A上的状态开关判断本地网卡上是否配置有共享内存。在本实施例中,微控制器A经过判断确定本地网卡上存在共享内存。接下来,微控制器A进一步根据所述共享内存A的分配表中存储的任务识别码TID来判断本地网卡上配置的共享内存A是否支持所述写操作,也就是是否要向共享内存A中,而不是其它计算机节点的共享内存中,写入数据。在本实施例中,应用程序进程A要向共享内存B写入数据。
于是由微控制器A调用网卡A上的控制器,从而将网卡A的网卡内存中的数据通过介质访问单元(图中未示出)发送到计算机节点B。之后,由计算机节点B的网卡B接收数据并复制到共享内存B中。具体而言,网卡B接收数据后,由网卡B的控制器通过查询数据帧中的特殊的标识,比如类型字段,判断该数据是否是要被写入共享内存的数据。如果该数据要被写入共享内存,那么由微控制器B进一步根据自己网卡上的状态开关判断本地是否配置有共享内存。在本实施例中,微控制器B判断本地配置有共享内存B。接下来,微控制器B进一步根据所述共享内存B的分配表中存储的任务识别码TID来判断本地网卡上配置的共享内存B是否支持所述写操作,也就是是否要向共享内存B中而不是其它计算机节点的共享内存中写入数据。如果所述判断结果为是,则微控制器B将数据写入本地的共享内存B中。实施例2. 2. 2发出的读写请求为读数据请求: 以图9为例,假设应用程序进程A发出读数据请求,请求读取共享内存B中的数据以写入程序缓冲区A中。首先,应用程序进程A提供用于接收数据的程序缓冲区A的地址。并且应用程序进程A调用语言运行库A。之后,语言运行库A调用设备驱动模块A以将程序缓冲区A的地址封装成简单的物理层数据帧。并且设备驱动模块A调用与网卡A中的网卡内存对应的传统设备驱动模块(图中未示出),从而将程序缓冲区A的地址复制到网卡A的网卡内存上(图中未示出)。下面,微控制器A根据网卡A上的状态开关判断本地是否配置有共享内存。在本实施例中微控制器A经过判断确定本地网卡上存在共享内存。接下来,微控制器A进一步根据所述共享内存A的分配表中存储的任务识别码TID来判断本地网卡上配置的共享内存A是否支持所述读操作,也就是是否要从共享内存A中而不是其它计算机节点的共享内存中读出数据。在本实施例中,应用程序进程A要从共享内存B读出数据。于是网卡A将数据读请求发送到网卡B。接下来,网卡B中的控制器可以根据数据帧中的类型字段判断是否是对共享内存的读写请求,即所请求的数据是否是在共享内存中存储的数据。如果是,微控制器B进一步判断本地是否配置有共享内存。如果有,微控制器B解析所述读数据请求并将共享内存B中的数据构造成物理层网络帧。之后网卡B将数据发送到计算机节点A。计算机节点A收到数据后,在网卡A的控制器的控制下,将数据复制到程序缓冲区A中,从而完成数据读操作。结合图8和图9描述的上述各种实施例仅仅示意性描述出本发明有关读写操作的一些步骤,关于内存的分配与释放等更详细的步骤由于在前文中已经进行了概括性描述,在此不再展开赘述。图10示出了对网卡的共享内存进行读写操作控制的方法流程图。在步骤1001中,判断本地是否配置有支持所述读写操作的共享内存。在步骤1003中,在本地配置有支持所述读写操作的共享内存的情况下,对本地的所述共享内存进行读写操作。进行读写操作的详细流程已经在前文中描述过了,在此不再赘述。进一步,在本地没有配置有支持所述读写操作的共享内存的情况下,请求由远程的共享内存进行所述读写操作。如果所述读写操作为写操作,则还要对对待写入的数据进行物理层的封装,并且所述请求由远程的共享内存进行所述读写操作的步骤进一步包括将封装后的待写入的数据向远程的共享内存发送。如果所述读写操作为读操作,则对待读出的数据所要写入的程序缓冲区的程序缓冲区地址进行物理层的封装以作为向远程发送的读数据请求的一部分,并且所述请求由远程的共享内存进行所述读写操作的步骤进一步包括将所述封装后的读数据请求向远程的共享内存发送。关于上述操作的详细流程已经在前文中描述过了,在此不再赘述。图11示出了按照本发明的一个实施例判断本地是否配置有支持读写操作的共享内存的方法流程图。首先,在步骤1101中根据网卡上的状态开关判断本地网卡上是否配置有共享内存,然后在步骤1103中,如果本地网卡上配置有共享内存,则进一步根据所述共享内存上存储的任务识别码判断本地网卡上配置的共享内存是否支持所述读写操作。上述两个判断步骤的更详细说明已经在前文描述过了,在此不再赘述。图12示出了按照本发明的一个实施例对网卡进行调用的方法流程图。在步骤1201中,提供所述分布式应用程序的程序缓冲区;在步骤1203中,通过语言运行库上的专 用接口调用语言运行库;在步骤1205中,调用设备驱动模块以进行物理层的封装;在步骤1207中,通过上述方法对网卡的共享内存进行读写操作控制。上述多个步骤的更详细说明已经在前文描述过了,在此不再赘述。所属技术领域的技术人员知道,除明确说明以外,本发明可以体现为系统、方法或计算机程序产品。因此,除明确说明以外,本发明可以具体实现为以下形式,即,可以是完全的硬件、完全的软件(包括固件、驻留软件、微代码等)、或者本文一般称为“电路”、“模块”或“系统”的软件部分与硬件部分的组合。此外,本发明还可以采取体现在任何有形的表达介质(medium of expression)中的计算机程序产品的形式,该介质中包含计算机可用的程序码。可以使用一个或多个计算机可用的或计算机可读的介质的任何组合。计算机可用的或计算机可读的介质例如可以是——但不限于——电的、磁的、光的、电磁的、红外线的、或半导体的系统、装置、器件或传播介质。计算机可读介质的更具体的例子(非穷举的列表)包括以下有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、诸如支持因特网或内部网的传输介质、或者磁存储器件。注意计算机可用的或计算机可读的介质甚至可以是上面印有程序的纸张或者其它合适的介质,这是因为,例如可以通过电扫描这种纸张或其它介质,以电子方式获得程序,然后以适当的方式加以编译、解释或处理,并且必要的话在计算机存储器中存储。在本文件的语境中,计算机可用的或计算机可读的介质可以是任何含有、存储、传达、传播、或传输供指令执行系统、装置或器件使用的或与指令执行系统、装置或器件相联系的程序的介质。计算机可用的介质可包括在基带中或者作为载波一部分传播的、由其体现计算机可用的程序码的数据信号。计算机可用的程序码可以用任何适当的介质传输,包括-但不限于-无线、电线、光缆、RF等等。用于执行本发明的操作的计算机程序码,可以以一种或多种程序设计语言的任何组合来编写,所述程序设计语言包括面向对象的程序设计语言-诸如Java、Smalltalk、C++之类,还包括常规的过程式程序设计语言-诸如”C”程序设计语言或类似的程序设计语言。程序码可以完全地在用户的计算上执行、部分地在用户的计算机上执行、作为一个独立的软件包执行、部分在用户的计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在后一种情形中,远程计算机可以通过任何种类的网络一包括局域网(LAN)或广域网(WAN)-连接到用户的计算机,或者,可以(例如利用因特网服务提供商来通过因特网)连接到外部计算机。以下参照按照本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述本发明。要明白的是,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得通过计算机或其它可编程数据处理装置执行的这些指令,产生实现流程图和/或框图中的方框中规定的功能/操作的装置。也可以把这些计算机程序指令存储在能指令计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令产生一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instruction means)的制造品。也可以把计算机程序指令加载到计算机或其它可编程数据处理装置上,使得在计算机或其它可编程数据处理装置上执行一系列操作步骤,以产生计算机实现的过程,从而在计算机或其它可编程装置上执行的指令就提供实现流程图和/或框图中的方框中规定的功能/操作的过程。附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。本文中所用的术语,仅仅是为了描述特定的实施例,而不意图限定本发明。本文中所用的单数形式的“一”和“该”,旨在也包括复数形式,除非上下文中明确地另外指出。还要知道,“包含”一词在本说明书中使用时,说明存在所指出的特征、整体、步骤、操作、单元和/或组件,但是并不排除存在或增加一个或多个其它特征、整体、步骤、操作、单元和/或组件,以及/或者它们的组合。
权利要求中的对应结构、材料、操作以及所有功能性限定的装置(means)或步骤的等同替换,旨在包括任何用于与在权利要求中具体指出的其它单元相组合地执行该功能的结构、材料或操作。所给出的对本发明的描述其目的在于示意和描述,并非是穷尽性的,也并非是要把本发明限定到所表述的形式。对于所属技术领域的普通技术人员来说,在不偏离本发明范围和精神的情况下,显然可以作出许多修改和变型。对实施例的选择和说明,是为了最好地解释本发明的原理和实际应用,使所属技术领域的普通技术人员能够明了,本发明可以有适合所要的特定用途的具有各种改变的各种实施方式。
权利要求
1.一种网卡,包括 共享内存,被配置为为分布式应用程序的任务提供共享的存储空间,并且所述共享内存可以被运行同一任务的多个计算节点访问,以及 微控制器,被配置为对所述共享内存进行读写操作的控制。
2.一种如权利要求I所述的网卡,其中所述微控制器进ー步被配置为 判断所述共享内存是否支持所接收到的读写请求,以及 在所述共享内存支持所接收到的读写请求的情况下,对所述共享内存进行读写操作。
3.一种如权利要求I或2所述的网卡,包括 命令端ロ,其中所述命令端ロ与所述微控制器相连,并且所述命令端ロ被配置为向微控制器发送控制命令。
4.一种如权利要求3所述的网卡,其中所述控制命令包含字段用于控制所述共享内存进行下列各项操作之一读操作、写操作、分配操作、释放操作。
5.一种如权利要求I或2所述的网卡,进一歩包括 状态开关,并且 所述微控制器进ー步被配置为根据所述状态开关判断所述网卡上是否配置有共享内存。
6.一种如权利要求5所述的网卡,其中所述共享内存中存储有任务识别码,并且 如果所述网卡上配置有共享内存,则所述微控制器进ー步被配置为根据所述任务识别码判断所述共享内存是否支持所接收到的读写请求。
7.—种如权利要求I或2所述的网卡,其中所述共享内存中存储的数据的帧结构中包含标识符以表明所述数据是由所述共享内存存储的。
8.—种如权利要求7所述的网卡,其中所述特殊的标识符被记录在所述数据的物理层包头的类型字段中。
9.一种如权利要求I或2所述的网卡,进一歩包括 网卡内存,被配置为缓冲所述共享内存所读写的数据。
10.一种如权利要求I或2所述的网卡,其中所述共享内存进一歩被配置为直接与所述网卡外部的程序缓冲区进行读写操作。
11.一种计算机设备,包括如权利要求1-10所述的网卡。
12.—种对网卡的共享内存进行读写操作控制的方法,其中所述共享内存被配置为为分布式应用程序的任务提供共享的存储空间,并且所述共享内存可以被运行同一任务的多个计算节点所访问,所述方法包括 判断本地网卡上是否配置有支持所述读写操作的共享内存,以及 在本地网卡上配置有支持所述读写操作的共享内存的情况下,对本地网卡上的共享内存进行读写操作。
13.—种如权利要求12所述的方法,其中判断本地网卡上是否配置有支持所述读写操作的共享内存的步骤包括 根据网卡上的状态开关判断本地网卡上是否配置有共享内存。
14.一种如权利要求13所述的方法,其中判断本地网卡上是否配置有支持所述读写操作的共享内存的步骤进一歩包括如果本地网卡上配置有共享内存,则进一歩根据所述本地网卡上的共享内存上存储的任务识别码判断本地网卡上配置的共享内存是否支持所述读写操作。
15.一种如权利要求12所述的方法,进ー步包括 在本地网卡上没有配置有支持所述读写操作的共享内存的情况下,请求由远程网卡上的共享内存进行所述读写操作。
16.一种如权利要求15所述的方法,如果所述读写操作为写操作,则所述请求由远程网卡上的共享内存进行所述读写操作的步骤进一歩包括 将待写入的数据向远程网卡上的共享内存发送。
17.—种如权利要求15所述的方法,如果所述读写操作为读操作,则所述请求由远程网卡上的共享内存进行所述读写操作的步骤进一歩包括 将读数据请求向远程网卡上的共享内存发送。
18.一种如权利要求12所述的方法,其中所述网卡进ー步包括网卡内存,并且其中对本地网卡上的共享内存进行读写操作的步骤进一歩包括 经由所述本地网卡的内存的缓冲对本地网卡上的共享内存进行读写操作。
19.一种如权利要求12所述的方法,其中对本地网卡上的共享内存进行读写操作的步骤进一歩包括 直接在所述本地网卡上的共享内存与本地网卡外部的程序缓冲区间进行所述读写操作。
20.一种如权利要求12所述的方法,进ー步包括 如果所述读写操作为写操作,则对待写入的数据进行物理层的封装。
21.一种如权利要求12所述的方法,进ー步包括 如果所述读写操作为读操作,则对待读出的数据所要写入的程序缓冲区的程序缓冲区地址进行物理层的封装。
22.—种对网卡进行调用的方法,所述方法包括 提供所述分布式应用程序的程序缓冲区, 通过语言运行库上的专用接ロ调用语言运行库, 调用设备驱动模块以进行物理层的封装,以及 通过权利要求12-21所述的方法对网卡的共享内存进行读写操作控制。
全文摘要
针对分布式应用程序的特点,本发明提出了一种在网卡上应用共享内存的技术方案。具体而言,本发明提供了一种网卡,包括共享内存,被配置为为分布式应用程序的任务提供共享的存储空间,并且所述共享内存可以被运行同一任务的多个计算节点访问,以及微控制器,被配置为对所述共享内存进行读写操作的控制。此外本发明还提供了一种包括上述网卡的计算机设备,一种对网卡的共享内存进行读写操作控制的方法,和一种对网卡进行调用的方法。采用本发明所提供的技术方案,绕过了网络协议堆栈的处理过程,避免了网络协议堆栈所带来的时间延迟,本发明无需对数据包进行TCP/IP封装,大大节省了TCP/IP层数据封装所带来的额外包头包尾开销。
文档编号H04L12/02GK102651690SQ20111004798
公开日2012年8月29日 申请日期2011年2月28日 优先权日2011年2月28日
发明者李严, 滕启明, 王华勇, 陈滢 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1