阻塞任务调度方法及装置制造方法

文档序号:6521585阅读:151来源:国知局
阻塞任务调度方法及装置制造方法
【专利摘要】一种阻塞任务调度方法,包括:为任务函数分配协程,在所述协程中调用所述任务函数;在调用所述任务函数发生阻塞时将该协程暂停运行,并将该协程设置为暂停状态;监听系统I/O事件,查找与所述系统I/O事件对应的协程,并将该协程设置为运行状态;查找出为运行状态的协程,恢复所述查找到的协程,并对所述系统I/O事件进行相应的处理。此外,还提供了一种阻塞任务调度装置。上述阻塞任务调度方法及装置能够提高系统的并发数量。
【专利说明】阻塞任务调度方法及装置

【技术领域】
[0001] 本发明涉及计算机【技术领域】,特别是涉及一种阻塞任务调度方法及装置。

【背景技术】
[0002] 现有的计算机技术中的应用程序框架在执行需要I/O (input/output)的任务时, 通常会由于等待输入数据而进入暂停状态。例如,调用socket函数监听端口等待接收远程 服务器发送来的数据时,或是监听系统输入事件对应的input流时,均会进入暂停状态,从 而使得程序进程无法继续执行。
[0003] 现有的应用程序框架为了防止程序由于等待I/O而进入暂停状态,通常为以线程 为单位执行阻塞任务,即,以多线程的方式执行程序,当某个线程由于执行I/o任务而阻塞 时,可在操作系统的调度下切换到其他线程异步执行。
[0004] 然而,由于操作系统创建和管理线程的开销较大,应用程序框架在业务较繁忙,创 建的线程较多时,操作系统的上下文切换的次数会呈几何指数上升,而由于系统性能的限 制,使得系统I/o的并发数量下降。


【发明内容】

[0005] 基于此,有必要提供一种能够提高系统I/O的并发数量的阻塞任务调度方法。
[0006] 一种阻塞任务调度方法,包括:
[0007] 为任务函数分配协程,在所述协程中调用所述任务函数;
[0008] 在调用所述任务函数发生阻塞时将该协程暂停运行,并将该协程设置为暂停状 态;
[0009] 监听系统I/O事件,查找与所述系统I/O事件对应的协程,并将该协程设置为运行 状态;
[0010] 查找出为运行状态的协程,恢复所述查找到的协程,并对所述系统i/o事件进行 相应的处理。
[0011] 此外,还提供了一种能够提高系统I/O的并发数量的阻塞任务调度装置。
[0012] 一种阻塞任务调度装置,包括:
[0013] 协程分配模块,用于为任务函数分配协程,在所述协程中调用所述任务函数;
[0014] 协程暂停运行模块,用于在调用所述任务函数发生阻塞时将该协程暂停运行,并 将该协程设置为暂停状态;
[0015] 状态更新模块,用于监听系统I/O事件,查找与所述系统I/O事件对应的协程,并 将该协程设置为运行状态;
[0016] 协程恢复模块,查找出为运行状态的协程,恢复所述查找到的协程,并对所述系统 I/O事件进行相应的处理。
[0017] 上述阻塞任务调度方法及装置中,以协程作为任务函数的载体运行,在任务函数 发生阻塞时,将其对应的协程暂停运行从而切换到其他为暂停运行的协程上继续异步执 行;在暂停运行的协程有相应的系统I/o事件触发时,则结束该协程的暂停状态将其恢复, 并将该系统I/o事件分配给该协程处理。与传统技术中以线程或进程为载体运行任务函数 的方式相比,创建和调度协程比创建和调度线程或进程需要较少的内存资源,因此,在相同 的系统资源限制下,可创建较多的协程来处理并发的系统I/o任务,从而提高了系统I/O的 并发数量。
[0018] 同时,对于开发者而言,上述阻塞任务调度方法及装置的改动仅局限在现有的应 用框架中对应用层接口函数的底层实现方式上,即将调用应用层接口函数执行任务函数的 载体设置为协程,使得基于应用层框架的业务逻辑代码并不需要修改,开发者只需在现有 的应用层框架的底层修改代码即可实现上述阻塞任务调度方法及装置,从而降低了在现有 系统上开发和维护的复杂度。

【专利附图】

【附图说明】
[0019] 图1为一个实施例中阻塞任务调度方法的流程图;
[0020] 图2为一个实施例中阻塞任务调度装置的结构示意图;
[0021] 图3为另一个实施例中阻塞任务调度装置的结构示意图;
[0022] 图4为一个实施例中阻塞任务调度装置的硬件环境图。

【具体实施方式】
[0023] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对 本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并 不用于限定本发明。
[0024] 除非上下文另有特定清楚的描述,本发明中的元件和组件,数量既可以单个的形 式存在,也可以多个的形式存在,本发明并不对此进行限定。本发明中的步骤虽然用标号进 行了排列,但并不用于限定步骤的先后次序,除非明确说明了步骤的次序或者某步骤的执 行需要其他步骤作为基础,否则步骤的相对次序是可以调整的。可以理解,本文中所使用的 术语"和/或"涉及且涵盖相关联的所列项目中的一者或一者以上的任何和所有可能的组 口 ο
[0025] 在一个实施例中,如图1所示,一种阻塞任务调度装置方法,该方法完全依赖于计 算机程序,该计算机程序可运行于基于冯洛伊曼体系的计算机系统上,该方法包括:
[0026] 该方法包括:
[0027] 步骤S102,为任务函数分配协程,在协程中调用任务函数。
[0028] 任务函数即为包含有具体业务逻辑任务的函数。传统技术中,若要异步执行该任 务函数,则可预先将该任务函数定义在线程中。在运行时,先创建线程,线程启动后再在该 线程中调用该任务函数。
[0029] 协程(coroutine)通常又被称为微线程和纤程等。协程不像线程或进程运行在操 作系统底层,由操作系统统一创建、调度、管理和注销,而是运行在应用程序的内存空间中 (用户空间中),创建、调度、管理和注销协程的操作由应用程序进行,操作系统则对其并不 知晓也不干涉。也就是说,协程是建立在操作系统上层的应用层的一种多线程机制。现有 的多种编程语言均提供了协程机制,例如Lua、ruby和Google GO等。
[0030] 例如,若应用层框架提供了一个抽象类,并定义了该抽象类中的应用层接口函数 被调用时,先为其分配协程,然后在协程的内存空间中执行该应用层接口函数的函数体中 的代码。而应用人员在应用层框架上开发应用时,则可实现该抽象类,并在应用层接口函数 的函数体的代码中加入任务函数的的定义;在运行时,即在协程的内存空间中调用该任务 函数。
[0031] 步骤S104,在调用任务函数发生阻塞时将该协程暂停运行,并将该协程设置为暂 停运行状态。
[0032] 若任务函数为系统I/O函数,由于任务函数的后续执行需要等待系统I/O事件带 来的输入数据,则任务函数会进入阻塞状态。
[0033] 例如,对于输入法等应用,其输入检测函数在用户未敲击键盘输入字符时,即没有 监听到已触发相应的系统输入事件(一种系统I/o事件),则该输入检测函数即会进入阻塞 状态,直至用户通过键盘输入字符触发系统I/o事件,该函数方解除阻塞。
[0034] 再例如,对于socket的接收函数,若在相应的端口没有监听到有连接请求,即没 有监听到已触发相应的网络连接事件(一种系统I/o事件),则该接收函数即会进入阻塞状 态,直至有连接请求抵达相应的端口触发网络连接事件。
[0035] 在本实施例中,判断任务函数的是否发生阻塞的步骤之前还可通过hook机制调 用预设的与任务函数对应的同名函数,通过同名函数调用任务函数并判断任务函数的是否 发生阻塞。
[0036] 例如,若任务函数为socket函数,则可通过hook机制在操作系统底层检测是否有 名为socket的函数调用,若有,则将获取预设的同样名为socket的同名函数,该同名函数 可由开发人员预先定义,在调用原socket函数的基础上加入获取socket函数的阻塞状态 的代码。当运行时根据hook机制调用该同名函数后,则不仅能够调用操作系统运行库中原 始的socket函数,还能获取到该socket函数的阻塞状态,并根据该阻塞状态进行其他的操 作。
[0037] 进一步的,若任务函数为socket函数,则通过同名函数判断任务函数是否发生阻 塞的步骤可具体为:通过同名函数获取socket函数的fd状态,根据fd状态判断socket函 数是否阻塞。
[0038] socket函数的fd状态可分为:
[0039] FD_READ,准备读;
[0040] FD_WRITE,准备写;
[0041] FD_00B,带外数据到达;
[0042] FD_ACCEPT,收到连接;
[0043] FD_C0NNECT,完成连接;
[0044] FD_CL0SE,关闭 socket。
[0045] 当fd状态为FD_READ时,则socket函数进入等待外部连接请求的阻塞状态。
[0046] 在其他实施例中,若任务函数为其他用于获取系统输入的系统1/0函数(比如键 盘字符输入的system input函数),则同样可通过hook机制替换为相应的预设的同名函数 进行调用,并在同名函数中对该系统1/0函数的阻塞状态进行判断(通常是一个标识符属 性,根据该标识符属性的属性值进行判断)。
[0047] 在本实施例中,同名函数在检测到任务函数进入阻塞状态后,则可通过调用弃权 函数(即yeild函数,由于具有协程机制的编程语言实现用于暂停运行的函数的名称不一 样,此处仅以yeild函数为例,实际中并不限于名为yeild的函数)将其所在的协程暂停运 行,暂停运行之后该协程即被设置为暂停状态。
[0048] 优选的,可预设协程管理器对象,协程被创建之后即可添加到该协程管理器对象 中进行统一管理,该协程管理区可记录其包含的每个协程的首地址和状态信息。在本实施 例中,即可在协程管理器中将该协程的状态信息修改为暂停状态。
[0049] 采用hook机制以同名函数调用的方式调用任务函数,并判断任务函数是否阻塞, 可使得开发人员希望对现有的应用层框架即其上运行的应用做如上改进时,可仅修改应用 层框架的部分代码,而不用修改应用中的代码。对于应用而言,其仍然调用的是socket函 数,且功能上没有受到任何影响。从而降低了开发人员在进行应用开发和维护时的复杂度。
[0050] 步骤S106,监听系统I/O事件,查找与系统I/O事件对应的协程,并将该协程设置 为运行状态。
[0051] 系统I/O事件即为系统的输入输出事件,当操作系统的检测到有数据输入输出 时,即触发相应的系统I/o事件。若系统I/O事件对应为socket输入,则可获取该socket 输入对应的端口信息,根据端口信息查找到对应的协程。例如,在优选的实施方式中,可在 协程管理器对象中加入与协程对应的端口信息,在接收到socket输入后即可根据该端口 信息查找到相应的协程。查找到该协程后,即可在协程管理器对象中将其暂停状态设置为 运行状态。
[0052] 步骤S108,查找出为运行状态的协程,恢复查找到的协程,并对系统1/0事件进行 相应的处理。
[0053] 所述恢复查找到的协程则可通过重新调用该任务函数即可实现。在协程机制中, 再次调用协程中的代码则从上次弃权的代码位置恢复执行。可将系统I/o事件对应的1/0 数据传递给任务函数,任务函数即解除阻塞状态。例如socket函数在接收到输入数据时, 则进入接收数据流的代码继续执行。
[0054] 优选的,将该协程设置为运行状态的步骤之后还可将协程添加到预设的非阻塞协 程队列的队尾。
[0055] 查找出为运行状态的协程的步骤为:
[0056] 在非阻塞协程队列的队首依次取出相应的协程。
[0057] 也就是说,可在协程管理器对象中设置非阻塞协程队列,对于可异步执行的任务 函数对应的协程则可按照先后顺序进行调度恢复。在其他实施例中,也可使用优先级队列、 小任务优先队列等存储非阻塞协程。
[0058] 在一个实施例中,将协程设置为暂停状态的步骤之后还可为所述协程添加阻塞时 间戳。
[0059] 还可查找出阻塞时间戳超时且处于暂停状态的协程,终止协程中任务函数的调 用。
[0060] 也就是说,还可在协程管理器对象中为处于暂停状态的协程加入超时机制,暂停 运行的协程的生命周期的长度可为预设的固定值,也可以是在将其设置为暂停状态时输入 的参数值。对于处于暂停状态且生命周期超时的协程,则可终止其中任务函数,返回相应的 异常。
[0061] 在一个实施例中,如图2所示,一种阻塞任务调度装置,包括:协程分配模块102、 协程暂停运行模块104、状态更新模块106以及协程恢复模块108,其中:
[0062] 协程分配模块102,用于为任务函数分配协程,在协程中调用任务函数。
[0063] 协程暂停运行模块104,用于在任务函数的发生阻塞时将其对应的协程暂停运行, 并将该协程设置为暂停状态。
[0064] 状态更新模块106,用于监听系统I/O事件,查找与系统I/O事件对应的协程,并将 该协程设置为运行状态。
[0065] 协程恢复模块108,用于查找出为运行状态的协程,恢复查找到的协程,并对系统 I/O事件进行相应的处理。
[0066] 在一个实施例中,状态更新模块106还用于将被设置为运行状态的协程添加到预 设的非阻塞协程队列的队尾。
[0067] 协程恢复模块108还用于在非阻塞协程队列的队首依次取出相应的协程。
[0068] 在一个实施例中,如图3所示,阻塞任务调度装置还包括阻塞检测模块110,用于 通过hook机制调用预设的与任务函数对应的同名函数,通过同名函数调用任务函数并判 断任务函数的是否发生阻塞。
[0069] 在一个实施例中,任务函数为socket函数。
[0070] 阻塞检测模块还用于获取socket函数的fd状态,根据fd状态判断socket函数 是否阻塞。
[0071] 在一个实施例中,协程暂停运行模块104还用于为被设置为暂停状态的协程添加 阻塞时间戳。
[0072] 在本实施例中,如图3所示,阻塞任务调度装置还包括超时检测模块112,用于查 找出阻塞时间戳超时且处于暂停状态的协程,终止协程中任务函数的调用。
[0073] 上述阻塞任务调度方法及装置中,以协程作为任务函数的载体运行,在任务函数 发生阻塞时,将其对应的协程暂停运行从而切换到其他为暂停运行的协程上继续异步执 行;在暂停运行的协程有相应的系统1/0事件触发时,则结束该协程的暂停状态将其恢复, 并将该系统1/0事件分配给该协程处理。与传统技术中以线程或进程为载体运行任务函数 的方式相比,创建和调度协程比创建和调度线程或进程需要较少的内存资源,因此,在相同 的系统资源限制下,可创建较多的协程来处理并发的系统1/0任务,从而提高了系统1/0的 并发数量。
[0074] 同时,对于开发者而言,上述阻塞任务调度方法及装置的改动仅局限在现有的应 用框架中对应用层接口函数的底层实现方式上,即将调用应用层接口函数执行任务函数的 载体设置为协程,使得基于应用层框架的业务逻辑代码并不需要修改,开发者只需在现有 的应用层框架的底层修改代码即可实现上述阻塞任务调度方法及装置,从而降低了在现有 系统上开发和维护的复杂度。
[0075] 如图4所示,图4为能实现本发明实施例的一个计算机系统1000的模块图。该计 算机系统1000只是一个适用于本发明的计算机环境的示例,不能认为是提出了对本发明 的使用范围的任何限制。计算机系统1000也不能解释为需要依赖于或具有图示的示例性 的计算机系统1000中的一个或多个部件的组合。
[0076] 图4中示出的计算机系统1000是一个适合用于本发明的计算机系统的例子。具 有不同子系统配置的其它架构也可以使用。例如有大众所熟知的台式机、笔记本、应用服务 器、web服务器等类似设备可以适用于本发明的一些实施例。但不限于以上所列举的设备。
[0077] 如图4所示,计算机系统1000包括处理器1010、存储器1020和系统总线1022。包 括存储器1020和处理器1010在内的各种系统组件连接到系统总线1022上。处理器1010 是一个用来通过计算机系统中基本的算术和逻辑运算来执行计算机程序指令的硬件。存储 器1020是一个用于临时或永久性存储计算程序或数据(例如,程序状态信息)的物理设备。 系统总线1020可以为以下几种类型的总线结构中的任意一种,包括存储器总线或存储控 制器、外设总线和局部总线。处理器1010和存储器1020可以通过系统总线1022进行数据 通信。其中存储器1020包括只读存储器(ROM)或闪存(图中都未示出),以及随机存取存储 器(RAM),RAM通常是指加载了操作系统和应用程序的主存储器。
[0078] 计算机系统1000还包括显示接口 1030 (例如,图形处理单元)、显示设备1040 (例 如,液晶显示器)、音频接口 1050 (例如,声卡)以及音频设备1060 (例如,扬声器)。显示设 备1040和音频设备1060是用于体验多媒体内容的媒体设备。
[0079] 计算机系统1000 -般包括一个存储设备1070。存储设备1070可以从多种计算机 可读介质中选择,计算机可读介质是指可以通过计算机系统1000访问的任何可利用的介 质,包括移动的和固定的两种介质。例如,计算机可读介质包括但不限于,闪速存储器(微型 SD卡),CD-ROM,数字通用光盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘存储或其它磁存储 设备,或者可用于存储所需信息并可由计算机系统1000访问的任何其它介质。
[0080] 计算机系统1000还包括输入装置1080和输入接口 1090 (例如,10控制器)。用 户可以通过输入装置1080,如键盘、鼠标、显示装置1040上的触摸面板设备,输入指令和信 息到计算机系统1000中。输入装置1080通常是通过输入接口 1090连接到系统总线1022 上的,但也可以通过其它接口或总线结构相连接,如通用串行总线(USB)。
[0081] 计算机系统1000可在网络环境中与一个或者多个网络设备进行逻辑连接。网络 设备可以是个人电脑、服务器、路由器、智能电话、平板电脑或者其它公共网络节点。计算机 系统1000通过局域网(LAN)接口 1100或者移动通信单元1110与网络设备相连接。局域 网(LAN)是指在有限区域内,例如家庭、学校、计算机实验室、或者使用网络媒体的办公楼, 互联组成的计算机网络。WiFi和双绞线布线以太网是最常用的构建局域网的两种技术。 WiFi是一种能使计算机系统1000间交换数据或通过无线电波连接到无线网络的技术。移 动通信单元1110能在一个广阔的地理区域内移动的同时通过无线电通信线路接听和拨打 电话。除了通话以外,移动通信单元1110也支持在提供移动数据服务的2G,3G或4G蜂窝 通信系统中进行互联网访问。
[0082] 应当指出的是,其它包括比计算机系统1000更多或更少的子系统的计算机系统 也能适用于发明。例如,计算机系统1000可以包括能在短距离内交换数据的蓝牙单元,用 于照相的图像传感器,以及用于测量加速度的加速计。
[0083] 如上面详细描述的,适用于本发明的计算机系统1000能执行处理状态展示方法 的指定操作。计算机系统1000通过处理器1010运行在计算机可读介质中的软件指令的形 式来执行这些操作。这些软件指令可以从存储设备1070或者通过局域网接口 1100从另一 设备读入到存储器1020中。存储在存储器1020中的软件指令使得处理器1010执行上述 的处理状态展示方法。此外,通过硬件电路或者硬件电路结合软件指令也能同样实现本发 明。因此,实现本发明并不限于任何特定硬件电路和软件的组合。
[0084] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并 不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员 来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保 护范围。因此,本发明专利的保护范围应以所附权利要求为准。
【权利要求】
1. 一种阻塞任务调度方法,包括: 为任务函数分配协程,在所述协程中调用所述任务函数; 在调用所述任务函数发生阻塞时将该协程暂停运行,并将该协程设置为暂停状态; 监听系统I/o事件,查找与所述系统I/O事件对应的协程,并将该协程设置为运行状 态; 查找出为运行状态的协程,恢复所述查找到的协程,并对所述系统I/o事件进行相应 的处理。
2.根据权利要求1所述的阻塞任务调度方法,其特征在于,所述将该协程设置为运行 状态的步骤之后还包括: 将所述协程添加到预设的非阻塞协程队列的队尾; 所述查找出为运行状态的协程的步骤为: 在所述非阻塞协程队列的队首依次取出相应的协程。
3.根据权利要求1所述的阻塞任务调度方法,其特征在于,所述判断所述任务函数的 是否发生阻塞的步骤之前还包括: 通过hook机制调用预设的与所述任务函数对应的同名函数,通过所述同名函数调用 所述任务函数并判断所述任务函数的是否发生阻塞。
4.根据权利要求1所述的阻塞任务调度方法,其特征在于,所述任务函数为socket函 数; 所述判断所述任务函数是否发生阻塞的步骤为: 获取所述socket函数的fd状态,根据所述fd状态判断所述socket函数是否阻塞。
5.根据权利要求1所述的阻塞任务调度方法,其特征在于,所述将该协程设置为暂停 状态的步骤之后还包括: 为所述协程添加阻塞时间戳; 所述方法还包括: 查找出阻塞时间戳超时且处于暂停状态的协程,终止所述协程中任务函数的调用。
6. 一种阻塞任务调度装置,其特征在于,包括: 协程分配模块,用于为任务函数分配协程,在所述协程中调用所述任务函数; 协程暂停运行模块,用于在所述任务函数的发生阻塞时将其对应的协程暂停运行,并 将该协程设置为暂停状态; 状态更新模块,用于监听系统I/o事件,查找与所述系统I/O事件对应的协程,并将该 协程设置为运行状态; 协程恢复模块,用于查找出为运行状态的协程,恢复所述查找到的协程,并对所述系统 I/O事件进行相应的处理。
7.根据权利要求6所述的阻塞任务调度装置,其特征在于,所述状态更新模块还用于 将所述被设置为运行状态的协程添加到预设的非阻塞协程队列的队尾; 所述协程恢复模块还用于在所述非阻塞协程队列的队首依次取出相应的协程。
8.根据权利要求6所述的阻塞任务调度装置,其特征在于,所述装置还包括阻塞检测 模块,用于通过hook机制调用预设的与所述任务函数对应的同名函数,通过所述同名函数 调用所述任务函数并判断所述任务函数的是否发生阻塞。
9.根据权利要求8所述的阻塞任务调度装置,其特征在于,所述任务函数为socket函 数; 所述阻塞检测模块还用于获取所述socket函数的fd状态,根据所述fd状态判断所述 socket函数是否阻塞。
10.根据权利要求6所述的阻塞任务调度装置,其特征在于,所述协程暂停运行模块还 用于为所述被设置为暂停状态的协程添加阻塞时间戳; 所述装置还包括超时检测模块,用于查找出阻塞时间戳超时且处于暂停状态的协程, 终止所述协程中任务函数的调用。
【文档编号】G06F9/48GK104142858SQ201310631829
【公开日】2014年11月12日 申请日期:2013年11月29日 优先权日:2013年11月29日
【发明者】许家滔, 陈国敏, 李方源 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1