CN111176855A - 在用户空间中建立线程之间的队列 - Google Patents

在用户空间中建立线程之间的队列 Download PDF

Info

Publication number
CN111176855A
CN111176855A CN201811330977.4A CN201811330977A CN111176855A CN 111176855 A CN111176855 A CN 111176855A CN 201811330977 A CN201811330977 A CN 201811330977A CN 111176855 A CN111176855 A CN 111176855A
Authority
CN
China
Prior art keywords
thread
queue
application
establishing
receiving
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201811330977.4A
Other languages
English (en)
Other versions
CN111176855B (zh
Inventor
李博杰
崔天一
王子博
白巍
张霖涛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Priority to CN201811330977.4A priority Critical patent/CN111176855B/zh
Priority to PCT/US2019/059294 priority patent/WO2020096870A1/en
Priority to US17/289,368 priority patent/US11880725B2/en
Priority to EP19809282.7A priority patent/EP3857376A1/en
Publication of CN111176855A publication Critical patent/CN111176855A/zh
Application granted granted Critical
Publication of CN111176855B publication Critical patent/CN111176855B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/546Message passing systems or structures, e.g. queues
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/466Transaction processing
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/30Definitions, standards or architectural aspects of layered protocol stacks
    • H04L69/32Architecture of open systems interconnection [OSI] 7-layer type protocol stacks, e.g. the interfaces between the data link level and the physical level
    • H04L69/321Interlayer communication protocols or service data unit [SDU] definitions; Interfaces between layers
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/30Definitions, standards or architectural aspects of layered protocol stacks
    • H04L69/32Architecture of open systems interconnection [OSI] 7-layer type protocol stacks, e.g. the interfaces between the data link level and the physical level
    • H04L69/322Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions
    • H04L69/326Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions in the transport layer [OSI layer 4]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/54Indexing scheme relating to G06F9/54
    • G06F2209/548Queue
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/16Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
    • H04L69/161Implementation details of TCP/IP or UDP/IP stack architecture; Specification of modified or new header fields
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L69/00Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
    • H04L69/16Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP]
    • H04L69/168Implementation or adaptation of Internet protocol [IP], of transmission control protocol [TCP] or of user datagram protocol [UDP] specially adapted for link layer protocols, e.g. asynchronous transfer mode [ATM], synchronous optical network [SONET] or point-to-point protocol [PPP]

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Computer And Data Communications (AREA)

Abstract

在本公开的实施例中,提出了在用户空间中建立线程之间的队列的方案。在第一应用上创建第一线程并且在第二应用上创建第二线程和第三线程之后,在操作系统的用户空间中建立第一应用与第二应用之间的套接字连接。然后,在第一线程和第二线程之间建立第一队列,并且在第一线程和第三线程之间建立不同的第二队列。本公开的实施例通过针对每对线程分别建立单独的队列,能够避免使用锁共享同一队列的情形。因此,根据本公开的实施例的无锁队列机制能够显著提升操作系统的性能。

Description

在用户空间中建立线程之间的队列
背景技术
套接字(socket)是指运行在网络中的两个应用之间的双向通信连接的一个端点,其是支持TCP/IP(传输控制协议/因特网协议)的网络通信的基本操作单元。套接字构成一种抽象层,应用通过套接字来发送和接收数据。套接字通常使用IP地址和端口号来进行表示,发送应用将数据发送给套接字,再通过网络驱动交给另一套接字,进而发送给接收应用。套接字是现代操作系统中最广泛使用的通信原语,其能够实现进程、线程以及主机之间的通信。
操作系统的核心是内核(kernel),其独立于普通的应用程序,可以访问受保护的存储器空间,其还具有访问底层硬件设备的权限。为了保证内核的安全,操作系统通常都强制用户进程不能直接操作内核,具体的实现方式基本都是由操作系统将虚拟地址空间划分为两个部分,一部分为内核空间,另一部分为用户空间。内核空间仅由内核使用,而用户空间可以由各个进程使用。
操作系统通常在内核空间中实现套接字连接,并设置需要并发保护的共享数据结构。套接字通常有以下三方面的功能:寻址、定位和连接到另一应用;提供由文件描述符(FD)标识的可靠且有序的通信信道;复用来自多个信道的事件,操作系统可以通知应用哪个或哪些FD准备好接收或发送,然后应用可以准备缓冲器并且发出接收或发送操作。
发明内容
在本公开的实施例中,提出了在用户空间中建立线程之间的队列的方案。在第一应用上创建第一线程并且在第二应用上创建第二线程和第三线程之后,在操作系统的用户空间中建立第一应用与第二应用之间的套接字连接。然后,在第一线程和第二线程之间建立第一队列,并且在第一线程和第三线程之间建立不同的第二队列。本公开的实施例通过针对每对线程分别建立单独的队列,能够避免使用锁共享同一队列的情形。因此,根据本公开的实施例的无锁队列机制能够显著提升操作系统的性能。
提供发明内容部分是为了以简化的形式来介绍对概念的选择,它们在下文的具体实施方式中将被进一步描述。发明内容部分无意标识本公开的关键特征或主要特征,也无意限制本公开的范围。
附图说明
结合附图并参考以下详细说明,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。在附图中,相同或相似的附图标记表示相同或相似的元素,其中:
图1示出了其中可以实施本公开的一个或多个实施例的计算设备/服务器的框图;
图2示出了其中可以实施本公开的用于在用户空间中建立点对点套接字连接的方法的流程图;
图3示出了根据本公开的实施例的在单个计算设备内实现套接字连接的架构的示意图;
图4示出了根据本公开的实施例的在不同计算设备之间实现套接字连接的方法的流程图;
图5示出了根据本公开的实施例的在不同计算设备之间实现套接字连接的架构的示意图;
图6A示出了根据本公开的实施例的用于建立套接字连接的状态机的示意图;
图6B示出了根据本公开的实施例的用于关闭套接字连接的状态机的示意图;
图7示出了根据本公开的实施例的用于在用户空间中建立线程之间的队列的方法的流程图;
图8A示出了根据本公开的实施例的用于在单个发送线程与多个接收线程之间建立队列的架构的示意图;
图8B示出了根据本公开的实施例的用于在多个发送线程与单个接收线程之间建立队列的架构的示意图;
图8C示出了根据本公开的实施例的用于在多个发送线程与多个接收线程之间建立队列的架构的示意图;
图9A-9B示出了根据本公开的实施例的用于切换接收线程进行接管的架构的示意图;
图10示出了根据本公开的实施例的用于系统调用(fork)操作的架构的示意图;
图11示出了根据本公开的实施例的用于使用单个队列来复用多个连接的架构的示意图;以及
图12示出了根据本公开的实施例的用于在线程之间建立紧急队列的架构的示意图。
具体实施方式
下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反,提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
传统地,操作系统通常在内核空间中实现套接字,由于复杂的网络栈结构,内核空间套接字通常非常缓慢,进而导致过多的开销。例如,通信密集型应用(诸如分布式键值存储和网络服务器)会在操作系统的内核空间中花费绝大多数CPU时间,其主要是处理套接字操作。由此可见,传统的内核空间套接字连接会造成较大的时间开销,降低了操作系统的性能。此外,传统的套接字队列是一个FIFO的通道,然而,一个套接字可能由多个发送线程和接收线程共享,因而传统的技术使用锁来保护共享队列,造成操作系统的性能较低。
为此,本公开的实施例提出了一种在用户空间中建立线程之间的队列的方法、设备以及计算机程序产品。本公开的实施例通过针对每对线程分别建立单独的队列,能够避免使用锁共享同一队列的情形。因此,根据本公开的实施例的无锁队列机制能够显著提升操作系统的性能。
此外,在本公开的一些实施例中,可以将每对线程之间的多个连接合并到同一队列中,由此减少队列所占用的缓冲大小。因此,根据本公开的实施例的用户空间套接字架构可以扩展到多个并发连接和多个线程,并且提升操作系统的性能。另外,本公开的实施例在执行fork操作时针对每对线程设置新的队列,而不是复用先前的队列,这避免了不同线程使用同一队列时的加锁控制,因此,本公开的实施例能够实现与操作系统fork操作的完全兼容。
以下参考图1至图12来说明本公开的基本原理和若干示例实现方式。图1示出了其中可以实施本公开的一个或多个实施例的计算设备/服务器100的框图。应当理解,图1所示出的计算设备/服务器100仅仅是示例性的,而不应当构成对本文所描述的实施例的功能和范围的任何限制。
如图1所示,计算设备/服务器100是通用计算设备的形式。计算设备/服务器100的组件可以包括但不限于一个或多个处理器或处理单元110、存储器120、存储设备130、一个或多个通信单元140、一个或多个输入设备150以及一个或多个输出设备160。处理单元110可以是实际或虚拟处理器并且能够根据存储器120中存储的程序来执行各种处理。在多处理器系统中,多个处理单元并行执行计算机可执行指令,以提高计算设备/服务器100的并行处理能力。
计算设备/服务器100通常包括多个计算机存储介质。这样的介质可以是计算设备/服务器100可访问的任何可以获得的介质,包括但不限于易失性和非易失性介质、可拆卸和不可拆卸介质。存储器120可以是易失性存储器(例如寄存器、高速缓存、随机访问存储器(RAM))、非易失性存储器(例如,只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、闪存)或它们的某种组合。存储设备130可以是可拆卸或不可拆卸的介质,并且可以包括机器可读介质,诸如闪存驱动、磁盘或者任何其他介质,其可以能够用于存储信息和/或数据(例如用于训练的训练数据)并且可以在计算设备/服务器100内被访问。
计算设备/服务器100可以进一步包括另外的可拆卸/不可拆卸、易失性/非易失性存储介质。尽管未在图1中示出,可以提供用于从可拆卸、非易失性磁盘(例如“软盘”)进行读取或写入的磁盘驱动和用于从可拆卸、非易失性光盘进行读取或写入的光盘驱动。在这些情况中,每个驱动可以由一个或多个数据介质接口被连接至总线(未示出)。存储器120可以包括计算机程序产品125,其具有一个或多个程序模块,这些程序模块被配置为执行本公开的各种实施例的方法或动作。
通信单元140实现通过通信介质与其他计算设备进行通信。附加地,计算设备/服务器100的组件的功能可以以单个计算集群或多个计算机器来实现,这些计算机器能够通过通信连接进行通信。因此,计算设备/服务器100可以使用与一个或多个其他服务器、网络个人计算机(PC)或者另一个网络节点的逻辑连接来在联网环境中进行操作。
输入设备150可以是一个或多个输入设备,例如鼠标、键盘、追踪球等。输出设备160可以是一个或多个输出设备,例如显示器、扬声器、打印机等。计算设备/服务器100还可以根据需要通过通信单元140与一个或多个外部设备(未示出)进行通信,外部设备诸如存储设备、显示设备等,与一个或多个使得用户与计算设备/服务器100交互的设备进行通信,或者与使得计算设备/服务器100与一个或多个其他计算设备通信的任何设备(例如,网卡、调制解调器等)进行通信。这样的通信可以经由输入/输出(I/O)接口(未示出)来执行。
本公开的实施例能够在计算设备/服务器100的操作系统的用户空间中实现点对点(peer to peer)的套接字通信,以下参考图2-图12详细描述了如何在操作系统的用户空间中实现点对点套接字通信的示例实施例。
图2示出了其中可以实施本公开的用于在用户空间中建立点对点套接字连接的方法200的流程图。应当理解,方法200可以由参考图1所描述的计算设备/服务器100来执行。为了便于清楚说明图2的方法200,同时参考图3所示出的架构300的示例一起进行描述,其中
图3示出了根据本公开的实施例的在单个计算设备内实现套接字连接的架构300的示意图。
在202,从第一应用接收用于建立套接字连接的请求。例如,在参考图3所描述的架构300中,计算设备310(也称为“主机”)上运行有应用311(称为“第一应用”)、应用312(称为“第二应用”)、以及用于协调应用之间的连接建立和资源分配的监视器313(也可称为“控制器”、“控制模块”等),其中计算设备310可以为以上参考图1所描述的计算设备/服务器100。监视器313是用于协调控制层操作(诸如连接建立和资源分配)的后台程序,其在操作系统初始化阶段被启动。在每个计算设备中,每个应用与本地监视器建立一个队列,以形式控制层。在一些实施例中,为了实现低延迟和高吞吐量,队列例如可以为共享存储器(简称为“shm”)队列。
如图3所示,可以在应用311与监视器313之间建立共享存储器队列315,可以在应用312与监视器313之间建立共享存储器队列316。在应用311需要建立套接字连接的情况下,监视器313可以经由共享存储器队列315从应用311接收用于建立套接字连接的请求。在本公开的一些实施例中,每个计算设备通常设置一个监视器,每个应用可以通过设置LD_PRELOAD环境变量来加载用户空间库LIBSD,LIBSD截获与文件描述符操作有关的所有API,从而使得在用户空间实现套接字API,而向内核空间转发其他API。每个应用在初始化阶段连接到本地的监视器,应当理解,控制操作需要通过监视器,而数据操作通过点对点连接。
返回图2,在204,向第二应用发送请求,其中第一应用和第二应用运行在相同的计算设备上。继续参考图3,在监视器313从应用311接收到用于建立套接字连接的请求之后,监视器313执行IP地址转换,并且经由共享存储器队列316向应用312转发套接字连接请求。由于第一应用和第二用户是位于同一个计算设备(即单机),因此,本公开的实施例能够实现单个计算设备310内的不同应用(应用311和用于312)之间的套接字连接。
在206,在计算设备的操作系统的用户空间中建立第一应用与第二应用之间的点对点套接字连接。继续参考图3,监视器313协助建立应用311与应用312之间的点对点的用户空间套接字连接,并且建立点对点的共享存储器队列317。在一些实施例中,监视器313可以为应用311和应用312分配共享存储器,并且向应用311和应用312发送用于共享存储器的密钥,然后,应用311与应用312可以建立点对点的用户空间套接字连接。
因此,本公开的实施例通过在操作系统的用户空间中建立套接字连接,能够实现单个计算设备内的不同应用之间的用户空间套接字连接,从而提高操作系统的性能。此外,本公开的实施例使用监视器(或控制器)来协调应用之间的连接建立和资源分配,因而能够保证操作系统的安全性。
此外,在本公开的一些实施例中,监视器用于协调应用之间的控制层操作,而点对点套接字连接用于应用之间的数据层操作。以这种方式,监视器仅用于协调应用之间的连接建立和资源分配,而在应用之间的点对点的套接字连接可以用于直接数据通信(诸如发送、接收和事件轮询),而无需监视器的参与,这不仅能够保证操作系统的安全性,还能够提升操作系统的性能。
图4示出了根据本公开的实施例的在不同计算设备之间实现套接字连接的方法400的流程图。应当理解,方法400可以由参考图1所描述的计算设备/服务器100来执行。为了便于清楚说明图4的方法400,同时参考图5所示出的架构500的示例一起进行描述,其中图5示出了根据本公开的实施例的在不同计算设备之间实现套接字连接的架构500的示意图。
在402,检测远程设备上的远程应用是否支持本公开的用户空间套接字(也称为“SocketDirect”)。例如,参考图5,当计算设备310需要与远程设备320、330和/或340进行套接字通信时,需要检测远程设备320、330和/或340是否支持用户空间套接字。如图5所示,远程设备320、330和340各自运行有应用321、331和341。此外,远程设备320具有监视器323,说明其支持用户空间套接字,其中应用321已经与监视器323建立共享存储器队列325;而远程设备330和340中不存在监视器,说明它们不支持用户空间套接字。
在一些实施例中,如果本地的监视器为客户端监视器,则可以首先开启原始套接字,并向远程设备发送具有特定选项的TCP SYN消息,然后,检测是否从远程设备接收具有特定选项的TCP SYN+ACK消息。如果从远程设备接收具有特定选项的TCP SYN+ACK消息,则说明远程设备支持用户空间套接字;如果从远程设备接收到的TCP SYN+ACK消息不具有特定选项,则说明远程设备不支持用户空间套接字。
在一些实施例,如果本地的监视器为服务器监视器,则可以开启原始套接字以从侦听端口捕获SYN消息,并且检测是否从远程设备接收具有特定选项的TCP SYN消息。如果从远程设备接收的TCP SYN消息具有特定选项,则说明远程设备支持用户空间套接字,反之,说明远程设备不支持用户空间套接字。在从远程设备接收到具有特定选项的TCP SYN消息的情况下,本地设备可以向远程设备发送具有特定选项的TCP SYN+ACK消息,并且开始用户空间套接字的建立过程。在一些实施例中,也可以安装防火墙规则来管理传入的SYN和出去的RST。
返回图4,在404,基于上述检测判断远程应用是否支持用户空间套接字。例如,本地监视器基于对远程设备的检测,判断远程应用是否支持用户空间套接字。如果在404确定远程应用支持用户空间套接字,则在406建立本地监视器与远程监视器之间的RDMA连接,并在408建立本地应用与远程应用之间的RDMA连接。例如,参考图5,监视器313检测到远程设备320支持用户空间套接字,则监视器313首先与监视器323建立RDMA队列326,然后,监视器313和监视器323辅助建立应用311与应用321之间的RDMA队列327。在RDMA队列327被建立之后,应用311与应用321之间可以直接进行点对点的远程数据传输。在一些实施例中,在RDMA队列327的建立期间,可以使用监视器313和监视器323来代理应用311与应用321之间的数据传输。也就是说,如果客户端应用和服务器应用还没有建立连接,则可以使用监视器来帮助客户端应用和服务器应用建立直接连接。服务器应用可以向客户端用于发送包括FD映射的响应,在发送响应之后服务器应用能够立即开始发送数据。相应地,客户端应用在从服务器应用接收到响应之后,能够开始发送数据。
如果在404确定远程应用不支持用户空间套接字,则退回到内核套接字通信,监视器使用TCP恢复功能来创建内核TCP连接,然后在410判断本地应用能否与本地监视器共享网络命名空间。本公开的实施例提供了与传统的操作系统进行套接字通信的方法,由此保证网络通信的兼容性。
如果在410确定本地应用能够与本地监视器共享网络命名空间,则向本地应用发送已恢复的TCP连接,并且在412建立本地应用与远程应用之间的内核TCP连接。例如,参考图5,应用312能够与监视器313共享网络命名空间,则在应用312与应用331之间可以建立直接的TCP/IP队列335。如果在410确定本地应用不能与本地监视器共享网络命名空间,则在414建立本地监视器与远程应用之间的内核TCP连接。例如,参考图5,应用311不能与监视器313共享网络命名空间,则需要在监视器313与应用341之间建立TCP/IP队列345,然后,由监视器313来代理应用311与应用341之间的套接字通信。
因此,根据本公开的实施例的方法400和架构500,在远程设备支持用户空间套接字的情况下,可以在本地应用与远程应用之间建立RDMA连接,从而提高数据传输速度;而在远程设备不支持用户空间套接字的情况下,本公开的实施例也能够与远程设备进行兼容,由此保证网络通信的兼容性。以这种方式,本公开的一些实施例不仅能够支持单个设备内的套接字通信,也能够实现设备之间的套接字通信。
图6A示出了根据本公开的实施例的用于建立套接字连接的状态机的示意图600,每个进程可以在本地维护连接状态机。应当理解,可以通过以上所描述的监视器来辅助建立客户端应用与服务器应用之间的点对点套接字连接。
在602,客户端应用和服务器应用均处于已关闭连接状态。在创建套接字期间,应用首先创建由整数FD来标识的套接字。套接字FD和其他FD(诸如磁盘文件)共享命名空间,操作系统通常分配最低的可用FD。为了保留该语义,同时不在内核中分配虚拟FD,LIBSD拦截所有与FD相关的API并维护FD转换表以将每个应用FD映射到用户空间套接字FD或内核FD。当关闭FD时,LIBSD将其放入FD回收池。在分配FD时,LIBSD首先尝试从回收池获得FD。如果回收池为空,则通过递增FD分配计数器来分配新的FD。FD回收池和分配计数器在进程中的所有线程之间被共享。
服务器应用在603调用bind()函数,然后在604向监视器发送绑定请求并且从监视器接收绑定响应,监视器还建立物理网络与覆盖网络(overlay network)之间的地址转换规则,服务器应用此时处于已绑定状态。绑定操作用于分配地址和端口,由于地址和端口是具有许可保护的全局资源,因而可以通过监视器来协调该分配。如果绑定请求没有失败(例如端口没有被其他客户端侧套接字绑定),则LSBD可以直接返回成功。
接下来,服务器应用在605调用listen()函数,并且在606向监视器发送侦听消息,服务器应用此时处于在侦听状态。在服务器应用准备好接受来自客户端的连接的情况下,其调用listen()函数并且通知监视器,而监视器维护每个地址和端口上的侦听的列表以调度新的连接。服务器应用在607调用accept()函数,并且在608处于等待客户端响应状态。
客户端应用在609调用connect()函数,并且在610经由共享存储器队列向监视器发送SYN消息,客户端应用此时处于等待调度状态。客户端应用在611从监视器接收“已调度”消息之后,然后在612建立共享存储器或RDMA队列,客户端应用此时处于等待服务器响应状态。监视器将IP地址和端口进行转换以用于覆盖网络,然后将SYN消息转发到目标应用。
服务器应用在613从监视器接收到来自客户端应用的SYN消息,然后建立共享存储器或RDMA队列以及FD映射,并且向客户端应用发送ACK消息。客户端应用在615从服务器应用接收到ACK消息之后,在616建立FD映射,此时,在客户端应用与服务器应用之间已经建立连接,客户端应用和服务器应用分别处于已建立连接状态,并且能够互相发送数据。
图6B示出了根据本公开的实施例的用于关闭套接字连接的状态机的示意图660。应当理解,关闭套接字连接的过程是完全点对点的,并且可以不需要监视器的参与。在662,客户端应用和服务器应用均处于已建立连接状态。如果两个应用中的任意一个应用(称为第一个应用)在663发起关闭写入(SHUT-WR)或者接收到完成读取(FIN-RD)消息,则在664向另一个应用(称为第二个应用)发送完成写入(FIN-WR)消息,此时,第一个应用处于完成(FIN)等待状态。接下来,第一个应用可以在665发起关闭读取(SHUT-RD)或者接收FIN-WR消息,并且在666向第二个应用发送FIN-RD消息。至此,套接字通信的两个通信方向均已关闭。
同样地,如果两个应用中的任意一个应用(称为第一个应用)在667发起关闭读取(SHUT-RD)或者接收到FIN-WR消息,则在668向另一个应用(称为第二个应用)发送FIN-RD消息,此时,第一个应用处理完成FIN等待状态。接下来,第一个应用可以在669发起关闭写入(SHUT-WR)或者接收FIN-RD消息,并且在670向第二个应用发送FIN-WR消息。至此,套接字通信的两个通信方向均已关闭。在两个方向都接收到关闭消息之后,进程可以删除连接的FD。根据本公开的实施例,如果第一个应用关闭连接的一个方向,则其向第二个应用发送关闭消息,第二个应用可以使用关闭消息进行回应。
传统地,套接字连接是一个先入先出(FIFO)的通道,然而,一个套接字可能由多个发送线程和接收线程共享,因而传统的技术使用锁来保护共享队列,显著降低了操作系统的性能。
为此,本公开的实施例提供了在用户空间中建立线程之间的队列的方案。图7示出了根据本公开的实施例的用于针对每对客户端线程和服务器线程建立单独的队列的方法700的流程图。应当理解,方法700可以由参考图1所描述的计算设备/服务器100来执行。为了便于清楚说明图7的方法700,同时参考图8A所示出的架构800的示例一起进行描述,其中图8A示出了根据本公开的实施例的用于在单个发送线程与多个接收线程之间建立队列的架构800的示意图。
在702,创建第一应用的第一线程以及第二应用的第二线程和第三线程。例如,参考图8A,在应用810中创建发送线程811(称为“第一线程”),在应用820中创建接收线程821(称为“第二线程”)和接收线程822(称为“第三线程”)。应当理解,应用810可以运行在相同的计算设备中,也可以运行在不同的计算设备中。
返回参考图7,在704,在操作系统的用户空间中建立第一应用与第二应用之间的套接字连接,其中第一线程、第二线程以及第三线程共享套接字连接。例如,可以使用以上所描述的监视器来协助建立应用810与应用820之间的套接字连接。
在706,建立第一线程与第二线程之间的第一队列以及第一线程与第三线程之间的第二队列,其中第一队列不同于第二队列。继续参考图8A,可以在发送线程811与接收线程821之间建立队列831,可以在发送线程811与接收线程822之间建立队列832。也就是说,在套接字连接的每个发送线程与每个接收线程之间建立单独的队列。
针对同一个连接,传统的操作系统通常在所有发送线程与所有接收线程之间建立一个队列;然而,一个连接可能被多个线程同时使用,因而需要使用锁来控制不同线程的读写。相反,本公开的实施例通过针对每对客户端线程和服务器线程分别设置单独的队列,避免了使用锁,其移除了通常情况下的多线程同步,因此,根据本公开的实施例的无锁机制能够显著提升操作系统的性能。
图8B示出了根据本公开的实施例的用于在多个发送线程与单个接收线程之间建立队列的架构840的示意图。如图8B所示,可以在发送线程811与接收线程821之间建立队列851,可以在发送线程812与接收线程821之间建立不同的队列852。
此外,当两个应用分别存在多个线程时,也可以针对每对线程分别设置单独的队列。图8C示出了根据本公开的实施例的用于在多个发送线程与多个接收线程之间建立队列的架构870的示意图。如图8C所示,在发送线程811与接收线程821之间建立队列881,在发送线程811与接收线程822之间建立队列882,在发送线程812与接收线程821之间建立队列883,在发送线程812与接收线程822之间建立队列884。在一些实施例中,在应用810与应用820处于同一个计算设备上的情况下,可以在两者之间建立共享存储器队列。备选地,在应用810与应用820处于不同的计算设备上的情况下,可以在两者之间建立RDMA队列。
当存在多个接收线程时,为了保证接收线程之间的公平性和数据的接收顺序与发送顺序相同,对于一个特定的套接字,在任意时刻有且只有一个接收线程可以从队列中接收数据。图9A-9B示出了根据本公开的实施例的用于切换接收线程进行接管的架构的示意图,其中图9A表示切换之前的架构900,图9B表示切换之后的架构960。如图9A所示,接收线程822正在通过队列832从发送线程811接收数据,接收线程822具有用于接收数据的令牌910。在接收线程821试图从套接字接管接收数据的情况下,接收线程821通过队列831向发送线程811发送接管请求,发送线程811然后将接管请求转发给正在接收的接收线程822。接下来,接收线程822经由发送线程811向接收线程821发送令牌910。在接收线程821接收到令牌910之后,如图9B所示,接收线程821经由队列831开始从发送线程811接收数据,从而完成接收线程的切换。
在接收线程请求接管套接字时老队列中有剩余数据的情况下,剩余数据需要从老队列(例如队列832)迁移到新队列(例如队列831)。此外,当发送线程811处理接管请求时,它首先将其转发给当前接收线程822。在收到接管请求之后,当前接收线程822通过接管完成消息将所有剩余数据返回给发送线程811,发送线程811将剩余数据转发给新的接收线程821。在迁移期间,发送线程811阻止发送操作和接管请求以确保消息排序。
图10示出了根据本公开的实施例的用于fork操作的架构1000的示意图。fork操作是操作系统中用于创建新进程的一个常用系统调用。在调用fork()函数之后,操作系统向新的子进程分配资源(诸如存储数据和代码的空间),然后将父进程的所有数据、代码和操作系统资源都复制到子进程,这个过程相当于操作系统会复制一个与父进程完全相同的子进程。在一些实施例,可以建立子进程与监视器之间的共享存储器队列,监视器然后将子进程信息与父进程同步。
如图10所示,发送线程1011与接收线程1021之间已经建立了老队列1031。本公开的实施例在针对发送线程1011执行fork操作之后,复制出新的发送线程1012,然后,在发送线程1011与接收线程1021之间建立新队列1032,并且在复制出的发送线程1012与接收线程1021之间建立新队列1033,并在老队列1031中的数据传输完毕之后关闭老队列1031。此外,由于需要保留原始的发送顺序,因而新队列1032和1033可以被设置为先不启动,在老队列1031中的数据已经被接收之后再进行启动。
此外,为了与现有的操作系统兼容,需要确保消息的排序。针对单个接收线程,接收到的消息需要与发出的消息具有相同的排序。针对多个接收线程,发送和接收操作的顺序应当被线性化,例如,如果在接收线程R2调用recv()函数并且获得D2之前接收线程R1接收到D1,那么需要保证D1在D2之前被发送。
本公开的实施例通过针对每对线程设置各自的队列,而不是复用原来的老队列,这避免了不同线程使用同一队列时的加锁控制。由此可见,本公开的实施例能够实现与操作系统fork操作的完全兼容。
由线程创建的连接可以由相同进程中的所有线程访问。为了避免创建冗余队列和保存冗余的连接状态,LIBSD不会急切地与其他线程共享FD,因为现有应用中的大多数线程不会使用由其他线程创建的连接。当线程确实想要访问属于另一线程的FD时,LIBSD发送消息给所有者线程并请求共享FD。
图11示出了根据本公开的实施例的用于使用单个队列来复用每对客户端和服务器线程之间的多个连接的架构1100的示意图。如图11所示,在发送线程1111与接收线程1121之间已经建立队列1131,在发送线程1111与接收线程1122之间已经建立队列1132。如图11所示,可以对队列1131进行复用,使得其至少包括针对FD1的消息和针对FD2的消息,如1133所示。同样地,对队列1132进行复用,使得其至少包括针对FD3的消息和针对FD4的消息,如1134所示。
在传统的操作系统中,会针对每个连接(其由FD标识)建立单独的队列,如果连接的数目较多(即高并发),超过CPU或网卡的缓存空间的大小,则会出现高速缓存缺失的问题,影响操作系统的性能。为此,在本公开的一些实施例中,可以将每对线程之间的多个连接合并到同一队列中,由此减少队列所占用的缓冲大小。因此,根据本公开的实施例的用户空间套接字架构可以扩展到多个并发连接和多个线程。
在一些实施例中,可以通过扫描单个队列来确定多个连接中存在待被读取的数据的连接。操作系统中的epoll()函数用于从预先注册的套接字FD集合轮询传入数据通知,通过维护epoll FD集合的位图,可以针对位图检查每个数据消息中的FD,如果位图中存在该FD,则向应用返回事件。由于根据本公开的实施例的队列可以包括针对多个连接的数据,因而在执行epoll()函数时,仅扫描这一个队列,就可以确定存在待被读数据的所有连接。
在一些实施例中,可以维护全局光标以从最后扫描的队列中的最后位置恢复数据队列扫描。每个队列光标记录每个队列中的最后扫描位置,以避免两次扫描消息。每个FD维护FD的第一个和最后一个扫描的(但未读的)消息的位置。当扫描FD的新消息时,更新最后消息中的指针以指向新消息,其将接收到的FD消息链到链表。这样做是为了加速接收操作。当应用尝试从一个FD接收多条消息时,其可以沿着链表接收消息而无需扫描整个队列。
在一些实施例中,为了同时轮询来自套接字和(由内核处理)的其他的FD事件,LIBSD可以在每个进程中创建一个epoll线程,以等待内核处理的所有FD。当其收到内核事件时,它会通过共享存储器队列将事件广播到应用的线程。
图12示出了根据本公开的实施例的用于在每对客户端线程和服务器线程之间建立紧急队列的架构1200的示意图。如图12所示,在发送线程1211与接收线程1221之间除了建立数据队列1231以传输数据和按序的控制命令之外,还可以在发送线程1211与接收线程1221之间建立用于传输带外控制命令的紧急队列1232。数据队列1231中的消息集合1233可以在应用调用recv()函数时被顺序提取或者从任何位置提取,而每当紧急队列中存在新消息,使得接收线程1221立即取回新消息。如图12所示,紧急队列1232中存在带外控制命令的新消息1234,接收线程可以立即取回新消息1234。在数据队列1231充满的情况下,可以通过紧急队列1232传递其他控制消息。例如,为了在发送数据时关闭接收方向,不应当由数据队列中的未读取的数据阻挡这个关闭消息,而应当通过紧急队列来传输消息。
本公开的实施例支持从数据队列中的任何位置取回连接中的数据,为了从数据队列中间选择,接收线程需要遍历环形缓冲区中的消息。在遍历期间,接收线程从头部迭代消息,直到环形缓冲区中的空闲空间,其可以通过一个标志而被确定。因此,当非头部消息出列时,接收者无法清除标志。因而,可以为每条消息设置另一标志。当消息从中间出列时,另一标志可以被设置。
由于本公开的实施例中的数据队列支持从任何位置取回连接中的数据,因而可能出现数据队列1231中的消息被线端堵塞而中间出现空闲空间的情况。因此,本公开的实施例可以通过经由紧急队列1232发送用于触发垃圾回收的命令,然后扫描数据队列1231中空闲空间并且向数据队列1231的尾部移动消息,使得空闲空间在数据队列1231的头部被收集,进而发送线程1211可以继续向队列1231的头部发送消息。应当理解,大多数事件驱动型的应用从数据队列顺序地取回消息,因而正常情况下不需要执行垃圾回收的操作。
在一些实施例中,为了扩展具有共享同一CPU核的多个线程的套接字,可以使用协作多任务的方式来在CPU核上有效切换线程上下文,而不是使用操作系统的事件通知机制。例如,当应用执行阻塞套接字调用时,例如epoll_wait()或recv(),已经轮询了所有队列一轮而没有收到新消息,并且CPU核上有多个线程,应用可以调用系统调用函数sched_yield()来上下文切换到CPU核上的下一个非阻塞线程。与操作系统的事件通知机制相比,协作上下文的切换方式能够显著提高切换速度。
在一些实施例中,当应用执行阻塞套接字调用例如epoll_wait()或recv(),并且已经轮询了所有队列一定次数而没有收到新消息时,应用可以通过紧急队列向所有点对点应用发送睡眠通知,并进行睡眠。在发送线程从接收线程接收到睡眠通知之后,当其向接收线程发送消息时,其会信号通知接收线程以将接收线程唤醒。以这种方式,可以将长时间空闲的线程进行休眠,从而提高其他线程的执行效率。
因此,本公开的某些实施例能够同时实现操作系统的安全性和兼容性并且提升操作系统性能。在安全性方面,根据本公开的实施例的用户空间套接字使用监视器来控制连接建立并且保持不同应用之间的隔离,其还能够实施防火墙规则和访问控制策略。在兼容性方面,本公开的实施例可以实现单机内和多机之间的套接字通信,并且在远程设备不支持用户空间套接字功能时退回使用TCP连接,此外,还能够正确地兼容fork操作和线程创建。在提高性能方面,本公开的实施例通过针对每对线程设置单独的队列和/或将多个连接复用到同一个队列,能够实现高吞吐量和低延迟,同时随着并发连接数目的增加而不会显著降低性能。另外,区分控制层操作和数据层操作也能够提升操作系统的性能。
本文中所描述的方法和功能可以至少部分地由一个或多个硬件逻辑组件来执行。例如但不限于,可以使用的硬件逻辑组件的示意性类型包括现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑器件(CPLD)等。
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
在本公开内容的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
此外,虽然采用特定次序描绘了各操作,但是这应当理解为要求这样操作以所示出的特定次序或以顺序次序执行,或者要求所有图示的操作应被执行以取得期望的结果。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实现的上下文中描述的某些特征还可以组合地实现在单个实现中。相反地,在单个实现的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实现中。
以下列出了本公开的一些示例实现方式。
在一个方面,提供了一种计算机实现的方法。该方法包括:创建第一应用的第一线程以及第二应用的第二线程和第三线程;在操作系统的用户空间中建立第一应用与第二应用之间的套接字连接,其中第一线程、第二线程以及第三线程共享套接字连接;以及建立第一线程与第二线程之间的第一队列以及第一线程与第三线程之间的第二队列,其中第一队列不同于第二队列。
在一些实施例中,其中建立第一线程与第二线程之间的第一队列以及第一线程与第三线程之间的第二队列包括:在第一应用中的每个发送线程与第二应用中的每个接收线程之间建立单独的队列。
在一些实施例中,方法还包括:响应于第一线程从第二线程接收到接管请求,从第一线程向第三线程转发接管请求;以及经由第一线程从第三线程向第二线程发送用于接管的令牌。
在一些实施例中,方法还包括:响应于第一应用发起用于创建子进程的系统调用(fork)操作:为第一应用创建与第一线程对应的第四线程;建立第一线程与第二线程之间的第一新队列以及第四线程与第二线程之间的第二新队列;以及关闭第一线程与第二线程之间的第一队列。
在一些实施例中,其中建立第一线程与第二线程之间的第一队列包括:将第一线程与第二线程之间的多个连接合并到第一队列中,第一队列是用于传输多个连接的数据的单个队列并且支持从任何位置取回连接中的数据。
在一些实施例中,方法还包括:通过扫描第一队列来确定多个连接中存在待被读取的数据的连接。
在一些实施例中,其中第一线程为发送线程,第二线程为接收线程,并且建立第一线程与第二线程之间的第一队列还包括:建立第一线程与第二线程之间的紧急队列,第一队列用于传输数据和按序的控制命令,并且紧急队列用于传输带外控制命令;以及响应于紧急队列中存在新消息,使得第二线程立即取回新消息。
在一些实施例中,方法还包括:响应于经由紧急队列从第一线程接收到用于触发垃圾回收的命令,扫描第一队列中空闲空间并且向第一队列的尾部移动消息。
在另一方面,提供了一种计算设备。该计算设备包括:处理单元;存储器,耦合至处理单元并且存储有指令,指令在由处理单元执行时执行以下动作:创建第一应用的第一线程以及第二应用的第二线程和第三线程;在操作系统的用户空间中建立第一应用与第二应用之间的套接字连接,其中第一线程、第二线程以及第三线程共享套接字连接;以及建立第一线程与第二线程之间的第一队列以及第一线程与第三线程之间的第二队列,其中第一队列不同于第二队列。
在一些实施例中,其中建立第一线程与第二线程之间的第一队列以及第一线程与第三线程之间的第二队列包括:在第一应用中的每个发送线程与第二应用中的每个接收线程之间建立单独的队列。
在一些实施例中,动作还包括:响应于第一线程从第二线程接收到接管请求,从第一线程向第三线程转发接管请求;以及经由第一线程从第三线程向第二线程发送用于接管的令牌。
在一些实施例中,动作还包括:响应于第一应用发起用于创建子进程的系统调用(fork)操作:为第一应用创建与第一线程对应的第四线程;建立第一线程与第二线程之间的第一新队列以及第四线程与第二线程之间的第二新队列;以及关闭第一线程与第二线程之间的第一队列。
在一些实施例中,其中建立第一线程与第二线程之间的第一队列包括:将第一线程与第二线程之间的多个连接合并到第一队列中,第一队列是用于传输多个连接的数据的单个队列并且支持从任何位置取回连接中的数据。
在一些实施例中,动作还包括:通过扫描第一队列来确定多个连接中存在待被读取的数据的连接。
在一些实施例中,其中第一线程为发送线程,第二线程为接收线程,并且建立第一线程与第二线程之间的第一队列还包括:建立第一线程与第二线程之间的紧急队列,第一队列用于传输数据和按序的控制命令,并且紧急队列用于传输带外控制命令;以及响应于紧急队列中存在新消息,使得第二线程立即取回新消息。
在一些实施例中,动作还包括:响应于经由紧急队列从第一线程接收到用于触发垃圾回收的命令,扫描第一队列中空闲空间并且向第一队列的尾部移动消息。
在又一方面,提供了一种计算机程序产品。该计算机程序产品被存储在非瞬态计算机存储介质中并且包括机器可执行指令,机器可执行指令在计算设备中运行时使得计算设备执行动作:创建第一应用的第一线程以及第二应用的第二线程和第三线程;在操作系统的用户空间中建立第一应用与第二应用之间的套接字连接,其中第一线程、第二线程以及第三线程共享套接字连接;以及建立第一线程与第二线程之间的第一队列以及第一线程与第三线程之间的第二队列,其中第一队列不同于第二队列。
在一些实施例中,其中建立第一线程与第二线程之间的第一队列以及第一线程与第三线程之间的第二队列包括:在第一应用中的每个发送线程与第二应用中的每个接收线程之间建立单独的队列。
在一些实施例中,动作还包括:响应于第一线程从第二线程接收到接管请求,从第一线程向第三线程转发接管请求;以及经由第一线程从第三线程向第二线程发送用于接管的令牌。
在一些实施例中,动作还包括:响应于第一应用发起用于创建子进程的系统调用(fork)操作:为第一应用创建与第一线程对应的第四线程;建立第一线程与第二线程之间的第一新队列以及第四线程与第二线程之间的第二新队列;以及关闭第一线程与第二线程之间的第一队列。
在一些实施例中,其中建立第一线程与第二线程之间的第一队列包括:将第一线程与第二线程之间的多个连接合并到第一队列中,第一队列是用于传输多个连接的数据的单个队列并且支持从任何位置取回连接中的数据。
在一些实施例中,动作还包括:通过扫描第一队列来确定多个连接中存在待被读取的数据的连接。
在一些实施例中,其中第一线程为发送线程,第二线程为接收线程,并且建立第一线程与第二线程之间的第一队列还包括:建立第一线程与第二线程之间的紧急队列,第一队列用于传输数据和按序的控制命令,并且紧急队列用于传输带外控制命令;以及响应于紧急队列中存在新消息,使得第二线程立即取回新消息。
在一些实施例中,动作还包括:响应于经由紧急队列从第一线程接收到用于触发垃圾回收的命令,扫描第一队列中空闲空间并且向第一队列的尾部移动消息。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本公开,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。

Claims (20)

1.一种计算机实现的方法,包括:
创建第一应用的第一线程以及第二应用的第二线程和第三线程;
在操作系统的用户空间中建立所述第一应用与所述第二应用之间的套接字连接,所述第一线程、第二线程以及第三线程共享所述套接字连接;以及
建立所述第一线程与所述第二线程之间的第一队列以及所述第一线程与所述第三线程之间的第二队列,所述第一队列不同于所述第二队列。
2.根据权利要求1所述的方法,其中建立所述第一线程与所述第二线程之间的第一队列以及所述第一线程与所述第三线程之间的第二队列包括:
在所述第一应用中的每个发送线程与所述第二应用中的每个接收线程之间建立单独的队列。
3.根据权利要求1所述的方法,还包括:
响应于所述第一线程从所述第二线程接收到接管请求,从所述第一线程向所述第三线程转发所述接管请求;以及
经由所述第一线程从所述第三线程向所述第二线程发送用于接管的令牌。
4.根据权利要求1所述的方法,还包括:
响应于所述第一应用发起用于创建子进程的系统调用(fork)操作:
为所述第一应用创建与所述第一线程对应的第四线程;
建立所述第一线程与所述第二线程之间的第一新队列以及所述第四线程与所述第二线程之间的第二新队列;以及
关闭所述第一线程与所述第二线程之间的所述第一队列。
5.根据权利要求1所述的方法,其中建立所述第一线程与所述第二线程之间的第一队列包括:
将所述第一线程与所述第二线程之间的多个连接合并到第一队列中,所述第一队列是用于传输所述多个连接的数据的单个队列并且支持从任何位置取回连接中的数据。
6.根据权利要求5所述的方法,还包括:
通过扫描所述第一队列来确定所述多个连接中存在待被读取的数据的连接。
7.根据权利要求1所述的方法,其中所述第一线程为发送线程,所述第二线程为接收线程,并且建立所述第一线程与所述第二线程之间的第一队列还包括:
建立所述第一线程与所述第二线程之间的紧急队列,所述第一队列用于传输数据和按序的控制命令,并且所述紧急队列用于传输带外控制命令;以及
响应于所述紧急队列中存在新消息,使得所述第二线程立即取回所述新消息。
8.根据权利要求7所述的方法,还包括:
响应于经由所述紧急队列从所述第一线程接收到用于触发垃圾回收的命令,扫描所述第一队列中空闲空间并且向所述第一队列的尾部移动消息。
9.一种计算设备,包括:
处理单元;
存储器,耦合至所述处理单元并且存储有指令,所述指令在由所述处理单元执行时执行以下动作:
创建第一应用的第一线程以及第二应用的第二线程和第三线程;
在操作系统的用户空间中建立所述第一应用与所述第二应用之间的套接字连接,所述第一线程、第二线程以及第三线程共享所述套接字连接;以及
建立所述第一线程与所述第二线程之间的第一队列以及所述第一线程与所述第三线程之间的第二队列,所述第一队列不同于所述第二队列。
10.根据权利要求9所述的设备,其中建立所述第一线程与所述第二线程之间的第一队列以及所述第一线程与所述第三线程之间的第二队列包括:
在所述第一应用中的每个发送线程与所述第二应用中的每个接收线程之间建立单独的队列。
11.根据权利要求9所述的设备,所述动作还包括:
响应于所述第一线程从所述第二线程接收到接管请求,从所述第一线程向所述第三线程转发所述接管请求;以及
经由所述第一线程从所述第三线程向所述第二线程发送用于接管的令牌。
12.根据权利要求9所述的设备,所述动作还包括:
响应于所述第一应用发起用于创建子进程的系统调用(fork)操作:
为所述第一应用创建与所述第一线程对应的第四线程;
建立所述第一线程与所述第二线程之间的第一新队列以及所述第四线程与所述第二线程之间的第二新队列;以及
关闭所述第一线程与所述第二线程之间的所述第一队列。
13.根据权利要求9所述的设备,其中建立所述第一线程与所述第二线程之间的第一队列包括:
将所述第一线程与所述第二线程之间的多个连接合并到第一队列中,所述第一队列是用于传输所述多个连接的数据的单个队列并且支持从任何位置取回连接中的数据。
14.根据权利要求13所述的设备,所述动作还包括:
通过扫描所述第一队列来确定所述多个连接中存在待被读取的数据的连接。
15.根据权利要求9所述的设备,其中所述第一线程为发送线程,所述第二线程为接收线程,并且建立所述第一线程与所述第二线程之间的第一队列还包括:
建立所述第一线程与所述第二线程之间的紧急队列,所述第一队列用于传输数据和按序的控制命令,并且所述紧急队列用于传输带外控制命令;以及
响应于所述紧急队列中存在新消息,使得所述第二线程立即取回所述新消息。
16.根据权利要求15所述的设备,所述动作还包括:
响应于经由所述紧急队列从所述第一线程接收到用于触发垃圾回收的命令,扫描所述第一队列中空闲空间并且向所述第一队列的尾部移动消息。
17.一种计算机程序产品,所述计算机程序产品被存储在非瞬态计算机存储介质中并且包括机器可执行指令,所述机器可执行指令在计算设备中运行时使得所述计算设备:
创建第一应用的第一线程以及第二应用的第二线程和第三线程;
在操作系统的用户空间中建立所述第一应用与所述第二应用之间的套接字连接,所述第一线程、第二线程以及第三线程共享所述套接字连接;以及
建立所述第一线程与所述第二线程之间的第一队列以及所述第一线程与所述第三线程之间的第二队列,所述第一队列不同于所述第二队列。
18.根据权利要求17所述的产品,其中建立所述第一线程与所述第二线程之间的第一队列以及所述第一线程与所述第三线程之间的第二队列包括:
在所述第一应用中的每个发送线程与所述第二应用中的每个接收线程之间建立单独的队列。
19.根据权利要求17所述的产品,所述机器可执行指令在计算设备中运行时还使得所述计算设备:
响应于所述第一线程从所述第二线程接收到接管请求,从所述第一线程向所述第三线程转发所述接管请求;以及
经由所述第一线程从所述第三线程向所述第二线程发送用于接管的令牌。
20.根据权利要求17所述的产品,所述机器可执行指令在计算设备中运行时还使得所述计算设备:
响应于所述第一应用发起用于创建子进程的系统调用(fork)操作:
为所述第一应用创建与所述第一线程对应的第四线程;
建立所述第一线程与所述第二线程之间的第一新队列以及所述第四线程与所述第二线程之间的第二新队列;以及
关闭所述第一线程与所述第二线程之间的所述第一队列。
CN201811330977.4A 2018-11-09 2018-11-09 在用户空间中建立线程之间的队列 Active CN111176855B (zh)

Priority Applications (4)

Application Number Priority Date Filing Date Title
CN201811330977.4A CN111176855B (zh) 2018-11-09 2018-11-09 在用户空间中建立线程之间的队列
PCT/US2019/059294 WO2020096870A1 (en) 2018-11-09 2019-11-01 Implementation of sockets in user space
US17/289,368 US11880725B2 (en) 2018-11-09 2019-11-01 Establishment of queue between threads in user space
EP19809282.7A EP3857376A1 (en) 2018-11-09 2019-11-01 Implementation of sockets in user space

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811330977.4A CN111176855B (zh) 2018-11-09 2018-11-09 在用户空间中建立线程之间的队列

Publications (2)

Publication Number Publication Date
CN111176855A true CN111176855A (zh) 2020-05-19
CN111176855B CN111176855B (zh) 2023-10-27

Family

ID=68655695

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811330977.4A Active CN111176855B (zh) 2018-11-09 2018-11-09 在用户空间中建立线程之间的队列

Country Status (4)

Country Link
US (1) US11880725B2 (zh)
EP (1) EP3857376A1 (zh)
CN (1) CN111176855B (zh)
WO (1) WO2020096870A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114721726A (zh) * 2022-06-10 2022-07-08 成都登临科技有限公司 一种多线程组并行获取指令的方法、处理器及电子设备

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11875152B2 (en) * 2020-10-30 2024-01-16 EMC IP Holding Company LLC Methods and systems for optimizing file system usage
CN116466996B (zh) * 2023-04-24 2024-01-09 惠州市乐亿通科技股份有限公司 基于多线程的通信方法及上位机

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090135844A1 (en) * 2007-11-27 2009-05-28 Shrijeet Mukherjee Transmit-side scaler and method for processing outgoing information packets using thread-based queues
CN102339234A (zh) * 2011-07-12 2012-02-01 迈普通信技术股份有限公司 一种协议栈运行装置和方法
CN105487933A (zh) * 2015-11-24 2016-04-13 无锡江南计算技术研究所 一种基于核间异步消息队列与共享内存的域间通信方法

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6904597B2 (en) * 2001-03-30 2005-06-07 Intel Corporation Inter-thread communications between different components using double buffer
GB0221464D0 (en) * 2002-09-16 2002-10-23 Cambridge Internetworking Ltd Network interface and protocol
US7613813B2 (en) * 2004-09-10 2009-11-03 Cavium Networks, Inc. Method and apparatus for reducing host overhead in a socket server implementation
US7290114B2 (en) * 2004-11-17 2007-10-30 Intel Corporation Sharing data in a user virtual address range with a kernel virtual address range
CN100459502C (zh) * 2006-01-16 2009-02-04 北京速能数码网络技术有限公司 一种非对称跨网段多路数据流动态复制分发方法
WO2011096307A1 (ja) * 2010-02-03 2011-08-11 日本電気株式会社 プロキシ装置とその動作方法
US8453161B2 (en) * 2010-05-25 2013-05-28 International Business Machines Corporation Method and apparatus for efficient helper thread state initialization using inter-thread register copy
US9286116B2 (en) * 2012-07-06 2016-03-15 Microsoft Technology Licensing, Llc Multiple core real-time task execution
GB2507339A (en) * 2012-10-29 2014-04-30 Ibm Accessing privileged objects in a server by means of semi privileged instruction
US9584628B2 (en) * 2015-03-17 2017-02-28 Freescale Semiconductor, Inc. Zero-copy data transmission system
US10467151B2 (en) * 2017-09-05 2019-11-05 NGINX, Inc. Using shared memory to transport data between server processes
US11150967B2 (en) * 2017-09-30 2021-10-19 Intel Corporation Overlapped rendezvous memory registration

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090135844A1 (en) * 2007-11-27 2009-05-28 Shrijeet Mukherjee Transmit-side scaler and method for processing outgoing information packets using thread-based queues
CN102339234A (zh) * 2011-07-12 2012-02-01 迈普通信技术股份有限公司 一种协议栈运行装置和方法
CN105487933A (zh) * 2015-11-24 2016-04-13 无锡江南计算技术研究所 一种基于核间异步消息队列与共享内存的域间通信方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
ZHIQIANG LIU: "MPIActor: A Multicore-Architecture Adaptive and Thread-based MPI Program Accelerator" *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114721726A (zh) * 2022-06-10 2022-07-08 成都登临科技有限公司 一种多线程组并行获取指令的方法、处理器及电子设备
CN114721726B (zh) * 2022-06-10 2022-08-12 成都登临科技有限公司 一种多线程组并行获取指令的方法、处理器及电子设备

Also Published As

Publication number Publication date
EP3857376A1 (en) 2021-08-04
WO2020096870A1 (en) 2020-05-14
US20210397492A1 (en) 2021-12-23
CN111176855B (zh) 2023-10-27
US11880725B2 (en) 2024-01-23

Similar Documents

Publication Publication Date Title
CN111182008B (zh) 在用户空间中建立套接字连接
JP6549663B2 (ja) ミドルウェアマシン環境においてマルチノードアプリケーションのためのメッセージキューを提供および管理するためのシステムおよび方法
WO2019161557A1 (zh) 一种通信的方法及装置
KR100326864B1 (ko) 네트워크통신방법및네트워크시스템
US20050081202A1 (en) System and method for task queue management of virtual devices using a plurality of processors
US20070041383A1 (en) Third party node initiated remote direct memory access
WO2019223596A1 (zh) 事件处理方法、装置、设备及存储介质
US11880725B2 (en) Establishment of queue between threads in user space
KR20060041928A (ko) 프린트 시스템 및 방법
EP1861778A2 (en) Data processing system
US20150370582A1 (en) At least one user space resident interface between at least one user space resident virtual appliance and at least one virtual data plane
US9069592B2 (en) Generic transport layer mechanism for firmware communication
EP3077914B1 (en) System and method for managing and supporting virtual host bus adaptor (vhba) over infiniband (ib) and for supporting efficient buffer usage with a single external memory interface
JP2010165022A (ja) プロセッサ間通信装置、プロセッサ間通信方法、プログラムおよび記録媒体
US20140068165A1 (en) Splitting a real-time thread between the user and kernel space
Hruby et al. On Sockets and System Calls: Minimizing Context Switches for the Socket {API}
US9424114B2 (en) Input/output (I/O) processing via a page fault doorbell mechanism
US20070288646A1 (en) Communication interface device and communication method
US20050188070A1 (en) Vertical perimeter framework for providing application services
JP2009252107A (ja) 記録装置、ファイルディスクリプタ生成方法、プログラム
US8898353B1 (en) System and method for supporting virtual host bus adaptor (VHBA) over infiniband (IB) using a single external memory interface
AU2010201275A1 (en) A high performance and low latency messaging system
US20210392117A1 (en) Tunnel Portals Between Isolated Partitions
CN107615259A (zh) 一种数据处理方法及系统
US9104637B2 (en) System and method for managing host bus adaptor (HBA) over infiniband (IB) using a single external memory interface

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant