如何获知硬件支持是否支持tas指令集

METHOD AND APPARATUS FOR PREVENTING REGISTER CONFLICT
WIPO Patent Application WO/
A method and an apparatus for preventing register conflict, wherein the method comprises: obtaining a life cycle of each variable of a p and detecting whether the life cycle of the each variable in the register overlaps another, and reporting an alarm if a detection result is yes. The apparatus comprises: an obtaining module, a detection module and an alarm module. The obtaining module is configured to obtain the life cycle of the each variable of the pro the detection module is configured to detect whether the life cycle of the each variable in the register overlaps another, and send a notification to the alarm module if the det and the alarm module is configured to report an alarm when receiving the notification sent by the detection module.
Inventors:
JIANG, Haiming (ZTE Plaza, Keji Road South Hi-Tech Industrial Park, Nansha, Shenzhen Guangdong 7, 518057, CN)
WANG, Zhichun (ZTE Plaza, Keji Road South Hi-Tech Industrial Park, Nansha, Shenzhen Guangdong 7, 518057, CN)
Application Number:
Publication Date:
07/02/2015
Filing Date:
06/23/2014
Export Citation:
ZTE CORPORATION (ZTE Plaza, Keji Road South Hi-Tech Industrial Park, Nansha, Shenzhen Guangdong 7, 518057, CN)
International Classes:
View Patent Images:
&&&&&&PDF help
Foreign References:
Other References:
CHANG, ZHIYAN: "Register Allocation Problem for Embedded Systems: Heuristic and Evolutionary Algorithm'';", ELECTRONIC TECHNOLOGY & INFORMATION SCIENCE , CHINA MASTER'S THESES FULL-TEXT DATABASE;, 15 May -05-15), pages 8
Attorney, Agent or Firm:
CHINA PAT INTELLECTUAL PROPERTY OFFICE (2nd Floor, Zhongguancun Intellectual Property BuildingBlock B, No. 21 Haidian South Road, Haidian, Beijing 0, 100080, CN)
权利要求书
1、 一种避免寄存器冲突的方法, 包括:
获取程序在寄存器中各变量的生命周期;
检测所述寄存器中各变量的生命周期是否重叠, 并在检测结果为是 时进行告警。
2、 如权利要求 1所述的避免寄存器冲突的方法, 其中, 所述获取程 序在寄存器中各变量的生命周期的步骤包括:
利用正则表达式对程序进行解析获取寄存器中各变量的生命周期。 3、 如权利要求 2所述的避免寄存器冲突的方法, 其中, 利用正则表 达式对程序进行解析获取寄存器中各变量的生命周期的步骤包括:
利用正则表达式对程序变量定义部分进行解析, 获取程序的各变量 及其寄存器定义;
利用正则表达式对程序指令行进行解析, 获取各个变量的生命周期; 根据程序的各变量及其寄存器定义、 各个变量的生命周期统计各个 寄存器中各变量的生命周期。
4、 如权利要求 1所述的避免寄存器冲突的方法, 其中, 所述进行告 警的步骤包括: 通过脚本向用户提示错误来实现告警。
5、 如权利要求 1-4任一项所述的避免寄存器冲突的方法, 其中, 所 述方法还包括: 当所述寄存器中各变量的生命周期没有重叠时, 输出所 述程序在寄存器中各变量的生命周期到文本文件中。
6、 一种避免寄存器冲突的装置, 包括: 获取模块、 检测模块及告警 模块;
所述获取模块配置为, 获取程序在寄存器中各变量的生命周期; 所述检测模块配置为, 检测所述寄存器中各变量的生命周期是否重 叠, 并在检测结果为是时发送通知给告警模块; 所述告警模块配置为, 在收到检测模块发送的通知后进行告警。 7、 如权利要求 6所述的避免寄存器冲突的装置, 其中, 所述获取模 块还包括解析模块, 所述解析模块利用正则表达式对程序进行解析获取 寄存器中各变量的生命周期。
8、 如权利要求 7所述的避免寄存器冲突的装置, 其中, 所述解析模 块包括第一获取子模块、 第二获取子模块及统计子模块;
所述第一获取子模块配置为, 利用正则表达式对程序变量定义部分 进行解析, 获取程序的各变量及其寄存器定义;
所述第二获取子模块配置为, 利用正则表达式对程序指令行进行解 析, 获取各个变量的生命周期;
所述统计子模块配置为, 根据程序的各变量及其寄存器定义、 各个 变量的生命周期统计各个寄存器中各变量的生命周期。
9、 如权利要求 6所述的避免寄存器冲突的装置, 其中, 告警模块通 过脚本向用户提示错误来实现告警。
10、 如权利要求 6-9任一项所述的避免寄存器冲突的装置, 其中, 还 包括文本输出模块; 当所述寄存器中各变量的生命周期没有重叠时, 检 测模块将告知文本输出模块, 文本输出模块输出所述程序在寄存器中各 变量的生命周期到文本文件中。
11、 一种计算机可读存储介质, 所述存储介质包括一组计算机可执 行指令,所述指令用于执行权利要求 1-5任一项所述的避免寄存器冲突的 方法。
Description:
一种避免寄存器冲突的方法及装置 技术领域
本发明涉及计算机领域, 特别涉及一种避免寄存器冲突的方法及装置。 背景技术
现今计算机、 手机、 平板电脑等电子设备的使用已经非常的普遍, 这 些电子设备中的软件都是由编程人员编写的程序组成的。 在程序中会使用 到变量, 变量通常存储于寄存器中, 以微码为例, 微码是程序的一种, 它 是存储于网络处理器中的指令集, 驻留于网络处理器的微引擎中, 是整个 数据转发层面的核心。 寄存器是网络处理器微引擎中的重要资源, 微码编 程利用寄存器存储一些临时变量,根据转发逻辑实现各种业务。在程序中, 每个变量在寄存器中都有各自的生命周期, 即从开始使用该变量到该变量 不再使用之间的指令周期间隔。 因程序中的变量会有多个, 寄存器的数量 又有限, 所以经常会将多个变量放置于同一个寄存器中, 如果同一寄存器 的两个变量的生命周期出现重叠, 就会出现寄存器冲突的情况。
由于编程人员在编写程序的过程中, 并不知道寄存器的使用情况, 所 以在定义变量的时候, 经常是凭感觉确定寄存器的使用情况, 这样导致的 后果就是经常会出现寄存器冲突的情况。 发明内容
为解决现有存在的技术问题, 本发明实施例提供了一种避免寄存器冲 突的方法及装置。
本发明实施例提供一种避免寄存器冲突的方法, 包括: 获取程序在寄 存器中各变量的生命周期; 检测所述寄存器中各变量的生命周期是否重叠, 并在检测结果为是时进行告警。 在本发明的一种实施例中, 获取程序在寄存器中各变量的生命周期的 步骤包括: 利用正则表达式对程序进行解析获取寄存器中各变量的生命周 期。
在本发明的一种实施例中, 利用正则表达式对程序进行解析获取寄存 器中各变量的生命周期的步骤包括: 利用正则表达式对程序变量定义部分 进行解析, 获取程序的各变量及其寄存器定义; 利用正则表达式对程序指 令行进行解析, 获取各个变量的生命周期; 根据程序的各变量及其寄存器 定义、 各个变量的生命周期统计各个寄存器中各变量的生命周期。
在本发明的一种实施例中, 所述进行告警的步骤包括: 通过脚本向用 户提示错误来实现告警。
在本发明的一种实施例中, 所述方法还包括: 当所述寄存器中各变量 的生命周期没有重叠时, 输出所述程序在寄存器中各变量的生命周期到文 本文件中。
本发明实施例还提供了一种避免寄存器冲突的装置, 包括:获取模块、 检测模块及告警模块; 获取模块配置为, 获取程序在寄存器中各变量的生 命周期;检测模块配置为,检测所述寄存器中各变量的生命周期是否重叠, 并在检测结果为是时发送通知给告警模块; 告警模块配置为, 在收到检测 模块发送的通知后进行告警。
在本发明的一种实施例中, 获取模块还包括解析模块, 解析模块利用 正则表达式对程序进行解析获取寄存器中各变量的生命周期。
在本发明的一种实施例中, 解析模块包括第一获取子模块、 第二获取 子模块及统计子模块; 第一获取子模块配置为, 利用正则表达式对程序变 量定义部分进行解析, 获取程序的各变量及其寄存器定义; 第二获取子模 块配置为, 利用正则表达式对程序指令行进行解析, 获取各个变量的生命 周期; 统计子模块配置为, 根据程序的各变量及其寄存器定义、 各个变量 的生命周期统计各个寄存器中各变量的生命周期。 在本发明的一种实施例中, 告警模块通过脚本向用户提示错误来实现 杏口 。
在本发明的一种实施例中, 该装置还包括文本输出模块; 当寄存器中 各变量的生命周期没有重叠时, 检测模块将告知文本输出模块, 文本输出 模块输出程序在寄存器中各变量的生命周期到文本文件中。
本发明实施例还提供一种计算机可读存储介质, 所述存储介质包括一 组计算机可执行指令, 所述指令用于执行本发明实施例所述的避免寄存器 冲突的方法。 本发明实施例的有益效果是:
本发明实施例提供的一种避免寄存器冲突的方法及装置, 能够避免在 程序运行的过程中寄存器发生冲突。 本发明实施例的方法具体包括: 获取 程序在寄存器中各变量的生命周期; 检测所述寄存器中各变量的生命周期 是否重叠, 并在检测结果为是时进行告警; 本发明实施例的方法可以在编 程过程中或编写好程序的初稿后, 获取寄存器中程序各变量具体的生命周 期, 当发现寄存器中有变量重叠时, 便对编程人员进行告警, 使编程人员 获知寄存器存在冲突, 从而才能及时地对程序进行修改, 使程序在各寄存 器中的变量不再重叠; 与现有技术相比, 本发明实施例的方法能够有效地 避免在程序运行的过程中寄存器发生冲突的情况, 提高编程的效率。 附图说明
图 1为本发明实施例一提供的方法的流程示意图;
图 2为本发明实施例三提供的方法的流程示意图;
图 3为本发明实施例三提供的微码文件的部分内容;
图 4为本发明实施例三提供的输出的变量生命周期的文本文件; 图 5为本发明实施例四提供的装置的结构示意图。 具体实施方式
下面通过具体实施方式结合附图对本发明作进一步详细说明。
实施例一:
本实施例提供了一种避免寄存器冲突的方法, 该方法的流程如图 1 所 示:
步骤 S101 : 开始。
步骤 S102: 获取程序在寄存器中各变量的生命周期。
因本发明实施例主要解决的是避免编程人员编写的程序在运行的过程 中出现寄存器冲突的情况, 所以一般在编程人员在编写程序的过程中、 或 者在编程人员编写好程序的初稿后获取寄存器中各变量的生命周期。
以下用一个具体的例子来说明变量的生命周期的含义。 比如程序中定 义了一个变量存储报文的目的 IP地址, 取名 destlp, 存储于寄存器 R1中, 如果在程序中从第 m行开始使用 destlp, 第 n行使用完毕, 则其生命周期 值为 n-m,并且在第 n行以后寄存器 R1便释放出来,可以定义为其他变量。 上述第 m行就是生命周期的起始位置, 第 n行就是生命周期的终止位置, n-m为变量的生命周期值。 因此, 变量的生命周期包括起始位置、 终止位置 和变量的生命周期值。
获取程序在寄存器中各变量的生命周期的方式有多种, 因目前大部分 脚本语言都带有正则表达式解析功能, 比如 python、 perl等。 所以可以利用 正则表达式对程序进行解析获取寄存器中各变量的生命周期。 具体的, 解 析程序中的变量定义部分获取变量及其寄存器定义(即变量所在的寄存器); 解析程序的指令行, 获取每个变量的生命周期; 最后, 根据各变量及其寄 存器定义、 各个变量的生命周期统计各个寄存器中各变量的生命周期。
步骤 S103 : 检测所述寄存器中各变量的生命周期是否重叠, 如是, 则 执行步骤 S104, 如否, 执行步骤 S105; 检测步骤可以是在编程人员在编写程序的过程中、 或者在编程人员编 写好程序的初稿后进行。 对应的, 当检测步骤是在编程人员在编写程序的 过程中进行时, 如果检测到寄存器中各变量的生命周期有重叠, 则及时对 编程人员进行告警。
检测的方式有多种, 较优的, 可以通过以下方式进行: 判断寄存器中 的某个变量的生命周期的起始位置或者终止位置是否在同一寄存器中另一 变量的生命周期的起始位置到终止位置之间, 如果是, 则存在重叠。
步骤 S104: 告警;
告警方式可以通过脚本向编程人员提示错误, 也可以通过发出告警声 音向编程人员提示错误。 通过脚本向编程人员提示错误时, 脚本包含的信 息包括: 重叠的变量、 变量所在的寄存器。 较优地, 为使编程人员能尽快 地修改程序, 解决变量生命周期重叠的问题, 脚本中还可以包括变量生命 周期重叠的位置, 例如: 变量 1和 2发生重叠, 具体发生重叠的位置在 寄存器 RQ的第 4至第 7行。
步骤 S105: 结束。
在本发明的另一种实施例中提供了另一种方法, 该方法的具体流程和 上述方法基本一致, 不同之处在于: 在该方法中, 当寄存器中各变量的生 命周期没有重叠时, 则输出寄存器中各变量的生命周期到文本文件中, 文 本文件中包含: 变量的生命周期、 占用的寄存器等信息。 这样可以方便编 程人员在修改代码, 增加变量时寻找空闲的寄存器资源。 表示各变量的生 命周期的文本文件的表现形式可以为表格、 图形等。 实施例二:
为更好的说明上述方法中获取的程序在寄存器中各变量的生命周期包 含的内容, 及如何检测寄存器中各变量的生命周期是否重叠, 下面以一个 具体的操作过程进行说明: 编程人员编写的程序中定义了 5个变量, 分别是 VI、 V2、 V3、 V4、 V5, 在编程人员编写完程序之后, 对程序进行解析, 获取了这 5个变量的 生命周期, 如表 1所示:
V3的生命周期信息, 以及程序在寄存器 R1 中的变量 V4、 V5的生命周期 信息。 在获取完生命周期后, 检测寄存器中各变量的生命周期是否重叠, 在检测时, 可以依次对寄存器 R0和寄存器 R1进行检测, 也可以对两个寄 存器同时进行检测。 在对寄存器 R0检测后, 发现变量 V2的初始位置在第 2行, 其在变量 VI的初始位置和终止位置之间, 所以判定变量 VI的生命 周期和 V2 的生命周期重叠。 此时, 向编程人员进行告警, 并告知其变量 VI的生命周期和 V2的生命周期重叠, 需要进行调整。
虽然变量 V4的生命周期初始位置是第 1行与变量 VI的生命周期的初 始位置相同,终止位置是第 4行与变量 VI的生命周期的终止位置相同, 但 因为他们使用的寄存器不是同一个, 所以变量 VI和变量 V4的生命周期之 间并不存在重叠。 实施例三:
为更好的说明本发明提供的方法, 下面以具体的实施例进行说明, 请 参见图 2。在本实施例中, 利用正则表达式对程序进行解析获取寄存器中各 变量的生命周期, 且程序为凝:码程序。
该 码文件中的变量定义部分以 assign开头, 用于为每个变量指定寄 存器。假设微码可用的寄存器资源为 R0,R1 ;微码文件中指令总行数为 21。 码的部分内容请见图 3 (为描述方便, 图 3中用 a简化的表示 assign )。
步骤 S201 : 开始;
步骤 S202: 利用正则表达式对程序变量定义部分进行解析, 获取程序 的各变量及其寄存器定义; 由上述 码的内容可知, 以 assign开头的指令 行为变量定义指令行, 利用正则表达式对 码进行解析可以获取到的变量 及其寄存器定义为: 变量 VI、 V2、 V3、 V4占用寄存器 R0; 变量 V5、 V6 占用寄存器 Rl。
步骤 S203 : 利用正则表达式对程序指令行进行解析, 获取各个变量的 生命周期, 变量 VI的生命周期为第 0行到第 3行; 变量 V2的生命周期为 第 7行到第 8行; 变量 V3的生命周期为第 10行到第 13行; 变量 V4的生 命周期为第 18行到第 21行; 变量 V5的生命周期为第 1行到第 5行; 变量 V6的生命周期为第 8行到第 10行。
步骤 S204: 根据各变量及其寄存器定义、 各个变量的生命周期统计各 个寄存器中各变量的生命周期; 统计的结果是: 变量 VI、 V2、 V3、 V4占 用寄存器 R0; 变量 VI的生命周期为第 0行到第 3行; 变量 V2的生命周期 为第 7行到第 8行; 变量 V3的生命周期为第 10行到第 13行; 变量 V4的 生命周期为第 18行到第 21行。 变量 V5、 V6占用寄存器 R1 ; 变量 V5的 生命周期为第 1行到第 5行; 变量 V6的生命周期为第 8行到第 10行。
步骤 S205: 检测所述寄存器中各变量的生命周期是否重叠, 如是, 则 转到步骤 S206; 如否, 则转到步骤 S207。 因为本实施例中的寄存器 R0和 R1中的变量的生命周期都不存在重叠, 所以转到步骤 S207;
步骤 S206: 告警, 告警的方式采用脚本向用户提示错误。 步骤 S207: 输出寄存器中各变量的生命周期到文本文件中, 输出的文 本文件以表格的形式呈现, 如图 4所示。
步骤 S208: 结束。 实施例四:
本实施例提供了一种避免寄存器冲突的装置, 包括: 获取模块 10、 检 测模块 20及告警模块 30, 如图 5所示; 获取模块 10配置为, 获取程序在 寄存器中各变量的生命周期; 检测模块 20配置为, 检测所述寄存器中各变 量的生命周期是否重叠, 并在检测结果为是时发送通知给告警模块 30; 告 警模块 30配置为, 在收到检测模块 20发送的通知后进行告警。
因本发明实施例主要解决的是避免编程人员编写的程序存在寄存器冲 突的情况, 所以一般在编程人员在编写程序的过程中、 或者在编程人员编 写好程序的初稿后获取模块 10才开始获取寄存器中各变量的生命周期。 检 测模块可以是在编程人员在编写程序的过程中、 或者在编程人员编写好程 序的初稿后对检测寄存器中各变量的生命周期是否重叠。 对应的, 如果检 测模块 20的检测过程是在编程人员编写程序的过程中进行时, 如果检测模 块 20检测到寄存器中各变量的生命周期有重叠, 则及时通知告警模块 30。
以下用一个具体的例子来说明变量的生命周期的含义。 比如程序中定 义了一个变量存储报文的目的 IP地址, 取名 destlp, 存储于寄存器 R1中, 如果在程序中从第 m行开始使用 destlp, 第 n行使用完毕, 则其生命周期 值为 n-m,并且在第 n行以后寄存器 R1便释放出来,可以定义为其他变量。 上述第 m行就是生命周期的起始位置, 第 n行就是生命周期的终止位置, n-m为变量的生命周期值。 因此, 变量的生命周期包括起始位置、 终止位置 和变量的生命周期值。
上述检测模块 20可通过判断寄存器中的某个变量的生命周期的起始位 置或者终止位置是否在同一寄存器中另一变量的生命周期的起始位置到终 止位置之间来确定寄存器中各变量的生命周期是否重叠。
上述告警模块 30可以通过脚本向编程人员提示错误, 也可以通过发出 告警声音向编程人员提示错误。 通过脚本向编程人员提示错误时, 脚本包 含的信息包括: 重叠的变量、 变量所在的寄存器。 较优地, 为使编程人员 能尽快地修改程序, 解决变量生命周期重叠的问题, 脚本中还可以包括变 量生命周期重叠的位置, 例如: 变量 VI和 V2发生重叠, 具体发生重叠的 位置在寄存器 R0的第 4至第 7行。
上述获取模块 10还包括解析模块, 因目前大部分脚本语言都带有正则 表达式解析功能, 比如 python、 perl等, 所以可以利用正则表达式对程序进 行解析获取寄存器中各变量的生命周期; 解析模块即配置为, 利用正则表 达式对程序进行解析获取寄存器中各变量的生命周期。 解析模块包括第一 获取子模块、 第二获取子模块及统计子模块; 第一获取子模块配置为, 利 用正则表达式对程序进行解析后获取程序的各变量及其寄存器定义(即变 量所在的寄存器); 第二获取子模块配置为, 利用正则表达式对程序进行解 析后获取各个变量的生命周期; 统计子模块配置为, 根据各变量及其寄存 器定义、 各个变量的生命周期统计各个寄存器中各变量的生命周期。
该装置还包括文本输出模块; 当寄存器中各变量的生命周期没有重叠 时, 检测模块将告知文本输出模块, 文本输出模块输出寄存器中各变量的 生命周期到文本文件中, 文本文件的表现形式可以为表格、 图形等。
需要说明的是, 上述获取模块 10、 检测模块 20及告警模块 30, 解析 模块、 第一获取子模块、 第二获取子模块及统计子模块, 输出模块, 都可 以由避免寄存器冲突的装置的中央处理器( CPU, Central Processing Unit )、 微处理器 (MPU, Micro Processing Unit )、 数字信号处理器(DSP, Digital Signal Processor )或可编程逻辑阵列( FPGA, Field - Programmable Gate Array ) 实现。
本发明实施例还提供一种计算机可读存储介质, 所述存储介质包括一 组计算机可执行指令, 所述指令用于执行本发明实施例所述的避免寄存器 冲突的方法。 本领域内的技术人员应明白, 本发明的实施例可提供为方法、 系统、 或计算机程序产品。 因此, 本发明可采用硬件实施例、 软件实施例、 或结 合软件和硬件方面的实施例的形式。 而且, 本发明可采用在一个或多个其 中包含有计算机可用程序代码的计算机可用存储介质 (包括但不限于磁盘 存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、 设备(系统)、 和计算机程序 产品的流程图和 /或方框图来描述的。 应理解可由计算机程序指令实现流程 图和 /或方框图中的每一流程和 /或方框、以及流程图和 /或方框图中的流程和 /或方框的结合。 可提供这些计算机程序指令到通用计算机、 专用计算机、 嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器, 使得 通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现 在流程图一个流程或多个流程和 /或方框图一个方框或多个方框中指定的功 能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理 设备以特定方式工作的计算机可读存储器中, 使得存储在该计算机可读存 储器中的指令产生包括指令装置的制造品, 该指令装置实现在流程图一个 流程或多个流程和 /或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上, 使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现 的处理, 从而在计算机或其他可编程设备上执行的指令提供用于实现在流 程图一个流程或多个流程和 /或方框图一个方框或多个方框中指定的功能的 步骤。 能认定本发明的具体实施只局限于这些说明。 对于本发明所属技术领域的 普通技术人员来说, 在不脱离本发明构思的前提下, 还可以做出若干简单 推演或替换, 都应当视为属于本发明的保护范围。
& 2004-. All rights reserved.博客访问: 367594
博文数量: 29
注册时间:
认证徽章:
致力于PostgreSQL数据库内核研究,源码定制以及extension开发。实现了PG版的审计扩展和online readonly功能等。对数据库与操作系统交互性能优化以及分布式并行编程有一定研究。6年Oracle DBA经验,对Oracle 数据库internal有深入研究,擅长Oracle数据库以及RAC 环境下性能调优,故障分析。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 国内数据库
&&& TAS: 指Test-And-Set,它是一个原子操作,修改内存的值,并返回原来的值。当一个进程P1对一个内存位置做TAS操作,不允许其它进程P2对此内存位置,再做TAS操作。
P2必须等P1操作完成后,再做TAS操作。以下是一个简单的锁,通过TAS来实现:
volatile int lock = 0;
void Critical() {
while (TestAndSet(&lock) == 1);
critical section // only one process can be in this section at a time&
lock = 0 // release lock when finished with the critical section&
假设lock原来的值为“0”,当P1去做申请lock时,能获取得到锁。而此时P2再去申请锁时,必须spin,因为此时lock的值已经被P1修改为“1”了。
用TAS来实现spin lock,此处要注意volatile的使用。volatile表示这个变量是易失的,所以会编译器会每次都去内存中取原始值,而不是直接拿寄存器中的值。
这避免了在多线程编程中,由于多个线程更新同一个变更,内存中和寄存器中值的不同步而导致变量的值错乱的问题。另外,也会影响编译器的优化行为。
在PostgreSQL中,spin lock的实现包含在spin.c和s_lock.c两个文件中。在不支持TAS的情况下,PG会使用PGSemaphores来实现 spin lock。
1.使用semaphore实现
其中spin.c主要封装了spin lock用PGSemaphores来实现的接口,跟硬件保持独立。PGSemaphore是使用OS底层的semaphore来实现的,PG对其做了封装,提供了PG系统内部统一的semaphore操作接口。
PG的用PGSemaphore结构体表示PG 自身的semaphore信号,并将相关操作封装在sembuf中,传递给底层OS。
PG semaphore lock操作:
PG semaphore结构体:
操作封装:
semop操作:
底层OS实现调用,OS声明在/usr/sys/include/sem.h中:
从上面可以看出,PG的semaphore实现非常清晰,而且与OS底层的调用关系也很明了。
2.使用TAS指令实现
而s_lock.c 则用TAS方式了spin lock,与硬件相关。在PG源码中,使用s_lock函数来申请spin lock:
int s_lock(volatile slock_t *lock, const char *file, int line)
tas操作如下:
PG使用了自适应算法,来决定spin的次数和每次spin后,sleep的时间。
spins_per_delay:spin多少次后,开始sleep。默认为100,最大值为1000,最小值为10。
cur_delay:当前sleep的时间,最大值为1000,最小值为1。单位为毫秒。
spins_per_delay的值,基本上不变;但是cur_delay的值为当前值1倍和2倍之间变动。因此,spin delay次数越多,sleep时间会越长。
阅读(5751) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 g4400支持avx指令集吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信