CN105117284A - 一种基于优先级比例队列的工作线程的调度方法 - Google Patents
一种基于优先级比例队列的工作线程的调度方法 Download PDFInfo
- Publication number
- CN105117284A CN105117284A CN201510569932.2A CN201510569932A CN105117284A CN 105117284 A CN105117284 A CN 105117284A CN 201510569932 A CN201510569932 A CN 201510569932A CN 105117284 A CN105117284 A CN 105117284A
- Authority
- CN
- China
- Prior art keywords
- request
- priority
- thread
- queue
- deliver
- 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
Links
Landscapes
- Exchange Systems With Centralized Control (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明一种基于优先级比例队列的工作线程的调度方法,综合了顺序执行和优先级排队两种线程调度策略的优势,基于线程优先级对线程请求进行队列分组,同时增加了优先级比例参数,用于控制不同优先级队列的并发投递数量,每次处理都是从每个分组中获取一定比例的线程请求进行投递,避免高优先级的线程请求一直占用CPU,导致优先级低的线程请求长时间等待甚至出现线程饥饿。因此,本发明可以保证每个优先级队列按照预设的比例,得到相应比例的处理机会,避免由于大量高优先级请求堆积导致低优先级请求得不到处理,或者高优先级请求由于排队而得不到及时处理的问题,从根本上解决进程内部的线程饥饿问题,同时也提高了请求处理的及时性。
Description
技术领域
本发明涉及一种基于优先级比例队列的工作线程的调度方法。
背景技术
在并发服务器软件设计中,经常使用工作线程池实现服务并发处理。通过向工作线程池投递线程请求,等待处理回调实现高并发异步操作。常见的工作线程池或基于顺序执行或基于优先级排队决定线程调度的先后顺序,在高并发环境下都可能出现线程处理不及时甚至线程饥饿,导致服务响应不及时,影响用户体验。
发明内容
本发明的目的在于提供一种基于优先级比例队列的工作线程的调度方法,能改善不同优先级工作线程并发处理的及时性,提高多线程切换性能,解决由于线程排队和线程切换可能导致的处理延迟和线程饥饿问题,能提高工作线程并发处理性能和线程响应及时性,优化和提升服务器软件处理能力。
本发明一种基于优先级比例队列的工作线程的调度方法,首先,根据工作线程优先级的分级数目创建对应数量的优先级队列,用于存储应用层投递的工作线程请求,并设定各个优先级队列间的调度比例,所有优先级队列调度比例总和为100%,同时,创建当前待处理请求队列,每次向线程池投递请求时,根据预置的优先级调度比例,从各优先级队列中取出对应百分比数量的请求,并投递到当前待处理请求队列中等待进行并发处理。
具体包括如下步骤:
步骤1、创建优先级队列和初始化优先级调度比例
a)假设优先级分级数目为N,则创建N个优先级队列用于存储应用层投递的各优先级工作线程请求;
b)设置不同优先级队列的调度比例Ri,i=1...N,且保证所有优先级调度比例之和为100%,即
步骤2、初始化线程池
a)初始化计算如下变量:
线程池数量Tcnt=CPU核心数*2+2,用于初始化工作线程数量;
线程池最大待处理请求数Rmax=2*50*Tcnt;
线程池当前待处理请求队列数量Rcur,初始值为0,用于计数统计当前已投递的待处理请求数;
b)初始化当前待处理请求队列,该队列用于存储所有应用层已投递到线程池的请求,按照投递顺序排列,该队列只是顺序处理,与具体优先级无关;
c)初始化创建完成端口,并创建与线程池数量Tcnt相等个数的线程,用于处理上层应用层投递的工作线程请求;每个线程的初始化状态为挂起,并循环等待完成端口消息触发状态,整个线程池的最底层通过完成端口完成请求投递和线程的切换调度;
步骤3、基于优先级调度比例的工作线程调度
a)应用层请求投递流程
根据应用层投递线程请求的优先级,将请求添加到对应优先级队列中,判断当前待处理请求队列是否需要投递下一批处理请求,是则投递,否则结束;
b)工作线程执行流程
线程初始处于挂起状态,一旦当前待处理请求队列中有新的请求投递时,则投递唤醒请求,唤醒其中一个线程进行处理;当线程被唤醒之后,先判断当前待处理请求队列是否为空,不为空则从当前待处理请求队列中取出一个请求进行处理,为空则结束处理;处理完一个请求之后,判断当前待处理请求队列是否需要继续投递下一批待处理请求,是则投递下一批待处理请求,否则不投递;最后,判断当前待处理请求队列是否为空,不为空则投递下一次线程唤醒请求,唤醒下一个线程继续处理,为空则结束处理;
c)投递下一批待处理请求流程
计算此次需要投递的待处理请求个数Rwait=Rmax-Rcur,按照优先级从高到低依次枚举,从每一个优先级队列中根据对应比例Ri,i=1...N,计算该优先级队列最大投递请求个数Mi=Rwait*Ri,并获取当前优先级队列请求个数mi,如果某一个优先级队列中的请求数大于计算结果mi>=Mi,则取出Mi个请求数投递到当前待处理请求队列中,否则将该优先级队列中的mi个请求全部投递到当前待处理请求队列中,并从比当前优先级高的优先级队列中,按照优先级顺序从高到低,补充不足的请求数Li=Mi-mi,然后继续下一个优先级队列的投递;当所有的优先级队列枚举完成之后,根据当前待处理请求队列中请求数,投递min(Rcur,Tcnt)个线程唤醒请求,唤醒线程进行处理。
本发明综合了顺序执行和优先级排队两种线程调度策略的优势,基于线程优先级对线程请求进行队列分组,同时增加了优先级比例参数用于控制不同优先级队列的并发投递数量,每次处理都是从每个分组中获取一定比例的线程请求进行投递,避免高优先级的线程请求一直占用CPU,导致优先级低的线程请求长时间等待甚至出现线程饥饿。因此,本发明可以保证每个优先级队列按照预设的比例,得到相应比例的处理机会,避免由于大量高优先级请求堆积导致低优先级请求得不到处理,或者高优先级请求由于排队而得不到及时处理的问题,从根本上解决进程内部的线程饥饿问题,同时也提高了请求处理的及时性。
附图说明
图1为本发明的工作原理图;
图2为本发明应用层请求投递流程图;
图3为本发明线程执行流程图;
图4为本发明投递下一批待处理请求的流程图。
以下结合附图和实施例对本发明做进一步详述。
具体实施方式
如图1所示,本发明一种基于优先级比例队列的工作线程的调度方法,首先,根据工作线程优先级的分级数目创建对应数量的优先级队列,用于存储应用层投递的工作线程请求,并设定各个优先级间的调度比例R(%),所有优先级调度比例总和为100(%),同时,创建当前待处理请求队列,每次向线程池投递请求时,根据预置的优先级调度比例,从各优先级队列中取出对应百分比数量的请求,并投递到当前待处理请求队列中等待进行并发处理,以此保证不同优先级线程都能得到特定比例的处理机会,避免线程饥饿,改善了线程处理的及时性。
本发明一种基于优先级比例队列的工作线程的调度方法,包括如下步骤:
步骤1、创建优先级队列和初始化优先级调度比例
a)假设优先级分级数目为N,则创建N个优先级队列用于存储应用层投递的各优先级工作线程请求;
b)设置不同优先级队列的调度比例R(%),且保证所有优先级调度比例之和为100(%),即:
步骤2、初始化线程池;
a)初始化计算如下变量:
线程池数量Tcnt=CPU核心数*2+2,用于初始化处理线程数量,工作线程是请求的最终执行者,其处理流程如图3所示;
线程池最大待处理请求数Rmax=2*50*Tcnt;放大50倍的目的是放大投递请求数,保证每个优先级比例算出来的投递请求数都是整数,放大2倍的目的是保证当前待处理队列处理超过1/2的时候能够马上投递请求数,保证处理和投递的延续性;
线程池当前待处理请求队列数量Rcur,初始值为0,用于计数统计当前已投递的待处理请求数;
b)初始化当前待处理请求队列,该队列用于存储所有应用层已投递到线程池的请求,按照投递顺序排列,该队列只是顺序处理,与具体优先级无关;
c)初始化创建完成端口,并创建与线程池数量Tcnt相等个数的线程,用于处理上层应用层投递的工作线程请求;每个线程的初始化状态为挂起,并循环等待完成端口消息触发状态,整个线程池的最底层通过完成端口完成请求投递和线程的切换调度;
步骤3、基于优先级调度比例的工作线程调度流程;
a)应用层请求投递流程
如图2所示,根据应用层投递线程请求的优先级,将请求添加到对应优先级队列中,判断当前待处理请求队列是否需要投递下一批处理请求,是则投递,否则结束;
b)工作线程执行流程
如图3所示,线程初始处于挂起状态,一旦当前待处理请求队列中有新的请求投递时,则投递唤醒请求,唤醒其中一个线程进行处理;当线程被唤醒之后,先判断当前待处理请求队列是否为空,不为空则从当前待处理请求队列中取出一个请求进行处理,为空则结束处理;处理完一个请求之后,判断当前待处理请求队列是否需要继续投递下一批待处理请求,是则投递下一批待处理请求,否则不投递;最后,判断当前待处理请求队列是否为空,不为空则投递下一次线程唤醒请求,唤醒下一个线程继续处理,为空则结束处理;
c)投递下一批待处理请求流程
开始投递下一批待处理请求的流程是本发明的主要核心。如图4所示,计算此次需要投递的待处理请求个数Rwait=Rmax-Rcur,按照优先级从高到低依次枚举,从每一个优先级队列中根据对应比例Ri,i=1...N,计算该优先级队列最大投递请求个数Mi=Rwait*Ri,并获取当前优先级队列请求个数mi,如果某一个优先级队列中的请求数大于计算结果mi>=Mi,则取出Mi个请求数投递到当前待处理请求队列中,否则将该优先级队列中的mi个请求全部投递到当前待处理请求队列中,并从比当前优先级高的优先级队列中,按照优先级顺序从高到低,补充不足的请求数Li=Mi-mi,然后继续下一个优先级队列的投递;当所有的优先级队列枚举完成之后,根据当前待处理请求队列中请求数,投递min(Rcur,Tcnt)个线程唤醒请求,唤醒线程进行处理。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。
Claims (2)
1.一种基于优先级比例队列的工作线程的调度方法,其特征在于:首先,根据工作线程优先级的分级数目创建对应数量的优先级队列,用于存储应用层投递的工作线程请求,并设定各个优先级队列间的调度比例,所有优先级队列调度比例总和为100%,同时,创建当前待处理请求队列,每次向线程池投递请求时,根据预置的优先级调度比例,从各优先级队列中取出对应百分比数量的请求,并投递到当前待处理请求队列中等待进行并发处理。
2.根据权利要求1所述的一种基于优先级比例队列的工作线程的调度方法,其特征在于包括如下步骤:
步骤1、创建优先级队列和初始化优先级调度比例
a)假设优先级分级数目为N,则创建N个优先级队列用于存储应用层投递的各优先级工作线程请求;
b)设置不同优先级队列的调度比例Ri,i=1...N,且保证所有优先级调度比例之和为100%,即
步骤2、初始化线程池
a)初始化计算如下变量:
线程池数量Tcnt=CPU核心数*2+2,用于初始化工作线程数量;
线程池最大待处理请求数Rmax=2*50*Tcnt;
线程池当前待处理请求队列数量Rcur,初始值为0,用于计数统计当前已投递的待处理请求数;
b)初始化当前待处理请求队列,该队列用于存储所有应用层已投递到线程池的请求,按照投递顺序排列,该队列只是顺序处理,与具体优先级无关;
c)初始化创建完成端口,并创建与线程池数量Tcnt相等个数的线程,用于处理上层应用层投递的工作线程请求;每个线程的初始化状态为挂起,并循环等待完成端口消息触发状态,整个线程池的最底层通过完成端口完成请求投递和线程的切换调度;
步骤3、基于优先级调度比例的工作线程调度
a)应用层请求投递流程
根据应用层投递线程请求的优先级,将请求添加到对应优先级队列中,判断当前待处理请求队列是否需要投递下一批处理请求,是则投递,否则结束;
b)工作线程执行流程
线程初始处于挂起状态,一旦当前待处理请求队列中有新的请求投递时,则投递唤醒请求,唤醒其中一个线程进行处理;当线程被唤醒之后,先判断当前待处理请求队列是否为空,不为空则从当前待处理请求队列中取出一个请求进行处理,为空则结束处理;处理完一个请求之后,判断当前待处理请求队列是否需要继续投递下一批待处理请求,是则投递下一批待处理请求,否则不投递;最后,判断当前待处理请求队列是否为空,不为空则投递下一次线程唤醒请求,唤醒下一个线程继续处理,为空则结束处理;
c)投递下一批待处理请求流程
计算此次需要投递的待处理请求个数Rwait=Rmax-Rcur,按照优先级从高到低依次枚举,从每一个优先级队列中根据对应比例Ri,i=1...N,计算该优先级队列最大投递请求个数Mi=Rwait*Ri,并获取当前优先级队列请求个数mi,如果某一个优先级队列中的请求数大于计算结果mi>=Mi,则取出Mi个请求数投递到当前待处理请求队列中,否则将该优先级队列中的mi个请求全部投递到当前待处理请求队列中,并从比当前优先级高的优先级队列中,按照优先级顺序从高到低,补充不足的请求数Li=Mi-mi,然后继续下一个优先级队列的投递;当所有的优先级队列枚举完成之后,根据当前待处理请求队列中请求数,投递min(Rcur,Tcnt)个线程唤醒请求,唤醒线程进行处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510569932.2A CN105117284B (zh) | 2015-09-09 | 2015-09-09 | 一种基于优先级比例队列的工作线程的调度方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510569932.2A CN105117284B (zh) | 2015-09-09 | 2015-09-09 | 一种基于优先级比例队列的工作线程的调度方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105117284A true CN105117284A (zh) | 2015-12-02 |
CN105117284B CN105117284B (zh) | 2020-09-25 |
Family
ID=54665285
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510569932.2A Active CN105117284B (zh) | 2015-09-09 | 2015-09-09 | 一种基于优先级比例队列的工作线程的调度方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105117284B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105468305A (zh) * | 2015-12-09 | 2016-04-06 | 浪潮(北京)电子信息产业有限公司 | 一种数据缓存方法、装置和系统 |
CN106681819A (zh) * | 2016-12-29 | 2017-05-17 | 杭州迪普科技股份有限公司 | 一种线程的处理方法及装置 |
CN106775990A (zh) * | 2016-12-31 | 2017-05-31 | 中国移动通信集团江苏有限公司 | 请求调度方法和装置 |
CN106899649A (zh) * | 2016-06-30 | 2017-06-27 | 阿里巴巴集团控股有限公司 | 一种任务请求处理方法、装置和用户设备 |
CN107135241A (zh) * | 2016-02-26 | 2017-09-05 | 新华三技术有限公司 | 一种业务处理方法和装置 |
CN110688208A (zh) * | 2019-09-09 | 2020-01-14 | 平安普惠企业管理有限公司 | 线性递增的任务处理方法、装置、计算机设备和存储介质 |
CN111597018A (zh) * | 2020-04-21 | 2020-08-28 | 清华大学 | 一种机器人作业调度方法及装置 |
CN113467933A (zh) * | 2021-06-15 | 2021-10-01 | 济南浪潮数据技术有限公司 | 分布式文件系统线程池优化方法、系统、终端及存储介质 |
CN113760991A (zh) * | 2021-03-25 | 2021-12-07 | 北京京东拓先科技有限公司 | 数据操作方法、装置、电子设备和计算机可读介质 |
CN114116184A (zh) * | 2022-01-28 | 2022-03-01 | 腾讯科技(深圳)有限公司 | 虚拟场景中的数据处理方法及装置、设备、介质 |
CN116934059A (zh) * | 2023-09-18 | 2023-10-24 | 华芯(嘉兴)智能装备有限公司 | 一种天车调度方法、装置、设备及可读存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102262668A (zh) * | 2011-07-28 | 2011-11-30 | 南京中兴新软件有限责任公司 | 分布式文件系统文件读写方法、分布式文件系统及其装置 |
US20120023498A1 (en) * | 2010-05-18 | 2012-01-26 | Lsi Corporation | Local messaging in a scheduling hierarchy in a traffic manager of a network processor |
CN103237296A (zh) * | 2013-04-19 | 2013-08-07 | 中国建设银行股份有限公司 | 短信发送方法和用于发送短信的系统 |
CN103473129A (zh) * | 2013-09-18 | 2013-12-25 | 柳州市博源环科科技有限公司 | 线程数目可伸缩的多任务队列调度系统及其实现方法 |
CN103916891A (zh) * | 2014-03-27 | 2014-07-09 | 桂林电子科技大学 | 一种异构web服务网关实现方法及装置 |
CN104111877A (zh) * | 2014-07-29 | 2014-10-22 | 广东能龙教育股份有限公司 | 一种基于线程调配引擎的线程资源动态调配系统和方法 |
US20150058858A1 (en) * | 2013-08-21 | 2015-02-26 | Hasso-Platt ner-Institut fur Softwaresystemtechnik GmbH | Dynamic task prioritization for in-memory databases |
-
2015
- 2015-09-09 CN CN201510569932.2A patent/CN105117284B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120023498A1 (en) * | 2010-05-18 | 2012-01-26 | Lsi Corporation | Local messaging in a scheduling hierarchy in a traffic manager of a network processor |
CN102262668A (zh) * | 2011-07-28 | 2011-11-30 | 南京中兴新软件有限责任公司 | 分布式文件系统文件读写方法、分布式文件系统及其装置 |
CN103237296A (zh) * | 2013-04-19 | 2013-08-07 | 中国建设银行股份有限公司 | 短信发送方法和用于发送短信的系统 |
US20150058858A1 (en) * | 2013-08-21 | 2015-02-26 | Hasso-Platt ner-Institut fur Softwaresystemtechnik GmbH | Dynamic task prioritization for in-memory databases |
CN103473129A (zh) * | 2013-09-18 | 2013-12-25 | 柳州市博源环科科技有限公司 | 线程数目可伸缩的多任务队列调度系统及其实现方法 |
CN103916891A (zh) * | 2014-03-27 | 2014-07-09 | 桂林电子科技大学 | 一种异构web服务网关实现方法及装置 |
CN104111877A (zh) * | 2014-07-29 | 2014-10-22 | 广东能龙教育股份有限公司 | 一种基于线程调配引擎的线程资源动态调配系统和方法 |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105468305A (zh) * | 2015-12-09 | 2016-04-06 | 浪潮(北京)电子信息产业有限公司 | 一种数据缓存方法、装置和系统 |
CN107135241A (zh) * | 2016-02-26 | 2017-09-05 | 新华三技术有限公司 | 一种业务处理方法和装置 |
CN106899649A (zh) * | 2016-06-30 | 2017-06-27 | 阿里巴巴集团控股有限公司 | 一种任务请求处理方法、装置和用户设备 |
CN106681819B (zh) * | 2016-12-29 | 2020-11-06 | 杭州迪普科技股份有限公司 | 一种线程的处理方法及装置 |
CN106681819A (zh) * | 2016-12-29 | 2017-05-17 | 杭州迪普科技股份有限公司 | 一种线程的处理方法及装置 |
CN106775990A (zh) * | 2016-12-31 | 2017-05-31 | 中国移动通信集团江苏有限公司 | 请求调度方法和装置 |
CN110688208A (zh) * | 2019-09-09 | 2020-01-14 | 平安普惠企业管理有限公司 | 线性递增的任务处理方法、装置、计算机设备和存储介质 |
CN111597018A (zh) * | 2020-04-21 | 2020-08-28 | 清华大学 | 一种机器人作业调度方法及装置 |
CN113760991A (zh) * | 2021-03-25 | 2021-12-07 | 北京京东拓先科技有限公司 | 数据操作方法、装置、电子设备和计算机可读介质 |
CN113467933A (zh) * | 2021-06-15 | 2021-10-01 | 济南浪潮数据技术有限公司 | 分布式文件系统线程池优化方法、系统、终端及存储介质 |
CN113467933B (zh) * | 2021-06-15 | 2024-02-27 | 济南浪潮数据技术有限公司 | 分布式文件系统线程池优化方法、系统、终端及存储介质 |
CN114116184A (zh) * | 2022-01-28 | 2022-03-01 | 腾讯科技(深圳)有限公司 | 虚拟场景中的数据处理方法及装置、设备、介质 |
CN114116184B (zh) * | 2022-01-28 | 2022-04-29 | 腾讯科技(深圳)有限公司 | 虚拟场景中的数据处理方法及装置、设备、介质 |
CN116934059A (zh) * | 2023-09-18 | 2023-10-24 | 华芯(嘉兴)智能装备有限公司 | 一种天车调度方法、装置、设备及可读存储介质 |
CN116934059B (zh) * | 2023-09-18 | 2023-12-19 | 华芯(嘉兴)智能装备有限公司 | 一种天车调度方法、装置、设备及可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN105117284B (zh) | 2020-09-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105117284A (zh) | 一种基于优先级比例队列的工作线程的调度方法 | |
CN108762896B (zh) | 一种基于Hadoop集群任务调度方法及计算机设备 | |
EP2330506B1 (en) | Method and device for balancing interrupt load of multicore processor | |
CN107370667B (zh) | 多线程并行处理方法和装置、可读介质和存储控制器 | |
CN102377685B (zh) | 一种订阅消息的发送系统以及订阅消息的发送方法 | |
CN101887383B (zh) | 一种进程实时调度方法 | |
CN104536827B (zh) | 一种数据调度方法和装置 | |
JP2015527681A5 (zh) | ||
WO2012139066A3 (en) | Asynchronous callback driven messaging request completion notification | |
CN103365718A (zh) | 一种线程调度方法、线程调度装置及多核处理器系统 | |
CN102523153B (zh) | 虚拟化环境下的负载均衡方法 | |
CN101339521A (zh) | 一种任务优先级动态调度算法 | |
CN104111877A (zh) | 一种基于线程调配引擎的线程资源动态调配系统和方法 | |
CN105516024B (zh) | 一种基于队列的任务流量监控方法及系统 | |
WO2013126415A3 (en) | Method and system for scheduling requests in a portable computing device | |
CN102270156A (zh) | 一种实时嵌入式系统定时器管理方法 | |
CN103336684B (zh) | 一种并发处理ap消息的ac及其处理方法 | |
CN112860974A (zh) | 计算资源的调度方法、装置、电子设备和存储介质 | |
US20140223436A1 (en) | Method, apparatus, and system for providing and using a scheduling delta queue | |
CN106095548B (zh) | 一种多核处理器系统中分发中断的方法和装置 | |
CN113986497B (zh) | 基于多租户技术的队列调度方法、装置及系统 | |
CN104268007A (zh) | 一种事件请求分布式调度方法和系统 | |
CN109491775B (zh) | 一种用于边缘计算环境下的任务处理与调度方法 | |
CN108563494A (zh) | 一种自适应动态调整的线程调度系统及方法 | |
Parikh et al. | Double level priority based optimization algorithm for task scheduling in cloud computing |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | 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 |