集中式轮询服务的制作方法

文档序号:6467055阅读:252来源:国知局
专利名称:集中式轮询服务的制作方法
技术领域
本发明一般地涉及客户端-服务器系统,更具体而言,涉及用于VoIP 和协作系统的套接字处理问题。
背景技术
当前,VoIP和协作系统使用标准商业操作系统(例如VxWorks)来 实现规模经济效益。VxWorks是一种单进程操作系统(其来源于UNIX系 统的通用BSD 4.3),其中所有并发线程(或任务)共享一个全局存储空 间。最初,假设每个UNIX进程具有少量(例如64个)文件描述符(也 称之为套接字),但是VxWorks将其扩展到一个更大集合(例如2048 个)。
标准商业操作系统提供有套接字处理设施,该套接字处理设施的设计 基于对VoIP和协作系统而言不再有效的假设。例如,VxWorks利用轮询 系统(polling system),该轮询系统在扩展使用相对较少套接字的情况下 达到其最高效率,而VoIP系统通常具有大量外围设备,其中每个外围设 备都需要被提供以套接字服务,即使在重负载条件下,这些套接字服务也 会导致相对较轻的套接字使用。
通常,利用工业标准(即BSD 4.3可兼容的)套接字服务(例如 "w/e"(选择)"或"/^// (轮询)")来对大量套接字执行I/O复用。 但是,标准套接字服务的使用导致高计算开销和极差的可扩展性。具体而 言,在每个轮询任务上,操作系统(OS)内核必须搜索很多套接字才能找 到具有活动事件的相对较少的套接字,并且其一次必须针对活动的若干应 用中的每一个这样做。
一般而言,存在三种用于套接字I/O复用的基本模型或方法。第一方 法是针对每个TCP连接产生一个任务(即线程),其中每个任务处理一个
套接字I/O。但是,该方法只对小而简单的系统有效。其无法被应用到处 理大量套接字的系统,因为其在系统中导致创建大量任务,从而导致高存 储器成本和过度系统处理开销。
第二方法是使用单个任务控制(即复用) 一组套接字。该任务连续进
行带有预定非零超时(timeout)值的w/e"调用(即select()),该预定非 零超时值允许select()调用等待,直到I/O事件在等待时间期满之前到达任 意给定套接字。
第三方法(这里称之为"轮询模型")类似于第二方法,异常之处在 于其周期性地轮询套接字集合,其中每次j^〃调用(即po110)立即返 回。通过轮询套接字,与第二方法相比,可以通过不太频繁地进行系统调 用以及利用每次调用收集更多I/O就绪套接字事件来减小计算开销。但 是,"轮询模型"方法的一个问题在于其对I/0事件引入了响应延迟。
应该注意,VxWorks不支持poll()。但是,本领域技术人员将意识 到,具有零超时值的"^/w"调用在逻辑上等同于poll()。 ^/e"和; o〃理 论上具有相同的计算复杂性(但是在某些操作系统中,/^//可能比^/e" 具有少量改进因素)。由于所有这些系统都需要顺序检査N个套接字的列 表,因此为了方便起见,本说明书可互换使用术语"^/e""和"/x /Z"。
启发式方法(heuristic method)已被用于找到针对特定系统的轮询间 隔或轮询窗(PW)的最佳值。通常,PW与一组系统属性相关,例如所 支持的IP电话的最大数目;最大流量吞吐量(每小时调用,Calls-Per-Hour);最小I/0延迟等等。
N的增大导致PW的增大。但是,增大的N还与增大的流量需求相关 联,增大的流量需求进而需要更小的PW。减小PW值将增大流量吞吐量 (或减小I/0延迟);但是将增大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内核 被重新编译以使得w/ec/服务支持2048、 4096和8192个文件描述符,从 而容纳更多的IP电话。
在现有技术MN 3300系统中, 一个任务是负责每隔PW = 40毫秒轮询 TCP套接字。因此,对于针对N = 1400个电话并且在CPU使用饱和级别 上大约8000 CPH流量吞吐量设计的MN3300系统而言,将PW从40毫秒 减小到20毫秒可以导致某种iPBX服务中断(outage)。为了支持更大的 系统,例如N:3000, MN3300系统需要增大其CPU容量。

发明内容
一种集中式轮询服务(CPS)被提出,其提供了与现有技术w/e"服 务(例如VsWorks ^/e"服务)等同的功能,但是其计算复杂度仅为 0(1)。下面将更详细描述的CPS提供了针对用户应用优选的1/0复用,并 且不会影响内核w/e"服务。
从计算复杂度的角度看,这里提出的方法和装置是优选的,因为无论 套接字数目有多少,都执行可预测的恒定数目个步骤,以检测1/0相关的 事件。换言之,所公开的方法消除了上述在建立大型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 call back)进程的流程图7是示出图2的集中式轮询服务(CPS)的用于添加新套接字的轮 询任务的流程图8是示出图2的集中式轮询服务(CPS)的用于删除或清除套接字 的轮询任务的流程图9是示出图2的集中式轮询服务(CPS)的用于返回可用套接字的 数目的^/e"调用进程的流程图IO是示出图2的集中式轮询服务(CPS)的用于一次返回一个套接 字文件描述符的获取下一API的流程图;以及
图11示出与BSD w/e"相比,CPS w/ec/的时间测量的实验性测试结 果的结果。
具体实施例方式
参考图1,所示示例性通信系统包括连接到局域网或LAN (130)以 及公共交换电话网(PSTN)的通信交换机,例如由Mitel Networks公司 制造的MN3300, ICP (100)。诸如电话l、电话2、...电话1400之类的 多个IP电话设备被连接到LAN (130)。
本领域技术人员将意识到,图1的配置是典型覆盖式通信网络的代 表,并且在配置、组件等方面可能存在多种变化。
在图1的示例性实施例中,ICP (100)充当服务器的角色以支持多达 N二1400个IP电话客户端。每个IP电话与ICP (100)建立一个TCP套接 字连接以用于信令目的。ICP (100)对非常大量的TCP套接字执行I/0复 用,以便与IP电话通信。如上所述,诸如或 >〃"之类在ICP 中执行套接字I/O复用的工业标准(即UNIX BSD 4.3可兼容的)套接字 服务的使用会导致高计算成本,该计算成本直接与N (套接字的总数目) 成正比。对于并入了 450MHz PowerPC处理器的现有技术MN300 ICP (100)而言,1400个TCP套接字的单次扫描花费大约IO毫秒。总之, 即使在ICP (100)和IP电话之间不存在调用处理流量时,联网的1/0功 能也将消耗25%的CPU资源。当系统线大小(N)增大时,计算开销也 增大,结果是现有平台硬件体系结构最终需要被更强大的CPU所取代, 以便满足增大的计算资源需求。
这里参考下面图2-10的示例性实施例提出的集中式轮询服务(CPS) 在很少的恒定时间(例如,通常少于8微秒而不是如现有技术的9.8毫 秒,或者大约比现有技术的方案快1000倍)内完成对于任意数目的套接
字的"w/e""功能。此外,这里提出的CPS完全是可扩展的,因为其计 算时间即使在TCP套接字的总数目增大到N=10,000或更多的情况下也保 持不变。
这里描述的CPS的直接实践商业益处在于其提供了省钱的替代方 案,用来建立大企业系统和基于服务器的应用。例如,其可以极大地增大 现有IPBX系统的IP电话线尺寸并且无需任何主要体系结构的改变和投 资。
如上所述,用于Mitel MN3300 ICP平台中的示例性ICP (100)的操 作系统(OS)是VxWorks, VxWorks是一种适合于实时嵌入式计算的流 行的UNIX类操作系统。VxWorks提供如下UNIX BSD 4.3可兼容的 ■ye/e"月艮务-
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参数指向指定该文件描述符用于检査写的比 特掩码。已被设置的比特致使sdect()保持未决,直到相应文件描述符中 的任何一个变为可写。pExceptFds参数指向指定该文件描述符用于检査异 常条件的比特掩码。当前在VxWorks中未使用pExceptFds参数,但是其 被提供以用于UNIX调用可兼容。
因此,针对Z,^/f在一组套接字文件描述符上的化/e"可以监视任意 连接的套接字,以确定数据何时到达以及数据何时准备好在无阻挡 (blocking)的情况下被读(用于z'o"/系统调用的FIONREAD参数被用
于确切地确定有多少数据可获得)。针对读事件在一组套接字文件描述符
上的w/e"还可以监视任意侦听(listening)套接字,以确定何时可以在 无阻挡的情况下接受连接,并且还可以监视任意套接字,以检测是否在套 接字上出现差错。
针对写^"/f^在一组套接字描述符上的"/e"可以监视任意连接的套接 字,以确定何时完成连接,并确定何时可以在无阻挡的情况下发送更多数 据(即至少一个字节可被发送),并且检测是否在套接字上出现差错。
针对#,事伴的w/e"将针对具有可被读的带外数据的套接字返回 "真"。^/e"还针对不再能够被使用的套接字返回"真"(例如,如果 己针对其执行了关闭或中断的系统调用)。
宽度参数定义在文件描述符集合中多少比特被检査,并且应被设置为 使用中的最大文件描述符值加1或简单地设置为内核硬编码的 FD一SETSIZE。例如,在示例性MN3300系统中(例如图1所示), VxWorks内核可以利用FD—SETSIZE-8192来重新编译。
如果pTimeOut为NULL, select()则将不确定地阻挡。如果pTimeOut 不为NULL,但是指向有效时间为0的"'mera/结构,文件描述符集合中 的文件描述符则将被轮询,并且结果被立即返回。如果有效时间值大于 0,则select()将在超过指定时间之后返回,即使没有文件描述符准备就绪 也是如此。
当select()返回时,其报告有多少文件描述符准备就绪,并且将文件 描述符设为0,并且仅仅设置与准备就绪的文件描述符相对应的比特。
现有技术公知的select()的内核实现方式包括在select()时唤醒系统中 的所有未决任务(或进程),从而使得每个任务可以检查其输入比特掩码 以寻找与之关联的1/0事件已经到达的描述符。利用sdect()的任务必须再 次对返回的比特掩码执行顺序搜索,以便找到哪个套接字fd已经准备就 绪。
如上所述,这总计O(N)计算时间复杂性的开销,其中N是所使用的 套接字文件描述符的最大数目。简言之,^/e"的计算时间直接与N成比 例,从而使得当N很大时,出现高计算开销和较差的可扩展性问题。 下面更详细描述的集中式轮询服务(CPS)动态地管理每个轮询任务
的简档(profile),所述简档包含任务ID、当前轮询套接字和轮询结果。 其提供与w/M调用类似的功能,但是绕过了标准内核化/M服务。这里 提出的CPS包含与1/0事件异步的内核套接字,并且按恒定时间更新轮询 任务的简档。这确保了在提供轮询服务时O(l)计算复杂性。现有技术的 w/e"调用中的O(N)开销从而被消除。这里提出的CPS针对用户应用独立 地提供最优的I/O复用选择,并且不会影响内核^/e"服务。
返回图2, CPS的功能框图被提出。本领域技术人员将意识到,图2 的框图和以下描述仅仅是示例性的。示例性CPS API的详细描述下面将参 考图3-10提出。
如图2所示,对每个fd的读和写套接字事件(200)被OS内核观察 和处理(210),并经由VxWorks的回调功能(下面将参考图4B对此进 行详细描述)被提供到CPS的其余部分。回调功能针对每个事件调用 CPS功能。读和写字节掩码(220)(也称之为套接字图(Socket Map))被fd索引,并且包含己经注册将被告知事件的应用(225)的服 务号。CPS使用服务号来索引服务列表,如下面参考图5将更详细描述 的。服务列表是记录列表,其中每张列表除了其他元素之外还包含读和写 仓库(store) (505),用于存储针对由服务号标识的应用的读和写套接 字事件(即CPS将事件的fd写适当的仓库中)。以适当的间隔,应用 (225)可以轮询活动事件。
简要地返回CPS应用编程接口 (API),标准^/e"服务要求调用者 在每次调用时提供文件描述符(fd)的输入比特掩码,即使从同一调用者 上次调用起比特掩码不存在改变也要提供。这对于w/e"服务需要O(N)时 间来检査输入比特掩码(220)。在示例性MN3300系统中, 一旦IP电话 被加电并被注册到ICP控制器(100) , TCP套接字就在所有时间保持打 开(99.999%可获得)。CPS的示例性实施例的一个方面在于用户任务不 需要每次都提供这种套接字比特掩码信息。相反,CPS针对每个调用者任 务保存集中式轮询套接字图,并且允许任务动态地从其图中添加/清除套 接字。
类似地,标准的^/e"服务返回活动文件描述符的总数目以及输出比 特掩码。因此,调用者任务必须搜索比特掩码以找到哪个文件描述符是活 动的,这也要花费O(N)时间。在CPS中,由于活动的文件描述符被保存 在包含读和写仓库的服务列表上,因此该开销被消除。CPS w/ed回调活 动套接字fd的数目,并且调用者任务简单地执行"获取下一个"动作来 检索所有活动的文件描述符。
为了示出示例性实施例,用于IPBXI/0复用的轮询模型被描述,然 后描述O(l)时间复杂性集中式轮询服务以及描述实现结果和性能比较。
为了使离线的IP电话(或IP设备)利用ICP (100)上线,存在两个 连续阶段信令传输链路(STL)建立阶段和设备注册阶段。在STL建立 阶段,在远程IP设备和ICP (100)之间建立TCP套接字连接,或者完成 TCP 3路握手协议。如果安全链路将被建立,则还要执行额外的安全性协 商。在设备注册阶段,在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复用基于轮询模型,其中单个轮 询任务周期性地在针对特定服务相关联的一组套接字上执行用于读/写数 据的化/e"调用。例如,IP电话服务执行这种轮询任务,而IP中继执行 具有相同结构的另一轮询任务。在MN3300系统中,轮询任务被实现为标 准C+十类。
图3示出轮询任务的主循环的功能框图。在步骤300处,对来自其队 列或邮箱的处理消息执行(例如每隔PW=40毫秒)任务队列处理循环。 如下所述,来自系统的所有套接字服务请求和任务间通信都在该循环中被 处理。具体而言,在步骤300处的循环提供套接字状态处理并向网络 LAN (130)发出数据。在MN3300系统中,套接字在任意时刻可以具有 来自以下套接字状态集的状态之一SM-f无褒、銜银、遂接、凝连麥、 ^^、 S/刀欧、关/^、凝^关/坊。处于"侦听"状态的套接字准备好接受 传入的连接请求。处于"连接"状态的套接字准备好发出外出连接。侦听 套接字被放到套接字图上,以检测传入的连接请求上的"读就绪"事件
(读字节掩码)(步骤310)。对于连接套接字,连接请求在步骤300处 的循环内立即发起。但是,如果不存在来自远端的连接响应,套接字状态
"连接"则被记录,并且套接字被放到套接字图上,以检测随后将被处理
(步骤340)以用于处理传出连接的"写就绪"事件(写字节掩码)。数 据到网络LAN (130)的发送经由提供到给定套接字的标准BSD "写"操 作被执行。应该注意,输出套接字fd没有被放到套接字图上以用于检测
"写就绪"事件。select()的写比特掩码被用于连接套接字,如上所述。这 是因为本地列表可被用于跟踪所有已知套接字的输出状态。
在步骤310处,其他系统维护动作被执行,并且如果套接字已被打开 或删除,则更新套接字图(220)中的套接字记录,如下面将参考图5更
详细描述的,套接字图是一种数组或表数据结构,用于保存所有当前订购 的套接字记录并且将套接字fd用作索引密钥。例如,在IP电话服务中,
当1400个IP电话上线时,1400个TCP套接字被记录在该图上。
在步骤320处,BSD 4.3 se/e"调用被执行,其中超时值被设为0,以 使其无论是否存在任何套接字I/O事件都是一个无阻挡调用。w/e"回调 所有"读就绪"和"写就绪"1/0事件,如上所述。
套接字在步骤330处被读,步骤330代表I/O复用操作的主要"输 入"部分。在返回w/e"调用之后,活动1/0套接字的数目是已知的。图 4A中的G"A^cW^办i^方法被用于取得套接字事件。相应的动作基于给 定套接字的状态而被作出。例如,如果带有读事件的套接字处于"侦听" 状态,则标准的BSD "接受"被应用到新的连接,该新的连接创建新的 套接字,并且返回指向新的套接字的文件描述符(fd)。对于该新的套接 字,额外的套接字处理被立即转移到更高层的套接字处理器任务,以使得 轮询任务可以继续读下一套接字。另一方面,套接字处理器任务可以判断 是否需要耗时的安全连接协商(例如SSL握手)。 一旦完成,"^^字 请求就被发回轮询任务,以通知该套接字准备好接收和发送应用数 据。应该注意,"^#字/7^/"消息无法在步骤330处被处理。相反,
"*:麥字/刀欧"消息在轮询任务循环回到步骤300时被处理。如果协商成 功,则将新的套接字设置为"3/7,"状态,并且套接字fd被放到套接 字图(图5)上,以用于检测接收传入数据的读就绪事件(读字节掩 码)。如果协商失败,则关闭TCP连接。如果套接字处于"^ "状 态,则将标准的BSD "读"动作应用到套接字以接收应用数据。
如结合"任务队列处理循环"300所述,连接的套接字可以完成未决 的连接。如果w/e"调用(步骤320)指示连接套接字上的写就绪事件, 则执行步骤340以处理传出连接。当接受连接时,如果连接将是安全链 路,则可以将新连接通知安全性协商器任务。如果连接成功,新的被订购 的套接字则被放到套接字图上以用于检测"读就绪"事件。此后,新链路 上传入的数据可以从随后的轮询周期中接收。
一般而言,套接字数据输出功能只在"任务队列处理循环"(步骤
300)中被处理;并且套接字数据输入功能在"读套接字"(步骤330) 中执行。轮询任务每隔40毫秒发起^/e"调用(步骤320),并且提供用 于接受客户端(例如IP电话服务)连接请求或用于发起ICP间连接请求 (例如IP中继服务)的全面套接字服务集合。
根据示例性实施例,CPS用C十+实现。图4A所示CPS API的代码段 被执行以访问CPS服务。具体而言,轮询任务调用 ^&他WonSbd:"&rWce()以注册到CPS并接收有效的(大于0)"服务 号"。轮询任务还可以通过调用De/ eg&^^onfodbferWce()来停止使用 CPS (例如在系统关断时)。应该注意,为了系统安全性和可靠性方面的 考量,"任务ID"和"服务号"必须一起使用以访问CPS的其他服务。
^W(9调用允许轮询任务针对给定的I/O事件(7 £L4Z)=^『i /r£"=7) 向其轮询套接字图添加新的套接字fd。 c/^0函数允许轮询任务针对给定 事件从其轮询套接字图中删除套接字。
在正常轮询周期中,CPSw/e"调用(步骤320)被轮询任务用来分 别找到将读或写的活动套接字的当前总数目。类似于BSD 4.3 select0, CPS w/ed调用允许用户任务以毫秒为单位指定"超时"值,该值对于轮 询模型被缺省地设为0。最终,G^VexW^办F《)调用被用于取得CPS Select()调用所报告的I/O就绪文件描述符。
据此,本领域技术人员将意识到,CPS按如下方式建模三部分的 BSD 4.3 select()调用功能(1)更新输入套接字掩码;(2)找到I/O就 绪套接字的总数目;并且(3)检索输出套接字。如下将更详细描述的, 图4A中的每次CPS API功能调用在O(l)时间内完成。
现在转到CPS系统接口,根据CPS的实施例的一个方面,与操作系 统内核中的BSD-^/ed实体接收的相同的异步I/O事件被获得。BSD-w/e"接收的原始输入信息需要被用来书写快速并且可扩展的CPS-w/e" 设施。所需的特定信息是活动套接字文件描述符(fd)以及相应的I/O事 件类型(READ或WRITE)。
如图4B所示,select()的典型实现方式被利用,其中内核调用
唤醒在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+l个条目的列表,其中max_fd是系统所支持 的套接字的最大数目。例如,在支持1400个IP电话的MN3300系统中, max_fd被配置为2000,并且用于两个图的存储器成本仅仅是4K字节。 这样一来,套接字图可以通过套接字fd来索引。套接字图被表示为八位 组(因此称之为字节掩码),这不同于BSD 4.3 w/e"服务的比特掩码。 例如,当利用来自内核的回调函数访问套接字图时,字节操作比比特操作 更快。已经被初始化为0 (或"空")的字节掩码可被CPS用来记录"服 务号","服务号"代表轮询任务针对与仓库相关联的I/O事件对被索引 的fd的订购。
可以作出若干意见。首先,套接字图在逻辑上被服务号所划分。具有 同一服务号的所有条目与一个分区相关联,其中服务号是在注册时由CPS 赋予轮询任务的号码。其次,套接字图可以同时容纳最多255个轮询任 务。将条目尺寸从字节增大到字可以有效地消除CPS中的这种局限。第 三,套接字fd无法同时被具有不同服务号的两个轮询任务所订购。套接 字冲突(试图读和/或写同一套接字的两个应用)从而在CPS中被避免。
BSD 4.3 w/e"服务不受诸如以上第三种意见之类的限制所局限。多 个应用可以从两个BSD 4.3 select()调用访问一个套接字。虽然套接字冲突 没有被CPS直接支持,但是其可以通过覆盖(overlay)机制来实现,所 述覆盖机制允许服务号列表与套接字图的条目相关联。但是,在大多数应 用中,支持套接字冲突不是必需的。实际上,在MN3300 IP PBX系统
中,必须强制具有第三种意见,即安全并可靠的通信。
如图5所示,",^多/y表"数据结构保存CPS中的轮询记录的列 表。在成功注册到CPS之后,轮询任务在服务列表(500)上创建轮询记 录,其中赋予轮询任务的服务号是轮询记录到列表的索引。如果只有一些 任务执行联网的I/O复用,例如在示例性的MN3300 ICP控制器(100) 中,则在实践中,服务列表(500)非常短。CPS注册可以在仅仅Of"中 完成,因为服务列表(500)的长度是很小的常数。对于大服务列表,可 以使用其他合适的数据结构(例如散列表、自由服务号池)。不管怎样, 轮询任务只需要在轮询套接字之前的系统配置期间向CPS注册一次。
轮询记录包含关于轮询任务的所有必要信息,例如任务ID。两种环 形列表(505 )被提供套接字读仓库(SRS)和套接字写仓库 (SWS)。每个仓库与一个唤醒标志以及一个唤醒信号量(在510处示意 性地示出的二进制信号量)相关联,所述唤醒标志和唤醒信号量对于支持 MN3300轮询模型(即超时值为0的w/ec/调用)不是必需的,但是它们 被提出以显示CPS可以提供具有非零超时值的通用BSD 4.3 w/e"功能。
SRS/SWS (505)被用于保存针对相应轮询任务的当前读/写就绪套接 字文件描述符。每个仓库具有^5尸化其指向系统(例如内核回调功能) 当前可用于写具有已经到达的1/0就绪事件的套接字fd的条目。在每次写 操作之后,w^^被移动,以使其指向下一可用条目。每个仓库还具有 ^W,其指向轮询任务可以读的当前条目。在每次读操作之后,当前条 目通过重置到0而被"清洗";并且"w/^被移动,以使其指向下一可用 条目。在轮询模型中,当系统报告新的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内核中调出waA:ei^Ca〃Z^cA:(^ra" socA:" *犯,5^Z^rr一7T尸E HY^ewp7);;^时,其指示文件描述符fd具有I/O 事件SELEAD或SELWRITE (图6的流程图中的步骤600)。
在步骤610处,从给定的M》wJ^索引到图5中的套接字图(220) 的右侧,如果条目为空(步骤620处的"是"),则退出调用(步骤 660)。否则,条目的值被用作"服务号"以索引服务列表(500),从而 找到用于轮询任务的相关记录(步骤630)。
在步骤640处,文件描述符(fd)被直接添加到准备好检索的轮询任 务的fd列表。步骤650在唤醒标志没有设置(即步骤645处的"否") 的情况下被跳过。对于轮询模型,其中CPS化/e"调用具有超时值0 (即 在步骤645处表明唤醒标志已被设置的"是"确定),轮询任务被唤醒 (步骤650)。步骤650示出CPS轮询服务可以建模所有标准的BSD选 择服务。
显而易见,图6中的每个单个步骤花费0(1)时间。
回顾图5可知,服务列表(500)中的每个记录包含针对每个服务号 的读和写事件仓库(505)。另外,每个记录包含针对该服务号的唤醒标 志和唤醒信号量(510)。这些实体赋予CPS提供由标准BSD^/erf调用 所提供的超时功能的能力。如果CPS从提供非0超时值的应用接收w/e" 调用,则设置唤醒标志并使唤醒信号量上的调用未决,从而提供由BSD
Unix所提供的超时功能。
轮询《壬务j吏用CPS API i egz'We^bnSodhSen^ce (int taskld, int & serviceNum)注册到CPS,其中taskld可以是标识调用者的任意唯一号码, 并且对serviceNum的引用允许调用者从CPS接收"服务号"。在接收到 注册请求之后,CPS检査其服务列表(500)以找到下一空条目的索引。 轮询记录随后被建立,并且索引值被赋予serviceNum。
当从CPS解注册时(即使用Z)eWegWe^bnSoc^Servz'ce tosA:7^ wrWceMm2"周用),通过给定的serviceNum被直接索引的注册的轮询记 录被清除或删除。
图7是示出用于添加新套接字的轮询任务的流程图。首先,通过比较 给定的taskld和存储的taskld来执行(步骤710)孩—^V^^^如果检査通 过,则其服务号被标记在套接字图(220)的给定套接字fd条目上。否 则,检査返回"无效"(步骤720)。该调用的计算复杂性非常小。
轮询任务使用CPS API爿cW (7w/ Zw/ /o五ve械z'w/ serv/ce iV"誦,z力f ta^/力来针对由^rWcA^m和toA/J标识的轮询任务添加针对感兴趣的 soEvent (READ=0, WRITE=1)的新套接字fd。
在图2的MN3300轮询模型中,在利用CPS服务替换BSD w/e"服 务之后,在步骤730处所示的三种情况下CPS Add()被从步骤300 (图3)
的任务队列处理循环调用
*情况READ:添加"侦听"套接字,用于读事件
*情况WRITE:添加"连接"套接字,用于写事件
*情况ARC—READ:添加"已订购"套接字,用于读事件
在步骤740中,当且仅当条目尚未被任意轮询任务所取得的情况下,
新的serviceNum可以被写该条目。这提供了对于"套接字冲突"的防
止,如上所述。
假设步骤750 (处理添加竞赛条件(Add-Racing-Condition, ARC)) 以恒定时间完成,则图7的算法花费0(1)时间。从而,将会意识到,ARC 构成了在开发快速并且可扩展的O(l)CPS-select (或轮询)服务方面的挑 战。下面将说明什么是ARC以及如何根据CPS在恒定时间中解决ARC。
考虑针对读事件添加"已订购"套接字的示例(即情况
ARC_READ)。当TCP连接到达侦听套接字时,该套接字变得可读。轮 询任务通过创建针对该连接的新套接字来接受连接,并返回指向新套接字 的文件描述符。这是在"读套接字"框中完成的(图3中的步骤330)。 但是,轮询任务无法立即调用CPS Add(),因为其必须将额外处理(例如 "安全协商")传递到更高层任务。 一旦更高层任务已经完成这样的"额 外处理","套接字订购"消息就被发回轮询任务,这是在主处理循环的 第一框(步骤300)中处理的。最终,轮询任务以ioEver^ARC—READ调 用CPS Add()。
在以上情形中,在完成连接协商和发起CPS AddO调用的时间之间存 在随机的时间间隔。在该时间期间,远端IP电话(图1)已经准备好发送 应用数据的第一分段,但是CPS套接字读字节掩码(220)尚未被设置。 如果IP电话的应用数据在该时间间隔期间到达,内核则将调用CPS 丽^^。//^^<)函数,这在图6的步骤620处退出,从而引起ARC问 题,即应用数据从而丢失。
标准的BSD w/e"服务没有这个问题,因为BSD select()调用在内核 级别上检査是否有针对输入的套接字比特掩码所给出的套接字的任意I/O 事件已经到达。为了避免O(N)顺序搜索以及为了实现O(l)时间复杂度性 能,ARC问题被CPS API Add()所解决,所述CPS API Add()将套接字fd 直接添加到轮询任务的套接字读仓库(505),从而利用vmfe甲Oz/toflcA:() 补偿SRS的任意丢失的更新。
因此,步骤750 (处理添加竞赛条件(ARC))找到由serviceNum所 索引的轮询记录,将fd写由SRS上的sysPtr所指向的条目,并且将sysPtr 移动到仓库(505)中的下一条目。
将会发现,步骤750可以在O(l)时间中执行。因此,图7所示CPS Add算法的时间复杂性为0(1)。本领域技术人员将意识到,在示例性 MN3300系统中,步骤750的性能允许多达1400个IP电话可靠地在线。
由于ARC涉及竞赛条件,因此CPS Add()有时在"应用数据"的第 一分段到达新连接之前被调用也是可能的。在此情况下,丽fe"/ C"//^^() 更新SRS (505)以使得在步骤750处,复制的套接字fd读事件被添加到 SRS,从而导致在0字节数据被读时,已订购的套接字上有至多一个"读 丢失"。
如图8所示,轮询任务使用CPS API C/ea^W/《/"f z'o五veW, wrvz'ce7Viwm, taA/4)^l十对由sen^'ceM/m禾n toi/J标识的轮询任务删除 或清除先前添加的针对感兴趣的ioEvent (READ=0, WRITE=1)的套接字 fd。当TCP连接故障时,该函数被用于从轮询任务的套接字图(500)中 删除TCP套接字。
核实检査通过比较给定的taskld和存储的taskld来执行(步骤 800);如果发现匹配,该检査则通过,并且从服务列表中删除轮询记 录。否则,检查返回"无效的(INVALID)"(步骤810)。步骤820类 似于图7中的步骤730。
图8中的步骤830提供对套接字图(500)的保护,因为只有具有相 同服务号的轮询任务可以清除其自己的套接字图条目。CPS ClearO方法在 步骤840处结束。本领域技术人员将意识到,CPS Clear()比CPS Add()更 简单,并且也是0(1)算法。
CPS Se/ec《z>^ Zo£Vew/, serWceA/w附,tow^/(i, /wf rimeoi^^69回i周对 于给定ioEvent可获得的活动套接字的数目。图9示出在CPS的示例性实 施例中其算法设计。
核实检查通过比较给定的taskld和存储的taskld来执行(步骤 910);如果发现匹配,该检查则通过,并且从服务列表中删除轮询记 录。否则,检查返回"无效的(INVALID)"(步骤920)。
在步骤930处,"服务号"的值被用于索引服务列表(500)以找到 针对轮询任务的相关记录。
然后,在步骤940处,相应轮询任务的SRS/SWS (505)被从给定的 ioEvent中确定。
CPS w/e"的主要功能发生在步骤950处,其中固定数目的算法运算 被执行,以确定在仓库中的两个指针之间存在多少个条目。具有M个条 目的仓库是利用模(modulo)运算由M个条目的线性数组来实现的,以
从最后一个条目循环回到第一个条目。
类似于图6所示wakeupCallback流程图的步骤660,图9中的步骤 970对MN3300轮询模型而言不是必需的,但是尽管如此,这里还是对其 进行了描述以示出CPS化/e"可以如何全面地建模BSD化/e"。在 MN3300轮询模型中,轮询任务被用于每隔40毫秒调用一次BSD w/ed。 但是,轮询任务能够每隔20毫秒调用一次CPS select,因为CPS w/e"比 BSDse/e"效率更高。CSPw/e"是0(l)算法,如上所述。
在步骤970的调用唤醒之后,步骤950被再执行一次(步骤980)并 且套接字的数目被返回(步骤990)。
应该注意,CPS化/e"调用不需要输入套接字比特掩码或输出套接字 比特掩码,其两者都被内建在结合图5所述的数据结构中。
图10示出如f可利用G"AfecWea办i^ (int ioEvent, int serviceNum, int taskld) API检索由CPS化/e"报告的活动套接字,其中一次取得一个套接 字fd。图2的轮询任务可以按Sdect()所指示的次数多次重复该调用,但 是额外的调用虽然仍旧是"安全的",但也可能返回"无效的fd"(即负 整数值)。
核实检查通过比较给定的taskld和存储的taskld来执行(步骤 1010);如果发现匹配,该检査则通过。否则,检查返回"无效的 (INVALID)"(步骤1020)。
在步骤1030处,"服务号"的值被用于索引服务列表(500)以找到 针对轮询任务的相关记录。
然后,在步骤1040处,相应轮询任务的SRS/SWS (505)被从给定 的ioEvent中确定。
CPS G"A^cW^力W的主要功能在步骤1050到1080中发生,其中恒 定次数的算术运算被用于检查"^/W是否在s"/^ "之后",从而确保 m^/A永远不会在环形仓库中走到s"i^之前。简言之,G"A^^ea办i^ O花费O(l)时间来获取I/O就绪套接字fd。在BSD 中,其花费O(N)
时间来通过顺序搜索输出套接字比特掩码来找到就绪套接字。
总之,以上参考图7-11所述的七种情况(来自内核的唤醒回调;到
CPS的注册;从CPS的解注册;向套接字图添加套接字;从套接字图删 除套接字;CPS Select调用以及检索1/0就绪套接字)描述了 CPS API和 CPS的示例性实施例。以上情况中的每种情况都是在O(l)时间复杂度的情 况下实现的。就是说,无论在I/O复用中涉及多少套接字或文件描述符, CPS总是花费恒定时间来响应每个CPS服务请求。从计算的角度看,CPS 对于I/0复用是一种优选方案。
己经利用标准MITEL MN3300 IP PBX系统获得了实验性测试结果, 其中PBX交换平台(即图1中的ICP控制器(100))包括450MHz PowerPC 603e CPU和512 MB主存储器,以支持多达1400个IP电话。
在500、 1000和1400个电话的测试期间,在线的IP电话通过TCP/IP 网络(130)向ICP控制器(100)生成每小时6000调用的信令流量。对 于上述情况中的每一种,测得了 BSD化/e"和CPS^/e"皿行时间。
图12示出这些时间测量的结果,从其可见,CPS se/e"总是花费大约 8微秒,而BSD w/e"需要的时间长度与IP电话的数目成正比。例如,对 于1400个IP电话,BSD^/e"需要9.8毫秒,这是CPS w/e"所需时间的 画倍。
I/O复用是这里所述的诸如MN3300系统之类iPBX系统中的主要瓶 颈之一。在系统中的数百种任务之中,对于1400个电话,IP电话轮询任 务本身消耗大约30%的CPU周期。利用这里提出的CPS算法,轮询任务 只需要很小并且恒定的CPU使用比率;其中主要的CPU消耗涉及处理任 务队列消息(图3中的步骤300)和从所选套接字读数据。只要总的IP PBX流量不改变,IP电话数目的增加就不会增大轮询任务的CPU开销。
总之,直接用于VoIP PBX和其他协作系统的快速并且可扩展的I/O 复用方法被提出。这里提出的集中式轮询服务(CPS)的特征在于针对 I/O复用优化的O(l)算法方案,可应用于通用的TCP/IP客户端-服务器联 网体系结构;它是能够建模标准BSD w/e"服务的通用方案,并且可以在 所有VxWorks平台之间迁移。
具有多达10,000条IP电话线的大系统可以按经济划算的方式来开 发。现有的遗留MN3300系统可被升级,以在无需更强大的CPU硬件体
系结构的情况下加倍线路数目。而且,在大交换系统中的1/0复用开销已
经成为工业上的一个挑战性问题。设计用于I/O复用的专用VLSI芯片和 硬件体系结构代表另一种加速数据传输并减小CPU负载的技术方向。这 里提出的CPS提供了一组用0++实现的算法,作为针对该问题的经济划 算的软件方案。
本说明书提出了示例性实施例。其他实施例、变化和应用是可能的。 例如,这里提出的CPS起源于解决基于TCP连接的分布式客户端-服务器 系统中的I/O复用问题。但是,CPS也可被用于基于UDP连接的分布式 客户端-服务器系统;并且可被应用于利用TCP套接字、UDP套接字和平 台所支持的其他网络连接类型的具有混合连接类型的混合体系结构。
而且,虽然这里提出的CPS针对VxWorks操作系统平台,但是其可 被应用到带有文件描述符和事件类型信息的具有类似异步I/O事件服务的 其他操作系统中的1/0复用。例如,可以使用修改了 Linux操作系统内核 的Linux平台上的CPS服务来提供与VxWorks类似的I/O唤醒调用特 征。
此外,虽然CPS在说明书中被应用到IP-PBX (iPBX)系统,但是本 领域技术人员将会理解,CPS可被应用到其他交换系统。很多IT或因特 网服务提供商都提供各种商业服务(例如搜索服务、目录服务、银行服 务、市场服务等等),用于在分布式联网系统(TCP/IP或其他遗留网 络)上的基于"客户端-服务器"体系结构的大量用户。在服务器一侧的 I/O复用性能与服务器吞吐量和响应性能密切相关。因此,这里提出的 CPS可以有助于在很多不同的商业应用中建立大型可扩展服务器和提供经 济划算的服务。
从这里的详细说明中可以发现很多特征和优点,并且所附权利要求希 望覆盖所有这些特征和优点。此外,由于本领域技术人员容易发生多种修 改和改变,因此不希望将权利要求的范围局限于所述和示出的确切结构和 操作,因此,所有可以采取的合适的修改和等同物都落在权利要求的范围 内。
权利要求
1. 一种集中式轮询系统,用于在操作系统内核中向多个轮询任务提供恒定时间选择调用功能,所述系统包括到所述操作系统内核的系统接口,用于提供回调函数,所述回调函数用于返回活动套接字和相应的读/写事件类型;用于维护所述轮询任务中的每个轮询任务的简档的数据结构,所述简档包括与每个所述轮询任务相关联的服务号和针对每个所述轮询任务的当前读和写就绪套接字;以及应用编程接口,用于注册所述轮询任务,经由所述系统接口接收所述活动套接字和相应的读/写事件类型,针对每个所述轮询任务更新所述数据结构中的所述简档,并且在与被轮询的套接字的总数目不相关的时间内,将所述当前读和写就绪套接字返回给所述轮询任务中的相应轮询任务。
2. 如权利要求1所述的集中式轮询系统,其中所述数据结构还包括 针对所述轮询任务中的每个轮询任务分别对应于所述读/写事件类型的套接字读和套接字写字节掩码,每个所述套接字读和套接字写字节掩码由 所述轮询任务中的所述一个所订购的关联的文件描述符索引,并且包含与 其关联的服务号;以及包含由每个所述服务号索引的轮询记录的服务列表,其中所述轮询记 录中的每一个包括用于标识所述轮询任务中的所述一个的任务ID和环形 套接字读和套接字写仓库,其中环形套接字读和套接字写仓库包含针对所 述轮询任务中的所述一个的当前读和写就绪套接字,所述环形套接字读和 套接字写仓库中的每一个被系统指针索引到所述回调函数用来写其I/O就 绪事件已经到达的文件描述符的当前可用条目,并被用户指针索引到所述 轮询任务中的所述一个用来读的当前可用条目。
3. 如权利要求2所述的集中式轮询系统,其中所述应用编程接口还包括用于针对套接字服务并且响应于所述关联的服务号和任务ID的分配 而注册所述轮询任务中的所述一个的代码; 用于从所述套接字服务中解注册所述轮询任务中的所述一个的代码;用于针对所述读/写事件类型中的每一个将所述关联的文件描述符分别 添加到所述套接字读和套接字写字节掩码的代码;用于针对所述读/写事件类型中的每一个从所述套接字读和套接字写字 节掩码中分别清除所述关联的文件描述符的代码;用于确定与所述读/写事件类型相对应的所述活动套接字的总数目的代 码;以及用于将与所述读/写事件类型相对应的所述活动套接字返回给所述轮询 任务中的相应轮询任务的代码。
4. 如权利要求3所述的集中式轮询系统,其中用于添加的所述代码包 括用于如下操作的代码经由所述关联的服务号访问所述轮询记录中的每 个相应的轮询记录,将所述文件描述符写所述关联的环形套接字读仓库的 由所述系统指针指向的适当条目,并且递增所述系统指针,从而避免添加 竞赛条件。
5. 如权利要求3所述的集中式轮询系统,其中用于确定所述活动套接 字的总数目的所述代码包括选择函数调用。
6. 如权利要求5所述的集中式轮询系统,其中所述选择函数调用具有 预定的超时值。
7. 如权利要求6所述的集中式轮询系统,其中所述超时值的缺省值为0。
8. 如权利要求5所述的集中式轮询系统,其中所述选择函数调用包括用于如下操纵的代码通过对所述环形套接字读和套接字写仓库中的相应仓库中的、在所述用户指针和所述系统指针之间的条目的数目进行计数, 来确定所述活动套接字的总数目。
9. 如权利要求3所述的集中式轮询系统,其中用于返回所述活动套接 字的所述代码包括获取下一函数调用。
10. 如权利要求9所述的集中式轮询系统,其中所述获取下一函数调用包括用于如下操作的代码在所述用户指针落后于所述系统指针的情况下,检索和返回所述环形套接字读和套接字写仓库中的由所述用户指针指向的相应条目并且递增所述用户指针,否则,返回表明没有进一步的I/O 就绪事件已被记录的指示。
11. 一种集中式轮询方法,用于在操作系统内核中向多个轮询任务提 供恒定时间选择调用功能,所述方法包括提供回调函数,所述回调函数用于返回活动套接字和相应的读/写事件 类型;维护所述轮询任务中的每个轮询任务的简档,所述简档包括与每个所 述轮询任务相关联的服务号和针对每个所述轮询任务的当前读和写就绪套 接字;注册所述轮询任务;接收所述活动套接字和相应的读/写事件类型; 针对每个所述轮询任务更新所述简档;以及在与被轮询的套接字的总数目不相关的时间内,将所述当前读和写就 绪套接字返回给所述轮询任务中的相应轮询任务。
12. 如权利要求11所述的集中式轮询方法,其中所述维护所述轮询任 务中的每个轮询任务的简档包括针对所述轮询任务中的每个轮询任务分别维护对应于所述读/写事件类 型的套接字读和套接字写字节掩码,每个所述套接字读和套接字写字节掩 码包含针对所述轮询任务中的每一个的关联的服务号;利用由所述轮询任务中的所述一个所订购的关联的文件描述符,来索 引每个所述套接字读和套接字写字节掩码;维护包含由每个所述服务号索引的轮询记录的服务列表,其中所述轮 询记录中的每一个包括用于标识所述轮询任务中的所述一个的任务ID, 和包含针对所述轮询任务中的所述一个的当前读和写就绪套接字的环形套 接字读和套接字写仓库;以及利用系统指针将所述环形套接字读和套接字写仓库中的每一个索引到 所述回调函数用来写其I/O就绪事件已经到达的文件描述符的当前可用条 目,并利用用户指针将所述环形套接字读和套接字写仓库中的每一个索引 到所述轮询任务中的所述一个用来读的当前可用条目。
13. 如权利要求12所述的集中式轮询方法,其中注册套接字服务包括 分配所述关联的服务号和任务ID。
14. 如权利要求12所述的集中式轮询方法,其中所述更新包括 针对所述读/写事件类型中的每一个,将所述关联的文件描述符分别添加到所述套接字读和套接字写字节掩码;针对所述读/写事件类型中的每一个,从所述套接字读和套接字写字节 掩码中分别清除所述关联的文件描述符;以及确定与所述读/写事件类型相对应的所述活动套接字的总数目。
15. 如权利要求14所述的集中式轮询方法,其中所述添加包括经由 所述关联的服务号访问所述轮询记录中的每个相应的轮询记录,将所述文 件描述符写所述关联的环形套接字读仓库的由所述系统指针指向的适当条 目,并且递增所述系统指针,从而避免添加竞赛条件。
16. 如权利要求14所述的集中式轮询方法,其中确定所述活动套接字 的总数目包括选择函数调用。
17. 如权利要求16所述的集中式轮询方法,其中所述选择函数调用具 有预定的超时值。
18. 如权利要求17所述的集中式轮询方法,其中所述超时值的缺省值为0。
19. 如权利要求16所述的集中式轮询方法,其中所述选择函数调用包 括通过对所述环形套接字读和套接字写仓库中的相应仓库中的、在所述 用户指针和所述系统指针之间的条目的数目计数,来确定所述活动套接字 的总数目。
20. 如权利要求11所述的集中式轮询方法,其中返回所述活动套接字 包括获取下一函数调用。
21. 如权利要求20所述的集中式轮询方法,其中所述获取下一函数调 用包括在所述用户指针落后于所述系统指针的情况下,检索和返回所述 环形套接字读和套接字写仓库中的由所述用户指针指向的相应条目并且递 增所述用户指针,否则,返回表明没有进一步的I/O就绪事件已被记录的 指示。
22. 如权利要求11所述的集中式轮询方法,还包括将至少一个附加服 务号与每个所述轮询任务相关联。
23. 如权利要求2所述的集中式轮询系统,还包括覆盖机制,用于允 许服务号列表与每个所述套接字读和套接字写字节掩码的单个条目相关 联。
全文摘要
本发明提出一种集中式轮询服务和系统,用于在操作系统内核中向多个轮询任务提供恒定时间选择调用功能。在一个方面中,CPS连续地注册并从而捕获感兴趣的事件。轮询任务被提供以活动事件,从而消除重复地轮询大量不活动套接字的需求。CPS的示例性实施例包括到操作系统内核的系统接口、用于维护每个轮询任务的简档的数据结构和应用编程接口,该应用编程接口用于注册轮询任务,经由系统接口接收活动套接字和相应的读/写事件类型,针对每个轮询任务更新数据结构中的简档,并且将当前读和写就绪套接字返回到相应的轮询任务。
文档编号G06F9/46GK101393527SQ20081016620
公开日2009年3月25日 申请日期2008年9月22日 优先权日2007年9月21日
发明者建立·孙, 特雷沃尔·庞德, 马斯杰·斯罗瓦特卡 申请人:米特尔网络公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1