CN101393527B - 集中式轮询服务 - Google Patents
集中式轮询服务 Download PDFInfo
- Publication number
- CN101393527B CN101393527B CN2008101662028A CN200810166202A CN101393527B CN 101393527 B CN101393527 B CN 101393527B CN 2008101662028 A CN2008101662028 A CN 2008101662028A CN 200810166202 A CN200810166202 A CN 200810166202A CN 101393527 B CN101393527 B CN 101393527B
- Authority
- CN
- China
- Prior art keywords
- socket
- polling
- read
- write
- tasks
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/485—Task life-cycle, e.g. stopping, restarting, resuming execution
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 And Data Communications (AREA)
- Small-Scale Networks (AREA)
- Telephonic Communication Services (AREA)
- Bus Control (AREA)
Abstract
本发明提出一种集中式轮询服务和系统,用于在操作系统内核中向多个轮询任务提供恒定时间选择调用功能。在一个方面中,CPS连续地注册并从而捕获感兴趣的事件。轮询任务被提供以活动事件,从而消除重复地轮询大量不活动套接字的需求。CPS的示例性实施例包括到操作系统内核的系统接口、用于维护每个轮询任务的简档的数据结构和应用编程接口,该应用编程接口用于注册轮询任务,经由系统接口接收活动套接字和相应的读/写事件类型,针对每个轮询任务更新数据结构中的简档,并且将当前读和写就绪套接字返回到相应的轮询任务。
Description
技术领域
本发明一般地涉及客户端-服务器系统,更具体而言,涉及用于VoIP和协作系统的套接字处理问题。
背景技术
当前,VoIP和协作系统使用标准商业操作系统(例如VxWorks)来实现规模经济效益。VxWorks是一种单进程操作系统(其来源于UNIX系统的通用BSD4.3),其中所有并发线程(或任务)共享一个全局存储空间。最初,假设每个UNIX进程具有少量(例如64个)文件描述符(也称之为套接字),但是VxWorks将其扩展到一个更大集合(例如2048个)。
标准商业操作系统提供有套接字处理设施,该套接字处理设施的设计基于对VoIP和协作系统而言不再有效的假设。例如,VxWorks利用轮询系统(polling system),该轮询系统在扩展使用相对较少套接字的情况下达到其最高效率,而VoIP系统通常具有大量外围设备,其中每个外围设备都需要被提供以套接字服务,即使在重负载条件下,这些套接字服务也会导致相对较轻的套接字使用。
通常,利用工业标准(即BSD4.3可兼容的)套接字服务(例如“select(选择)”或“poll(轮询)”)来对大量套接字执行I/O复用。但是,标准套接字服务的使用导致高计算开销和极差的可扩展性。具体而言,在每个轮询任务上,操作系统(OS)内核必须搜索很多套接字才能找到具有活动事件的相对较少的套接字,并且其一次必须针对活动的若干应用中的每一个这样做。
一般而言,存在三种用于套接字I/O复用的基本模型或方法。第一方法是针对每个TCP连接产生一个任务(即线程),其中每个任务处理一个套接字I/O。但是,该方法只对小而简单的系统有效。其无法被应用到处理大量套接字的系统,因为其在系统中导致创建大量任务,从而导致高存储器成本和过度系统处理开销。
第二方法是使用单个任务控制(即复用)一组套接字。该任务连续进行带有预定非零超时(timeout)值的select调用(即select()),该预定非零超时值允许select()调用等待,直到I/O事件在等待时间期满之前到达任意给定套接字。
第三方法(这里称之为“轮询模型”)类似于第二方法,异常之处在于其周期性地轮询套接字集合,其中每次poll调用(即poll())立即返回。通过轮询套接字,与第二方法相比,可以通过不太频繁地进行系统调用以及利用每次调用收集更多I/O就绪套接字事件来减小计算开销。但是,“轮询模型”方法的一个问题在于其对I/O事件引入了响应延迟。
应该注意,VxWorks不支持poll()。但是,本领域技术人员将意识到,具有零超时值的“select”调用在逻辑上等同于poll()。select和poll理论上具有相同的计算复杂性(但是在某些操作系统中,poll可能比select具有少量改进因素)。由于所有这些系统都需要顺序检查N个套接字的列表,因此为了方便起见,本说明书可互换使用术语“select”和“poll”。
启发式方法(heuristic method)已被用于找到针对特定系统的轮询间隔或轮询窗(PW)的最佳值。通常,PW与一组系统属性相关,例如:所支持的IP电话的最大数目;最大流量吞吐量(每小时调用,Calls-Per-Hour);最小I/O延迟等等。
N的增大导致PW的增大。但是,增大的N还与增大的流量需求相关联,增大的流量需求进而需要更小的PW。减小PW值将增大流量吞吐量(或减小I/O延迟);但是将增大CPU消耗。对于具有有限CPU资源的给定系统,PW的选择是在可接受的范围内用于控制I/O复用开销的系统属性的折衷。
作为示例,由Mitel Networks公司制造的MN3300是一种分布式TCP/IP客户端-服务器系统,其中单个集成通信平台(ICP)控制器(或互连的ICP的集群)充当服务器的角色,用以支持最多N=1400个IP电话客户端。每个IP电话与ICP建立一个TCP套接字连接以用于信令目的。但是,ICP控制器通常必须对非常大量的TCP套接字执行I/O复用以与IP电话通信。这种I/O复用的计算成本直接与N(套接字的总数目)成比例,从而在N很大时导致O(N)计算时间的高开销以及扩展性问题。为了解决扩展性问题,在MN3300系统的某些商业实现方式中,VxWorks内核被重新编译以使得select服务支持2048、4096和8192个文件描述符,从而容纳更多的IP电话。
在现有技术MN3300系统中,一个任务是负责每隔PW=40毫秒轮询TCP套接字。因此,对于针对N=1400个电话并且在CPU使用饱和级别上大约8000CPH流量吞吐量设计的MN3300系统而言,将PW从40毫秒减小到20毫秒可以导致某种iPBX服务中断(outage)。为了支持更大的系统,例如N=3000,MN3300系统需要增大其CPU容量。
发明内容
一种集中式轮询服务(CPS)被提出,其提供了与现有技术select服务(例如VsWorks select服务)等同的功能,但是其计算复杂度仅为O(1)。下面将更详细描述的CPS提供了针对用户应用优选的I/O复用,并且不会影响内核select服务。
从计算复杂度的角度看,这里提出的方法和装置是优选的,因为无论套接字数目有多少,都执行可预测的恒定数目个步骤,以检测I/O相关的事件。换言之,所公开的方法消除了上述在建立大型TCP/IP客户端-服务器分布式系统时存在的扩展性问题,并且所产生的计算时间独立于N(TCP套接字的总数目)。
下面将详细描述的集中式轮询服务(CPS)将轮询和事件系统的元素组合在一起以创建混合轮询事件系统。具体而言,应用连续周期性地扫描事件,从而消除了将单独的事件推向应用的开销。但是,应用也可以注册或订购感兴趣的事件,从而消除了轮询系统(在内核和应用层两者上)搜索多个设备以寻找具有活动事件的那些设备所需的开销。
因此,在一个方面,虽然本领域已知在每次轮询任务上,OS内核必须针对每个活动应用搜索很多套接字来找到具有活动事件的相对较少的套接字,但是这里提出的CPS有效地集中轮询服务,从而消除了对多个应用的冗余搜索。
在另一方面,这里提出的CPS还消除了现有技术中轮询任务轮询很多套接字中的每个套接字的需求。CPS注册事件的能力(类似于事件系统能力)使得连续地捕获感兴趣的事件。因此,轮询任务可被提供以活动事件,从而消除了重复地轮询大量不活动套接字的需求。
下面参考附图提供了对上面概括的方案的附加细节以及现有技术的更广泛论述,附图中类似的标号指示类似的部件。
附图说明
图1是构成示例性实施例的环境的通信系统的框图;
图2是示出根据示例性实施例的集中式轮询服务(CPS)的功能概况的框图;
图3是示出用于示例性实施例的图2所示集中式轮询服务(CPS)的主要任务队列处理循环的流程图;
图4A示出用于使轮询任务注册到图2的集中式轮询服务(CPS)和从集中式轮询服务(CPS)解注册(de-register)的应用编程接口(API);
图4B示出到用于图2的集中式轮询服务(CPS)的操作系统内核的应用编程接口(API);
图5是用于图2的集中式轮询服务(CPS)的内部数据结构的示意图;
图6是示出图2的集中式轮询服务(CPS)的唤醒回调(wake-up callback)进程的流程图;
图7是示出图2的集中式轮询服务(CPS)的用于添加新套接字的轮询任务的流程图;
图8是示出图2的集中式轮询服务(CPS)的用于删除或清除套接字的轮询任务的流程图;
图9是示出图2的集中式轮询服务(CPS)的用于返回可用套接字的数目的select调用进程的流程图;
图10是示出图2的集中式轮询服务(CPS)的用于一次返回一个套接字文件描述符的获取下一API的流程图;以及
图11示出与BSD select相比,CPS select的时间测量的实验性测试结果的结果。
具体实施方式
参考图1,所示示例性通信系统包括连接到局域网或LAN(130)以及公共交换电话网(PSTN)的通信交换机,例如由Mitel Networks公司制造的MN3300,ICP(100)。诸如电话1、电话2、...电话1400之类的多个IP电话设备被连接到LAN(130)。
本领域技术人员将意识到,图1的配置是典型覆盖式通信网络的代表,并且在配置、组件等方面可能存在多种变化。
在图1的示例性实施例中,ICP(100)充当服务器的角色以支持多达N=1400个IP电话客户端。每个IP电话与ICP(100)建立一个TCP套接字连接以用于信令目的。ICP(100)对非常大量的TCP套接字执行I/O复用,以便与IP电话通信。如上所述,诸如“select”或“poll”之类在ICP中执行套接字I/O复用的工业标准(即UNIX BSD4.3可兼容的)套接字服务的使用会导致高计算成本,该计算成本直接与N(套接字的总数目)成正比。对于并入了450MHz PowerPC处理器的现有技术MN300ICP(100)而言,1400个TCP套接字的单次扫描花费大约10毫秒。总之,即使在ICP(100)和IP电话之间不存在调用处理流量时,联网的I/O功能也将消耗25%的CPU资源。当系统线大小(N)增大时,计算开销也增大,结果是现有平台硬件体系结构最终需要被更强大的CPU所取代,以便满足增大的计算资源需求。
这里参考下面图2-10的示例性实施例提出的集中式轮询服务(CPS)在很少的恒定时间(例如,通常少于8微秒而不是如现有技术的9.8毫秒,或者大约比现有技术的方案快1000倍)内完成对于任意数目的套接字的“select”功能。此外,这里提出的CPS完全是可扩展的,因为其计算时间即使在TCP套接字的总数目增大到N=10,000或更多的情况下也保持不变。
这里描述的CPS的直接实践商业益处在于其提供了省钱的替代方案,用来建立大企业系统和基于服务器的应用。例如,其可以极大地增大现有IPBX系统的IP电话线尺寸并且无需任何主要体系结构的改变和投资。
如上所述,用于Mitel MN3300ICP平台中的示例性ICP(100)的操作系统(OS)是VxWorks,VxWorks是一种适合于实时嵌入式计算的流行的UNIX类操作系统。VxWorks提供如下UNIX BSD4.3可兼容的select服务:
int select(int width, /*从0开始将检查的比特数目*/
fd_set* pReadFds,/*读fds*/
fd_set* pWriteFds,/*写fds*/
fd_set* pExceptFds,/*异常fds*/
struct timeval * pTimeOut /*最大等待时间,NULL=永远
*/)
fd_set文件描述符的三个参数(pReadFds、pWriteFds和pExceptFds)掩码文件描述符(fd)集合的点,其中每个比特对应于一个特定的文件描述符。pReadFds参数指向指定该文件描述符用于检查读的比特掩码。已被设置的比特致使select()保持未决,直到在相应文件描述符中的任何一个上可获得数据。PWriteFds参数指向指定该文件描述符用于检查写的比特掩码。已被设置的比特致使select()保持未决,直到相应文件描述符中的任何一个变为可写。pExceptFds参数指向指定该文件描述符用于检查异常条件的比特掩码。当前在VxWorks中未使用pExceptFds参数,但是其被提供以用于UNIX调用可兼容。
因此,针对读事件在一组套接字文件描述符上的select可以监视任意连接的套接字,以确定数据何时到达以及数据何时准备好在无阻挡(blocking)的情况下被读(用于ioctl系统调用的FIONREAD参数被用于确切地确定有多少数据可获得)。针对读事件在一组套接字文件描述符上的select还可以监视任意侦听(listening)套接字,以确定何时可以在无阻挡的情况下接受连接,并且还可以监视任意套接字,以检测是否在套接字上出现差错。
针对写事件在一组套接字描述符上的select可以监视任意连接的套接字,以确定何时完成连接,并确定何时可以在无阻挡的情况下发送更多数据(即至少一个字节可被发送),并且检测是否在套接字上出现差错。
针对异常事件的select将针对具有可被读的带外数据的套接字返回“真”。select还针对不再能够被使用的套接字返回“真”(例如,如果已针对其执行了关闭或中断的系统调用)。
宽度参数定义在文件描述符集合中多少比特被检查,并且应被设置为使用中的最大文件描述符值加1或简单地设置为内核硬编码的FD_SETSIZE。例如,在示例性MN3300系统中(例如图1所示),VxWorks内核可以利用FD_SETSIZE=8192来重新编译。
如果pTimeOut为NULL,select()则将不确定地阻挡。如果pTimeOut不为NULL,但是指向有效时间为0的timeval结构,文件描述符集合中的文件描述符则将被轮询,并且结果被立即返回。如果有效时间值大于0,则select()将在超过指定时间之后返回,即使没有文件描述符准备就绪也是如此。
当select()返回时,其报告有多少文件描述符准备就绪,并且将文件描述符设为0,并且仅仅设置与准备就绪的文件描述符相对应的比特。
现有技术公知的select()的内核实现方式包括在select()时唤醒系统中的所有未决任务(或进程),从而使得每个任务可以检查其输入比特掩码以寻找与之关联的I/O事件已经到达的描述符。利用select()的任务必须再次对返回的比特掩码执行顺序搜索,以便找到哪个套接字fd已经准备就绪。
如上所述,这总计O(N)计算时间复杂性的开销,其中N是所使用的套接字文件描述符的最大数目。简言之,select的计算时间直接与N成比例,从而使得当N很大时,出现高计算开销和较差的可扩展性问题。
下面更详细描述的集中式轮询服务(CPS)动态地管理每个轮询任务的简档(profile),所述简档包含任务ID、当前轮询套接字和轮询结果。其提供与select调用类似的功能,但是绕过了标准内核select服务。这里提出的CPS包含与I/O事件异步的内核套接字,并且按恒定时间更新轮询任务的简档。这确保了在提供轮询服务时O(1)计算复杂性。现有技术的select调用中的O(N)开销从而被消除。这里提出的CPS针对用户应用独立地提供最优的I/O复用选择,并且不会影响内核select服务。
返回图2,CPS的功能框图被提出。本领域技术人员将意识到,图2的框图和以下描述仅仅是示例性的。示例性CPS API的详细描述下面将参考图3-10提出。
如图2所示,对每个fd的读和写套接字事件(200)被OS内核观察和处理(210),并经由VxWorks的回调功能(下面将参考图4B对此进行详细描述)被提供到CPS的其余部分。回调功能针对每个事件调用CPS功能。读和写字节掩码(220)(也称之为套接字图(SocketMap))被fd索引,并且包含已经注册将被告知事件的应用(225)的服务号。CPS使用服务号来索引服务列表,如下面参考图5将更详细描述的。服务列表是记录列表,其中每张列表除了其他元素之外还包含读和写仓库(store)(505),用于存储针对由服务号标识的应用的读和写套接字事件(即CPS将事件的fd写适当的仓库中)。以适当的间隔,应用(225)可以轮询活动事件。
简要地返回CPS应用编程接口(API),标准select服务要求调用者在每次调用时提供文件描述符(fd)的输入比特掩码,即使从同一调用者上次调用起比特掩码不存在改变也要提供。这对于select服务需要O(N)时间来检查输入比特掩码(220)。在示例性MN3300系统中,一旦IP电话被加电并被注册到ICP控制器(100),TCP套接字就在所有时间保持打开(99.999%可获得)。CPS的示例性实施例的一个方面在于用户任务不需要每次都提供这种套接字比特掩码信息。相反,CPS针对每个调用者任务保存集中式轮询套接字图,并且允许任务动态地从其图中添加/清除套接字。
类似地,标准的select服务返回活动文件描述符的总数目以及输出比特掩码。因此,调用者任务必须搜索比特掩码以找到哪个文件描述符是活动的,这也要花费O(N)时间。在CPS中,由于活动的文件描述符被保存在包含读和写仓库的服务列表上,因此该开销被消除。CPS select回调活动套接字fd的数目,并且调用者任务简单地执行“获取下一个”动作来检索所有活动的文件描述符。
为了示出示例性实施例,用于IPBX I/O复用的轮询模型被描述,然后描述O(1)时间复杂性集中式轮询服务以及描述实现结果和性能比较。
为了使离线的IP电话(或IP设备)利用ICP(100)上线,存在两个连续阶段:信令传输链路(STL)建立阶段和设备注册阶段。在STL建立阶段,在远程IP设备和ICP(100)之间建立TCP套接字连接,或者完成TCP3路握手协议。如果安全链路将被建立,则还要执行额外的安全性协商。在设备注册阶段,在IP电话(例如IP电话1、IP电话2等等)通过STL发起与ICP(100)的注册协议时,应用数据的第一分段被发送。如果协议交换是成功的,IP电话则将被ICP(100)带入服务中(In-Service)状态。
在设备注册阶段之后,IP设备应用(225)准备好提供服务。例如,IP电话1可以通过经由STL与ICP(100)发起调用处理协议来向IP电话2发出呼叫。如果协议被成功完成,ICP(100)则将在两个电话之间直接建立双向RTP语音流路径。类似地,诸如维护服务、心跳服务和网络管理服务之类的其他服务都可以经由STL TCP链路通过相应的信令协议来提供。
ICP I/O复用被用于在STL建立阶段之后通过TCP套接字发送和接收数据。从操作服务的角度看,ICP I/O复用支持三种情况:IP电话服务、IP中继(trunking)服务和应用服务。IP电话服务提供基本的iPBX电话服务,其中IP电话(IP电话1、IP电话2等等)发起到ICP(100)的TCP连接,并且在单个ICP控制器(100)处可以端接多达1400个TCP套接字。利用IP中继服务,还可以通过TCP套接字连接互连ICP的集群,以用于容错、网络拓扑和系统服务共享目的。在此情况下,ICP(100)发起到其他ICP的TCP连接。根据应用服务,其他IP设备应用或桌上应用在无法共享IP电话服务TCP连接的情况下可以具有它们自己的到ICP1(100)的TCP连接。
为了简化,以下对ICP复用模型的描述是仅仅针对IP电话服务和IP中继服务提出的,并且因为它们覆盖所有类型的TCP套接字连接。
在示例性MN3300系统中,ICP I/O复用基于轮询模型,其中单个轮询任务周期性地在针对特定服务相关联的一组套接字上执行用于读/写数据的select调用。例如,IP电话服务执行这种轮询任务,而IP中继执行具有相同结构的另一轮询任务。在MN3300系统中,轮询任务被实现为标准C++类。
图3示出轮询任务的主循环的功能框图。在步骤300处,对来自其队列或邮箱的处理消息执行(例如每隔PW=40毫秒)任务队列处理循环。如下所述,来自系统的所有套接字服务请求和任务间通信都在该循环中被处理。具体而言,在步骤300处的循环提供套接字状态处理并向网络LAN(130)发出数据。在MN3300系统中,套接字在任意时刻可以具有来自以下套接字状态集的状态之一:SSS={无效、侦听、连接、被连接、接受、已订购、关闭、被关闭}。处于“侦听”状态的套接字准备好接受传入的连接请求。处于“连接”状态的套接字准备好发出外出连接。侦听套接字被放到套接字图上,以检测传入的连接请求上的“读就绪”事件(读字节掩码)(步骤310)。对于连接套接字,连接请求在步骤300处的循环内立即发起。但是,如果不存在来自远端的连接响应,套接字状态“连接”则被记录,并且套接字被放到套接字图上,以检测随后将被处理(步骤340)以用于处理传出连接的“写就绪”事件(写字节掩码)。数据到网络LAN(130)的发送经由提供到给定套接字的标准BSD“写”操作被执行。应该注意,输出套接字fd没有被放到套接字图上以用于检测“写就绪”事件。select()的写比特掩码被用于连接套接字,如上所述。这是因为本地列表可被用于跟踪所有已知套接字的输出状态。
在步骤310处,其他系统维护动作被执行,并且如果套接字已被打开或删除,则更新套接字图(220)中的套接字记录,如下面将参考图5更详细描述的,套接字图是一种数组或表数据结构,用于保存所有当前订购的套接字记录并且将套接字fd用作索引密钥。例如,在IP电话服务中,当1400个IP电话上线时,1400个TCP套接字被记录在该图上。
在步骤320处,BSD4.3select调用被执行,其中超时值被设为0,以使其无论是否存在任何套接字I/O事件都是一个无阻挡调用。select回调所有“读就绪”和“写就绪”I/O事件,如上所述。
套接字在步骤330处被读,步骤330代表I/O复用操作的主要“输入”部分。在返回select调用之后,活动I/O套接字的数目是已知的。图4A中的GetNextReadyFd方法被用于取得套接字事件。相应的动作基于给定套接字的状态而被作出。例如,如果带有读事件的套接字处于“侦听”状态,则标准的BSD“接受”被应用到新的连接,该新的连接创建新的套接字,并且返回指向新的套接字的文件描述符(fd)。对于该新的套接字,额外的套接字处理被立即转移到更高层的套接字处理器任务,以使得轮询任务可以继续读下一套接字。另一方面,套接字处理器任务可以判断是否需要耗时的安全连接协商(例如SSL握手)。一旦完成,“套接字订购”请求就被发回轮询任务,以通知该套接字准备好接收和发送应用数据。应该注意,“套接字订购”消息无法在步骤330处被处理。相反,“套接字订购”消息在轮询任务循环回到步骤300时被处理。如果协商成功,则将新的套接字设置为“已订购”状态,并且套接字fd被放到套接字图(图5)上,以用于检测接收传入数据的读就绪事件(读字节掩码)。如果协商失败,则关闭TCP连接。如果套接字处于“已订购”状态,则将标准的BSD“读”动作应用到套接字以接收应用数据。
如结合“任务队列处理循环”300所述,连接的套接字可以完成未决的连接。如果select调用(步骤320)指示连接套接字上的写就绪事件,则执行步骤340以处理传出连接。当接受连接时,如果连接将是安全链路,则可以将新连接通知安全性协商器任务。如果连接成功,新的被订购的套接字则被放到套接字图上以用于检测“读就绪”事件。此后,新链路上传入的数据可以从随后的轮询周期中接收。
一般而言,套接字数据输出功能只在“任务队列处理循环”(步骤300)中被处理;并且套接字数据输入功能在“读套接字”(步骤330)中执行。轮询任务每隔40毫秒发起select调用(步骤320),并且提供用于接受客户端(例如IP电话服务)连接请求或用于发起ICP间连接请求(例如IP中继服务)的全面套接字服务集合。
根据示例性实施例,CPS用C++实现。图4A所示CPS API的代码段被执行以访问CPS服务。具体而言,轮询任务调用RegisterForSocketService()以注册到CPS并接收有效的(大于0)“服务号”。轮询任务还可以通过调用DeRegisterForSockService()来停止使用CPS(例如在系统关断时)。应该注意,为了系统安全性和可靠性方面的考量,“任务ID”和“服务号”必须一起使用以访问CPS的其他服务。
Add()调用允许轮询任务针对给定的I/O事件(READ=0,WRITE=1)向其轮询套接字图添加新的套接字fd。clear()函数允许轮询任务针对给定事件从其轮询套接字图中删除套接字。
在正常轮询周期中,CPS select调用(步骤320)被轮询任务用来分别找到将读或写的活动套接字的当前总数目。类似于BSD4.3select(),CPS select调用允许用户任务以毫秒为单位指定“超时”值,该值对于轮询模型被缺省地设为0。最终,GetNextReadyFd()调用被用于取得CPSSelect()调用所报告的I/O就绪文件描述符。
据此,本领域技术人员将意识到,CPS按如下方式建模三部分的BSD4.3select()调用功能:(1)更新输入套接字掩码;(2)找到I/O就绪套接字的总数目;并且(3)检索输出套接字。如下将更详细描述的,图4A中的每次CPS API功能调用在O(1)时间内完成。
现在转到CPS系统接口,根据CPS的实施例的一个方面,与操作系统内核中的BSD-select实体接收的相同的异步I/O事件被获得。BSD-select接收的原始输入信息需要被用来书写快速并且可扩展的CPS-select设施。所需的特定信息是活动套接字文件描述符(fd)以及相应的I/O事件类型(READ或WRITE)。
如图4B所示,select()的典型实现方式被利用,其中内核调用sowakeup(struct socket*so,struct sockbuf*sb,SELECT_TYPE wakeupType)唤醒在select()上未决的所有进程。用户回调钩子(hook)被包括在sowakeup()调用中,作为用于支持异步I/O的替换方式。该回调钩子是一个全局函数指针,用于将struct socket*和SELECT_TYPE(即SELREAD=0,SELWRITE=1)这两种参数转发到用户回调函数。
图4B示出当CPS被创建时BindingCallbackToKernal()被调用,并且将wakeupCallback()传递到内核,以使得当sowakeup()被执行时,wakeupCallback()被从内核调出。wakeupCallback()的内部CPS动作的额外细节下面给出。将会意识到,wakeupCallback()回调是来自内核的ISR类调用,其需要被快速执行而不能在用户空间处被阻挡。
图5示出CPS的内部数据结构,从图中将会注意到,CPS是一种由所有轮询任务共享的全局对象。在CPS中,提供了两个列表:分别是针对READ和WRITE事件的套接字读字节掩码和套接字写字节掩码。如上所述,对于方便,这些列表也被称为套接字图。应该注意,套接字图可以被扩展为包括套接字异常字节掩码,以支持套接字异常服务。
套接字图是具有max_fd+1个条目的列表,其中max_fd是系统所支持的套接字的最大数目。例如,在支持1400个IP电话的MN3300系统中,max_fd被配置为2000,并且用于两个图的存储器成本仅仅是4K字节。这样一来,套接字图可以通过套接字fd来索引。套接字图被表示为八位组(因此称之为字节掩码),这不同于BSD4.3select服务的比特掩码。例如,当利用来自内核的回调函数访问套接字图时,字节操作比比特操作更快。已经被初始化为0(或“空”)的字节掩码可被CPS用来记录“服务号”,“服务号”代表轮询任务针对与仓库相关联的I/O事件对被索引的fd的订购。
可以作出若干意见。首先,套接字图在逻辑上被服务号所划分。具有同一服务号的所有条目与一个分区相关联,其中服务号是在注册时由CPS赋予轮询任务的号码。其次,套接字图可以同时容纳最多255个轮询任务。将条目尺寸从字节增大到字可以有效地消除CPS中的这种局限。第三,套接字fd无法同时被具有不同服务号的两个轮询任务所订购。套接字冲突(试图读和/或写同一套接字的两个应用)从而在CPS中被避免。
BSD4.3select服务不受诸如以上第三种意见之类的限制所局限。多个应用可以从两个BSD4.3select()调用访问一个套接字。虽然套接字冲突没有被CPS直接支持,但是其可以通过覆盖(overlay)机制来实现,所述覆盖机制允许服务号列表与套接字图的条目相关联。但是,在大多数应用中,支持套接字冲突不是必需的。实际上,在MN3300IP PBX系统中,必须强制具有第三种意见,即安全并可靠的通信。
如图5所示,“服务列表”数据结构保存CPS中的轮询记录的列表。在成功注册到CPS之后,轮询任务在服务列表(500)上创建轮询记录,其中赋予轮询任务的服务号是轮询记录到列表的索引。如果只有一些任务执行联网的I/O复用,例如在示例性的MN3300ICP控制器(100)中,则在实践中,服务列表(500)非常短。CPS注册可以在仅仅O(1)中完成,因为服务列表(500)的长度是很小的常数。对于大服务列表,可以使用其他合适的数据结构(例如散列表、自由服务号池)。不管怎样,轮询任务只需要在轮询套接字之前的系统配置期间向CPS注册一次。
轮询记录包含关于轮询任务的所有必要信息,例如任务ID。两种环形列表(505)被提供:套接字读仓库(SRS)和套接字写仓库(SWS)。每个仓库与一个唤醒标志以及一个唤醒信号量(在510处示意性地示出的二进制信号量)相关联,所述唤醒标志和唤醒信号量对于支持MN3300轮询模型(即超时值为0的select调用)不是必需的,但是它们被提出以显示CPS可以提供具有非零超时值的通用BSD4.3select功能。
SRS/SWS(505)被用于保存针对相应轮询任务的当前读/写就绪套接字文件描述符。每个仓库具有sysPtr,其指向系统(例如内核回调功能)当前可用于写具有已经到达的I/O就绪事件的套接字fd的条目。在每次写操作之后,sysPtr被移动,以使其指向下一可用条目。每个仓库还具有usrPtr,其指向轮询任务可以读的当前条目。在每次读操作之后,当前条目通过重置到0而被“清洗”;并且usrPtr被移动,以使其指向下一可用条目。在轮询模型中,当系统报告新的fd时,sysPtr沿仓库向前移动;但是usrPtr仅仅在轮询任务返回以跟上系统的更新时,在每次轮询间隔之后被更新。
如果SRS/SWS(505)的尺寸太小,则sysPtr可能围绕仓库并追上usrPtr,从而产生SRS/SWS读-写冲突,这必须避免。但是,SRS和SWS冲突检测可以通过简单地在系统向仓库添加新的I/O就绪fd之前检查sysPtr是否指向尚未被“清洗”(即大于0)的条目来实现。
由于最大调用处理流量模式和轮询窗是已知的,因此SRS和SWS的所需尺寸可以容易地计算出。在图1的实现方式中,例如,仓库尺寸为1000能够支持比最大操作容量(8000调用每小时)大三倍的流量容量。用于两个仓库的总存储器成本仅仅为8K字节。
以上面的描述为背景,下面提出基本的运行时情况,以示出上述数据结构如何被用于CPS算法以提供一组轮询服务。
如图6和7所示,当从VxWorks内核中调出wakeupCallback(structsocket*so,SELECT_TYPE wakeupType)时,其指示文件描述符fd具有I/O事件SELEAD或SELWRITE(图6的流程图中的步骤600)。
在步骤610处,从给定的so->so_fd索引到图5中的套接字图(220)的右侧,如果条目为空(步骤620处的“是”),则退出调用(步骤660)。否则,条目的值被用作“服务号”以索引服务列表(500),从而找到用于轮询任务的相关记录(步骤630)。
在步骤640处,文件描述符(fd)被直接添加到准备好检索的轮询任务的fd列表。步骤650在唤醒标志没有设置(即步骤645处的“否”)的情况下被跳过。对于轮询模型,其中CPS select调用具有超时值0(即在步骤645处表明唤醒标志已被设置的“是”确定),轮询任务被唤醒(步骤650)。步骤650示出CPS轮询服务可以建模所有标准的BSD选择服务。
显而易见,图6中的每个单个步骤花费O(1)时间。
回顾图5可知,服务列表(500)中的每个记录包含针对每个服务号的读和写事件仓库(505)。另外,每个记录包含针对该服务号的唤醒标志和唤醒信号量(510)。这些实体赋予CPS提供由标准BSD select调用所提供的超时功能的能力。如果CPS从提供非0超时值的应用接收select调用,则设置唤醒标志并使唤醒信号量上的调用未决,从而提供由BSDUnix所提供的超时功能。
轮询任务使用CPS API RegisterForSockService(int taskId,int &serviceNum)注册到CPS,其中taskId可以是标识调用者的任意唯一号码,并且对serviceNum的引用允许调用者从CPS接收“服务号”。在接收到注册请求之后,CPS检查其服务列表(500)以找到下一空条目的索引。轮询记录随后被建立,并且索引值被赋予serviceNum。
当从CPS解注册时(即使用DeRegisterForSockService(int taskId,intserviceNum)调用),通过给定的serviceNum被直接索引的注册的轮询记录被清除或删除。
图7是示出用于添加新套接字的轮询任务的流程图。首先,通过比较给定的taskId和存储的taskId来执行(步骤710)核实检查;如果检查通过,则其服务号被标记在套接字图(220)的给定套接字fd条目上。否则,检查返回“无效”(步骤720)。该调用的计算复杂性非常小。
轮询任务使用CPS API Add(int fd,int ioEvent,int service Num,inttaskId)来针对由servicNum和taskId标识的轮询任务添加针对感兴趣的soEvent(READ=0,WRITE=1)的新套接字fd。
在图2的MN3300轮询模型中,在利用CPS服务替换BSD select服务之后,在步骤730处所示的三种情况下CPS Add()被从步骤300(图3)的任务队列处理循环调用:
●情况READ:添加“侦听”套接字,用于读事件
●情况WRITE:添加“连接”套接字,用于写事件
●情况ARC_READ:添加“已订购”套接字,用于读事件
在步骤740中,当且仅当条目尚未被任意轮询任务所取得的情况下,新的serviceNum可以被写该条目。这提供了对于“套接字冲突”的防止,如上所述。
假设步骤750(处理添加竞赛条件(Add-Racing-Condition,ARC))以恒定时间完成,则图7的算法花费O(1)时间。从而,将会意识到,ARC构成了在开发快速并且可扩展的O(1)CPS-select(或轮询)服务方面的挑战。下面将说明什么是ARC以及如何根据CPS在恒定时间中解决ARC。
考虑针对读事件添加“已订购”套接字的示例(即情况ARC_READ)。当TCP连接到达侦听套接字时,该套接字变得可读。轮询任务通过创建针对该连接的新套接字来接受连接,并返回指向新套接字的文件描述符。这是在“读套接字”框中完成的(图3中的步骤330)。但是,轮询任务无法立即调用CPS Add(),因为其必须将额外处理(例如“安全协商”)传递到更高层任务。一旦更高层任务已经完成这样的“额外处理”,“套接字订购”消息就被发回轮询任务,这是在主处理循环的第一框(步骤300)中处理的。最终,轮询任务以ioEvent=ARC_READ调用CPS Add()。
在以上情形中,在完成连接协商和发起CPS Add()调用的时间之间存在随机的时间间隔。在该时间期间,远端IP电话(图1)已经准备好发送应用数据的第一分段,但是CPS套接字读字节掩码(220)尚未被设置。如果IP电话的应用数据在该时间间隔期间到达,内核则将调用CPSwakeupCallback()函数,这在图6的步骤620处退出,从而引起ARC问题,即应用数据从而丢失。
标准的BSD select服务没有这个问题,因为BSD select()调用在内核级别上检查是否有针对输入的套接字比特掩码所给出的套接字的任意I/O事件已经到达。为了避免O(N)顺序搜索以及为了实现O(1)时间复杂度性能,ARC问题被CPS API Add()所解决,所述CPS API Add()将套接字fd直接添加到轮询任务的套接字读仓库(505),从而利用wakeupCallback()补偿SRS的任意丢失的更新。
因此,步骤750(处理添加竞赛条件(ARC))找到由serviceNum所索引的轮询记录,将fd写由SRS上的sysPtr所指向的条目,并且将sysPtr移动到仓库(505)中的下一条目。
将会发现,步骤750可以在O(1)时间中执行。因此,图7所示CPSAdd算法的时间复杂性为O(1)。本领域技术人员将意识到,在示例性MN3300系统中,步骤750的性能允许多达1400个IP电话可靠地在线。
由于ARC涉及竞赛条件,因此CPS Add()有时在“应用数据”的第一分段到达新连接之前被调用也是可能的。在此情况下,wakeupCallback()更新SRS(505)以使得在步骤750处,复制的套接字fd读事件被添加到SRS,从而导致在0字节数据被读时,已订购的套接字上有至多一个“读丢失”。
如图8所示,轮询任务使用CPS API Clear(int fd,int ioEvent,intserviceNum,int taskId)来针对由serviceNum和taskId标识的轮询任务删除或清除先前添加的针对感兴趣的ioEvent(READ=0,WRITE=1)的套接字fd。当TCP连接故障时,该函数被用于从轮询任务的套接字图(500)中删除TCP套接字。
核实检查通过比较给定的taskId和存储的taskId来执行(步骤800);如果发现匹配,该检查则通过,并且从服务列表中删除轮询记录。否则,检查返回“无效的(INVALID)”(步骤810)。步骤820类似于图7中的步骤730。
图8中的步骤830提供对套接字图(500)的保护,因为只有具有相同服务号的轮询任务可以清除其自己的套接字图条目。CPS Clear()方法在步骤840处结束。本领域技术人员将意识到,CPS Clear()比CPS Add()更简单,并且也是O(1)算法。
CPS Select(int ioEvent,int serviceNum,int taskId,int timeout=0)回调对于给定ioEvent可获得的活动套接字的数目。图9示出在CPS的示例性实施例中其算法设计。
核实检查通过比较给定的taskId和存储的taskId来执行(步骤910);如果发现匹配,该检查则通过,并且从服务列表中删除轮询记录。否则,检查返回“无效的(INVALID)”(步骤920)。
在步骤930处,“服务号”的值被用于索引服务列表(500)以找到针对轮询任务的相关记录。
然后,在步骤940处,相应轮询任务的SRS/SWS(505)被从给定的ioEvent中确定。
CPS select的主要功能发生在步骤950处,其中固定数目的算法运算被执行,以确定在仓库中的两个指针之间存在多少个条目。具有M个条目的仓库是利用模(modulo)运算由M个条目的线性数组来实现的,以从最后一个条目循环回到第一个条目。
类似于图6所示wakeupCallback流程图的步骤660,图9中的步骤970对MN3300轮询模型而言不是必需的,但是尽管如此,这里还是对其进行了描述以示出CPS select可以如何全面地建模BSD select。在MN3300轮询模型中,轮询任务被用于每隔40毫秒调用一次BSD select。但是,轮询任务能够每隔20毫秒调用一次CPS select,因为CPS select比BSD select效率更高。CSP select是O(1)算法,如上所述。
在步骤970的调用唤醒之后,步骤950被再执行一次(步骤980)并且套接字的数目被返回(步骤990)。
应该注意,CPS select调用不需要输入套接字比特掩码或输出套接字比特掩码,其两者都被内建在结合图5所述的数据结构中。
图10示出如何利用GetNextReadyFd(int ioEvent,int serviceNum,inttaskId)API检索由CPS select报告的活动套接字,其中一次取得一个套接字fd。图2的轮询任务可以按Select(0所指示的次数多次重复该调用,但是额外的调用虽然仍旧是“安全的”,但也可能返回“无效的fd”(即负整数值)。
核实检查通过比较给定的taskId和存储的taskId来执行(步骤1010);如果发现匹配,该检查则通过。否则,检查返回“无效的(INVALID)”(步骤1020)。
在步骤1030处,“服务号”的值被用于索引服务列表(500)以找到针对轮询任务的相关记录。
然后,在步骤1040处,相应轮询任务的SRS/SWS(505)被从给定的ioEvent中确定。
CPS GetNextReadyFd的主要功能在步骤1050到1080中发生,其中恒定次数的算术运算被用于检查usrPtr是否在sysPtr“之后”,从而确保usrPtr永远不会在环形仓库中走到sysPtr之前。简言之,GetNextReadyFd(0花费O(1)时间来获取I/O就绪套接字fd。在BSD select中,其花费O(N)时间来通过顺序搜索输出套接字比特掩码来找到就绪套接字。
总之,以上参考图7-11所述的七种情况(来自内核的唤醒回调;到CPS的注册;从CPS的解注册;向套接字图添加套接字;从套接字图删除套接字;CPS Select调用以及检索I/O就绪套接字)描述了CPS API和CPS的示例性实施例。以上情况中的每种情况都是在O(1)时间复杂度的情况下实现的。就是说,无论在I/O复用中涉及多少套接字或文件描述符,CPS总是花费恒定时间来响应每个CPS服务请求。从计算的角度看,CPS对于I/O复用是一种优选方案。
已经利用标准MITEL MN3300IP PBX系统获得了实验性测试结果,其中PBX交换平台(即图1中的ICP控制器(100))包括450MHzPowerPC603e CPU和512MB主存储器,以支持多达1400个IP电话。
在500、1000和1400个电话的测试期间,在线的IP电话通过TCP/IP网络(130)向ICP控制器(100)生成每小时6000调用的信令流量。对于上述情况中的每一种,测得了BSD select和CPS select的执行时间。
图12示出这些时间测量的结果,从其可见,CPS select总是花费大约8微秒,而BSD select需要的时间长度与IP电话的数目成正比。例如,对于1400个IP电话,BSD select需要9.8毫秒,这是CPS select所需时间的1000倍。
I/O复用是这里所述的诸如MN3300系统之类iPBX系统中的主要瓶颈之一。在系统中的数百种任务之中,对于1400个电话,IP电话轮询任务本身消耗大约30%的CPU周期。利用这里提出的CPS算法,轮询任务只需要很小并且恒定的CPU使用比率;其中主要的CPU消耗涉及处理任务队列消息(图3中的步骤300)和从所选套接字读数据。只要总的IPPBX流量不改变,IP电话数目的增加就不会增大轮询任务的CPU开销。
总之,直接用于VoIP PBX和其他协作系统的快速并且可扩展的I/O复用方法被提出。这里提出的集中式轮询服务(CPS)的特征在于:针对I/O复用优化的O(1)算法方案,可应用于通用的TCP/IP客户端-服务器联网体系结构;它是能够建模标准BSD select服务的通用方案,并且可以在所有VxWorks平台之间迁移。
具有多达10,000条IP电话线的大系统可以按经济划算的方式来开发。现有的遗留MN3300系统可被升级,以在无需更强大的CPU硬件体系结构的情况下加倍线路数目。而且,在大交换系统中的I/O复用开销已经成为工业上的一个挑战性问题。设计用于I/O复用的专用VLSI芯片和硬件体系结构代表另一种加速数据传输并减小CPU负载的技术方向。这里提出的CPS提供了一组用C++实现的算法,作为针对该问题的经济划算的软件方案。
本说明书提出了示例性实施例。其他实施例、变化和应用是可能的。例如,这里提出的CPS起源于解决基于TCP连接的分布式客户端-服务器系统中的I/O复用问题。但是,CPS也可被用于基于UDP连接的分布式客户端-服务器系统;并且可被应用于利用TCP套接字、UDP套接字和平台所支持的其他网络连接类型的具有混合连接类型的混合体系结构。
而且,虽然这里提出的CPS针对VxWorks操作系统平台,但是其可被应用到带有文件描述符和事件类型信息的具有类似异步I/O事件服务的其他操作系统中的I/O复用。例如,可以使用修改了Linux操作系统内核的Linux平台上的CPS服务来提供与VxWorks类似的I/O唤醒调用特征。
此外,虽然CPS在说明书中被应用到IP-PBX(iPBX)系统,但是本领域技术人员将会理解,CPS可被应用到其他交换系统。很多IT或因特网服务提供商都提供各种商业服务(例如搜索服务、目录服务、银行服务、市场服务等等),用于在分布式联网系统(TCP/IP或其他遗留网络)上的基于“客户端-服务器”体系结构的大量用户。在服务器一侧的I/O复用性能与服务器吞吐量和响应性能密切相关。因此,这里提出的CPS可以有助于在很多不同的商业应用中建立大型可扩展服务器和提供经济划算的服务。
从这里的详细说明中可以发现很多特征和优点,并且所附权利要求希望覆盖所有这些特征和优点。此外,由于本领域技术人员容易发生多种修改和改变,因此不希望将权利要求的范围局限于所述和示出的确切结构和操作,因此,所有可以采取的合适的修改和等同物都落在权利要求的范围内。
Claims (21)
1.一种集中式轮询系统,用于在操作系统内核中向多个轮询任务提供恒定时间选择调用功能,所述系统包括:
到所述操作系统内核的系统接口,用于提供回调函数,所述回调函数用于返回活动套接字和相应的读/写事件类型;
用于维护所述轮询任务中的每个轮询任务的简档的数据结构,所述简档包括与每个所述轮询任务相关联的服务号和针对每个所述轮询任务的当前读和写就绪套接字;以及
应用编程接口,用于注册所述轮询任务,经由所述系统接口接收所述活动套接字和相应的读/写事件类型,针对每个所述轮询任务更新所述数据结构中的所述简档,并且在与被轮询的套接字的总数目不相关的时间内,将所述当前读和写就绪套接字返回给所述轮询任务中的相应轮询任务,
其中所述数据结构还包括:
针对所述轮询任务中的每个轮询任务分别对应于所述读/写事件类型的套接字读和套接字写字节掩码,每个所述套接字读和套接字写字节掩码由所述轮询任务中的所述一个所订购的关联的文件描述符索引,并且包含与其关联的服务号;以及
包含由每个所述服务号索引的轮询记录的服务列表,其中所述轮询记录中的每一个包括用于标识所述轮询任务中的所述一个的任务ID和环形套接字读和套接字写仓库,其中环形套接字读和套接字写仓库包含针对所述轮询任务中的所述一个的当前读和写就绪套接字,所述环形套接字读和套接字写仓库中的每一个被系统指针索引到所述回调函数用来写其I/O就绪事件已经到达的文件描述符的当前可用条目,并被用户指针索引到所述轮询任务中的所述一个用来读的当前可用条目。
2.如权利要求1所述的集中式轮询系统,其中所述应用编程接口还包括:
用于针对套接字服务并且响应于所述关联的服务号和任务ID的分配而注册所述轮询任务中的所述一个的代码;
用于从所述套接字服务中解注册所述轮询任务中的所述一个的代码;
用于针对所述读/写事件类型中的每一个将所述关联的文件描述符分别添加到所述套接字读和套接字写字节掩码的代码;
用于针对所述读/写事件类型中的每一个从所述套接字读和套接字写字节掩码中分别清除所述关联的文件描述符的代码;
用于确定与所述读/写事件类型相对应的所述活动套接字的总数目的代码;以及
用于将与所述读/写事件类型相对应的所述活动套接字返回给所述轮询任务中的相应轮询任务的代码。
3.如权利要求2所述的集中式轮询系统,其中用于添加的所述代码包括用于如下操作的代码:经由所述关联的服务号访问所述轮询记录中的每个相应的轮询记录,将所述文件描述符写所述关联的环形套接字读仓库的由所述系统指针指向的适当条目,并且递增所述系统指针,从而避免添加竞赛条件。
4.如权利要求2所述的集中式轮询系统,其中用于确定所述活动套接字的总数目的所述代码包括选择函数调用。
5.如权利要求4所述的集中式轮询系统,其中所述选择函数调用具有预定的超时值。
6.如权利要求5所述的集中式轮询系统,其中所述超时值的缺省值为0。
7.如权利要求4所述的集中式轮询系统,其中所述选择函数调用包括用于如下操纵的代码:通过对所述环形套接字读和套接字写仓库中的相应仓库中的、在所述用户指针和所述系统指针之间的条目的数目进行计数,来确定所述活动套接字的总数目。
8.如权利要求2所述的集中式轮询系统,其中用于返回所述活动套接字的所述代码包括获取下一函数调用。
9.如权利要求8所述的集中式轮询系统,其中所述获取下一函数调用包括用于如下操作的代码:在所述用户指针落后于所述系统指针的情况下,检索和返回所述环形套接字读和套接字写仓库中的由所述用户指针指向的相应条目并且递增所述用户指针,否则,返回表明没有进一步的I/O就绪事件已被记录的指示。
10.如权利要求1所述的集中式轮询系统,还包括覆盖机制,用于允许服务号列表与每个所述套接字读和套接字写字节掩码的单个条目相关联。
11.一种集中式轮询方法,用于在操作系统内核中向多个轮询任务提供恒定时间选择调用功能,所述方法包括:
提供回调函数,所述回调函数用于返回活动套接字和相应的读/写事件类型;
维护所述轮询任务中的每个轮询任务的简档,所述简档包括与每个所述轮询任务相关联的服务号和针对每个所述轮询任务的当前读和写就绪套接字;
注册所述轮询任务;
接收所述活动套接字和相应的读/写事件类型;
针对每个所述轮询任务更新所述简档;以及
在与被轮询的套接字的总数目不相关的时间内,将所述当前读和写就绪套接字返回给所述轮询任务中的相应轮询任务,
其中所述维护所述轮询任务中的每个轮询任务的简档包括:
针对所述轮询任务中的每个轮询任务分别维护对应于所述读/写事件类型的套接字读和套接字写字节掩码,每个所述套接字读和套接字写字节掩码包含针对所述轮询任务中的每一个的关联的服务号;
利用由所述轮询任务中的所述一个所订购的关联的文件描述符,来索引每个所述套接字读和套接字写字节掩码;
维护包含由每个所述服务号索引的轮询记录的服务列表,其中所述轮询记录中的每一个包括:用于标识所述轮询任务中的所述一个的任务ID,和包含针对所述轮询任务中的所述一个的当前读和写就绪套接字的环形套接字读和套接字写仓库;以及
利用系统指针将所述环形套接字读和套接字写仓库中的每一个索引到所述回调函数用来写其I/O就绪事件已经到达的文件描述符的当前可用条目,并利用用户指针将所述环形套接字读和套接字写仓库中的每一个索引到所述轮询任务中的所述一个用来读的当前可用条目。
12.如权利要求11所述的集中式轮询方法,其中注册套接字服务包括分配所述关联的服务号和任务ID。
13.如权利要求11所述的集中式轮询方法,其中所述更新包括:
针对所述读/写事件类型中的每一个,将所述关联的文件描述符分别添加到所述套接字读和套接字写字节掩码;
针对所述读/写事件类型中的每一个,从所述套接字读和套接字写字节掩码中分别清除所述关联的文件描述符;以及
确定与所述读/写事件类型相对应的所述活动套接字的总数目。
14.如权利要求13所述的集中式轮询方法,其中所述添加包括:经由所述关联的服务号访问所述轮询记录中的每个相应的轮询记录,将所述文件描述符写所述关联的环形套接字读仓库的由所述系统指针指向的适当条目,并且递增所述系统指针,从而避免添加竞赛条件。
15.如权利要求13所述的集中式轮询方法,其中确定所述活动套接字的总数目包括选择函数调用。
16.如权利要求15所述的集中式轮询方法,其中所述选择函数调用具有预定的超时值。
17.如权利要求16所述的集中式轮询方法,其中所述超时值的缺省值为0。
18.如权利要求15所述的集中式轮询方法,其中所述选择函数调用包括:通过对所述环形套接字读和套接字写仓库中的相应仓库中的、在所述用户指针和所述系统指针之间的条目的数目计数,来确定所述活动套接字的总数目。
19.如权利要求11所述的集中式轮询方法,其中返回所述活动套接字包括获取下一函数调用。
20.如权利要求19所述的集中式轮询方法,其中所述获取下一函数调用包括:在所述用户指针落后于所述系统指针的情况下,检索和返回所述环形套接字读和套接字写仓库中的由所述用户指针指向的相应条目并且递增所述用户指针,否则,返回表明没有进一步的I/O就绪事件已被记录的指示。
21.如权利要求11所述的集中式轮询方法,还包括将至少一个附加服务号与每个所述轮询任务相关联。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US11/903,438 | 2007-09-21 | ||
US11/903,438 US8006005B2 (en) | 2007-09-21 | 2007-09-21 | Centralized polling service |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101393527A CN101393527A (zh) | 2009-03-25 |
CN101393527B true CN101393527B (zh) | 2013-04-10 |
Family
ID=39706038
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008101662028A Expired - Fee Related CN101393527B (zh) | 2007-09-21 | 2008-09-22 | 集中式轮询服务 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8006005B2 (zh) |
EP (1) | EP2034408A3 (zh) |
CN (1) | CN101393527B (zh) |
CA (1) | CA2629694C (zh) |
Families Citing this family (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7778191B2 (en) * | 2008-12-12 | 2010-08-17 | Mitel Networks Corporation | System and method for fast detection of communication path failures |
US8886664B2 (en) | 2010-05-13 | 2014-11-11 | Microsoft Corporation | Decreasing duplicates and loops in an activity record |
JP5876647B2 (ja) * | 2010-11-18 | 2016-03-02 | 株式会社オプティム | ポーリングによる通信接続システム、方法及びプログラム |
CA2745823C (en) | 2010-11-23 | 2014-06-17 | Mitel Networks Corporation | Fast detection and reliable recovery on link and server failures in a dual link telephony server architecture |
US8345840B2 (en) | 2010-11-23 | 2013-01-01 | Mitel Networks Corporation | Fast detection and reliable recovery on link and server failures in a dual link telephony server architecture |
US8451828B2 (en) | 2010-11-23 | 2013-05-28 | Mitel Network Corporation | Registering an internet protocol phone in a dual-link architecture |
US9154580B2 (en) * | 2012-02-01 | 2015-10-06 | Tata Consultancy Services Limited | Connection management in a computer networking environment |
CN102938783A (zh) * | 2012-10-30 | 2013-02-20 | 中兴通讯股份有限公司 | 一种Socket处理方法、装置和Web服务器 |
CN103347012A (zh) * | 2013-06-21 | 2013-10-09 | 烽火通信科技股份有限公司 | 一种通用ip协议栈事件通知系统及方法 |
US9427592B2 (en) * | 2013-08-28 | 2016-08-30 | Pacesetter, Inc. | Systems and methods for low energy wake-up and pairing for use with implantable medical devices |
US10891651B1 (en) * | 2014-03-12 | 2021-01-12 | Groupon, Inc. | Method and system for launching application programs using promotion impressions |
US10937062B1 (en) * | 2014-03-12 | 2021-03-02 | Groupon, Inc. | Method and system for facilitating download of application programs on mobile computing device |
US11010793B1 (en) * | 2014-03-12 | 2021-05-18 | Groupon, Inc. | Method and system for determining user profile data for promotion and marketing service using mobile application program information |
US10269043B1 (en) | 2014-03-12 | 2019-04-23 | Groupon, Inc. | Method and system for distribution of application program for promotion and marketing service |
US10846749B1 (en) | 2014-03-12 | 2020-11-24 | Groupon, Inc. | Method and system for offering promotion impressions using application programs |
US11042904B1 (en) * | 2014-03-12 | 2021-06-22 | Groupon, Inc. | Method and system for detecting application programs on mobile computing device |
CN105653252A (zh) * | 2014-11-21 | 2016-06-08 | 北京信威通信技术股份有限公司 | 一种linux下扩展select模型管理能力的方法 |
CN105162727B (zh) * | 2015-08-13 | 2017-12-01 | 东方电子股份有限公司 | 一种基于VxWorks系统在DSFA系统中实现快速对等通信的方法 |
CN105760216A (zh) * | 2016-02-29 | 2016-07-13 | 惠州市德赛西威汽车电子股份有限公司 | 一种多进程同步控制方法 |
US10127091B1 (en) * | 2016-12-22 | 2018-11-13 | Juniper Networks, Inc. | Intercepting socket metadata |
CN108563493A (zh) * | 2018-04-12 | 2018-09-21 | 郑州云海信息技术有限公司 | 一种事件驱动方法、装置、设备及可读存储介质 |
CN109413064B (zh) * | 2018-10-24 | 2021-04-27 | 同方电子科技有限公司 | 单网卡VxWorks系统与多主机间应用层协议报文处理方法 |
CN109634664B (zh) * | 2018-12-17 | 2020-12-01 | 深圳忆联信息系统有限公司 | 一种cpu给硬件电路下发命令描述符的方法及装置 |
CN110852603B (zh) * | 2019-11-07 | 2022-07-15 | 武汉极意网络科技有限公司 | 高吞吐量的风控数据处理方法、装置、设备及存储介质 |
CN111870939B (zh) * | 2020-07-09 | 2024-07-30 | 天津津航计算技术研究所 | vxworks系统下基于信号量事件的操纵杆串口驱动设计方法 |
CN112559210B (zh) * | 2020-12-16 | 2024-05-07 | 北京仿真中心 | 一种基于rtx实时系统的共享资源读写互斥方法 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5752159A (en) * | 1995-01-13 | 1998-05-12 | U S West Technologies, Inc. | Method for automatically collecting and delivering application event data in an interactive network |
US5828882A (en) * | 1996-03-15 | 1998-10-27 | Novell, Inc. | Event notification facility |
US7051337B2 (en) * | 2000-04-08 | 2006-05-23 | Sun Microsystems, Inc. | Method and apparatus for polling multiple sockets with a single thread and handling events received at the sockets with a pool of threads |
KR100451721B1 (ko) * | 2000-12-30 | 2004-10-08 | 엘지전자 주식회사 | 이동통신 시스템에서의 프로세서간 정합 방법 |
US7707287B2 (en) * | 2002-03-22 | 2010-04-27 | F5 Networks, Inc. | Virtual host acceleration system |
GB0225428D0 (en) * | 2002-10-31 | 2002-12-11 | Mitel Knowledge Corp | Call redirection zones for wireless communications |
US7565662B2 (en) * | 2004-09-24 | 2009-07-21 | International Business Machines Corporation | Program agent initiated processing of enqueued event actions |
US7778191B2 (en) * | 2008-12-12 | 2010-08-17 | Mitel Networks Corporation | System and method for fast detection of communication path failures |
-
2007
- 2007-09-21 US US11/903,438 patent/US8006005B2/en active Active
-
2008
- 2008-03-19 EP EP08102760A patent/EP2034408A3/en not_active Withdrawn
- 2008-04-24 CA CA2629694A patent/CA2629694C/en active Active
- 2008-09-22 CN CN2008101662028A patent/CN101393527B/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
EP2034408A3 (en) | 2010-11-10 |
US8006005B2 (en) | 2011-08-23 |
CA2629694C (en) | 2013-06-25 |
CN101393527A (zh) | 2009-03-25 |
CA2629694A1 (en) | 2009-03-21 |
EP2034408A2 (en) | 2009-03-11 |
US20090083455A1 (en) | 2009-03-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101393527B (zh) | 集中式轮询服务 | |
CN109684358B (zh) | 数据查询的方法和装置 | |
US10169060B1 (en) | Optimization of packet processing by delaying a processor from entering an idle state | |
US8832063B1 (en) | Dynamic request throttling | |
Lin et al. | A dynamic load-balancing policy with a central job dispatcher (LBC) | |
US9083614B2 (en) | System and method for supporting out-of-order message processing in a distributed data grid | |
CN101800762A (zh) | 一种对多个业务进行融合的业务云系统及业务实现方法 | |
CN107566508A (zh) | 一种自动化运维的短信微服务系统 | |
US8305911B2 (en) | System and method for identifying and managing service disruptions using network and systems data | |
CN113422842B (zh) | 一种考虑网络负载的分布式电力用电信息数据采集系统 | |
CN105760240A (zh) | 分布式任务处理方法及装置 | |
US9846618B2 (en) | System and method for supporting flow control in a distributed data grid | |
US10095562B2 (en) | System and method for transforming a queue from non-blocking to blocking | |
CN102761528A (zh) | 数据管理系统及方法 | |
US9110715B2 (en) | System and method for using a sequencer in a concurrent priority queue | |
US20130054735A1 (en) | Wake-up server | |
CN110113406A (zh) | 基于分布式的计算服务集群框架 | |
CN100525211C (zh) | 一种在网元管理系统中实现集中调度的系统 | |
CN106294261A (zh) | 一种高性能实时响应的服务器架构 | |
CN105830029B (zh) | 用于在计算环境中支持自适应忙等待的系统和方法 | |
JP3908589B2 (ja) | 通信システム、コネクション管理サーバ装置及びプログラム | |
MXPA00000525A (es) | Sistema y metodo para detectar sobrecarga en un servicio de punto de control de una red de telecomunicaciones. | |
WO2022021858A1 (zh) | 实现分布式系统中高负载场景下服务高可用的方法、系统 | |
CN107329707A (zh) | 统一存储的多存储设备管理方法、系统及gui管理系统 | |
US10116540B1 (en) | System, method, and computer program for managing data objects in a multiprocessor unit telecommunications network |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130410 Termination date: 20170922 |
|
CF01 | Termination of patent right due to non-payment of annual fee |