0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

静态分析工具构建模型实现多核处理器的高质量

星星科技指导员 来源:嵌入式计算设计 作者:Paul Anderson 2022-07-09 06:58 次阅读

对多核处理器进行编程以利用其强大功能意味着编写多线程代码。C 和C++不是为并发而设计的,因此开发人员必须为这些语言使用诸如 pthreads 之类的库。由于全新类别的编程缺陷带来的风险,多线程代码比单线程代码更难正确处理。

在流氓的并发错误库中,竞争条件是臭名昭著的屡犯者。竞争条件发生在程序检查资源属性并假设该属性没有更改的情况下执行操作,即使外部参与者已经介入并更改了该属性。

数据竞争是一种特殊类型的竞争条件,它涉及对多线程程序中内存位置的并发访问。当有两个或多个执行线程访问共享内存位置,至少一个线程正在更改该位置的数据,并且没有明确的协调访问机制时,就会出现此缺陷。如果发生数据竞争,它会使程序处于不一致的状态。

数据竞争的阴险本质

人们普遍认为,一些数据竞争是无害的,可以安全地忽略。不幸的是,这仅在极少数情况下是正确的。最好通过举例说明原因。

单例模式是一种常见的习惯用法,其中程序维护对单个底层对象的引用,如果已初始化,则布尔变量对其进行编码。这种模式也称为延迟初始化。以下代码是该模式的示例:

if (!initialized) {

object = create();

initialized = true;

}

。.. object 。..

这段代码完全适合单线程程序,但它不是线程安全的,因为它在名为initialized的变量上存在数据竞争。如果由两个不同的线程调用,则存在两个线程几乎同时观察到初始化为 false 的风险,并且都将调用create(),从而违反了单例属性。

为了使这个线程安全,自然的方法是用锁保护整个if语句。然而,获取和释放锁的成本可能很高,因此程序员试图通过使用双重检查锁定习惯用法来避免这种成本——在锁范围之外进行检查,在锁范围内进行检查。内部检查用于确认在获得锁后第一个检查仍然有效:

if (!initialized) {

lock();

if (!initialized) {

object = create();

initialized = true;

}

unlock();

}

。.. object 。..

从表面上看,这看起来就足够了,实际上,只要保证语句按该顺序执行就足够了。但是,优化编译器可能会生成实质上切换object = create()和initialized = true顺序的代码。毕竟,这两个语句之间没有明确的依赖关系。在这种情况下,如果第二个线程在分配给initialized之后的任何时间进入此代码,则该线程将在object被初始化之前使用它的值。

优化编译器是不可思议的野兽。那些优化速度的人会考虑许多深奥的考虑,其中很少有对程序员来说是显而易见的。它们通常会生成明显无序的指令,因为这样做可能会导致更少的高速缓存未命中,或者因为需要更少的指令。

假设因为重新排序在前面的示例中引入了竞争条件,所以认为编译器有问题是错误的。编译器正在做它被允许做的事情。语言规范对此非常清楚和明确:允许编译器假设程序中没有数据竞争。

实际上,规范更广泛:允许编译器在存在未定义行为的情况下做任何事情。这有时被开玩笑地称为着火语义;如果程序具有未定义的行为,该规范允许编译器将计算机置于火上。除了数据竞争之外,缓冲区溢出、无效地址的取消引用等许多传统错误也构成了未定义的行为。因为编译器可以自由地做任何事情,而不是烧毁建筑物,他们通常会做明智的事情,即假设未定义的行为永远不会发生并相应地进行优化。

即使对于并发和编译器方面的专家来说,这样做的后果有时也会令人惊讶。很难让程序员相信看起来完全正确的代码可以编译成有严重错误的代码。

另一个例子是值得描述的。假设有两个线程,一个读取共享变量,另一个写入共享变量。让我们假设读者在写入者更改之前或之后看到该值并不重要(这不是一种不常见的模式)。如果这些访问不受锁保护,那么显然存在数据竞争。然而,尽管着火规则,大多数程序员会得出结论,这是完全良性的。

事实证明,至少有两种合理的方式可以编译这段代码,读者会看到错误的值。第一种方法很容易解释:假设该值是一个只能读取 32 位字的架构上的 64 位数量。那么读者和作者都需要两条指令,不幸的交错可能意味着读者看到旧值的前 32 位和新值的后 32 位,当它们组合时可能不是旧值也不是新的。

生成错误代码的第二种方式更为微妙。假设读者做了以下事情,其中数据竞争在名为global的变量上:

int local = global; // Take a copy of

// the global

if (local == something) {

。..

}

。.. // Some non-trivial code that does

// not change globalorlocal

if (local == something) {

。..

}

在这里,读者正在制作 racy 变量的本地副本并引用该值两次。可以合理地期望两个地方的值相同,但同样,优化编译器可以生成未满足期望的代码。如果将local分配给一个寄存器,那么它将有一个值用于第一次比较,但如果两个条件之间的代码足够重要,那么该寄存器可能会溢出——换句话说,为了不同的目的而重用。在这种情况下,在第二个条件下,local的值将从全局变量重新加载到寄存器中,此时编写器可能已将其更改为不同的值。

程序员应该非常怀疑某些数据竞争是可以接受的,并且应该努力从他们的代码中找到并删除它们。

发现风险缺陷的技术

在发现并发缺陷时,传统的动态测试技术可能不够用。一个通过一百次测试的程序并不能保证下一次通过,即使是相同的输入和相同的环境。这些错误是否出现对时间非常敏感,线程中的操作交错的顺序本质上是不确定的。

用于发现数据竞争的新动态测试技术正在出现。这些技术通过在应用程序执行时监视它们并观察每个线程持有的锁以及这些线程正在访问的内存位置来工作。如果发现异常,则发出诊断。其他工具有助于诊断可能导致故障的数据竞争。一些公司现在提供工具来促进数据竞争的诊断,从而允许重播导致异常的事件。

静态分析工具也可用于查找数据竞争和其他并发错误。动态测试工具会发现针对具有固定输入集的程序的特定执行出现的缺陷,而静态分析工具会检查所有可能的执行和所有可能的输入。出于性能原因,工具可能会限制进行多少探索,因此可能并不完全详尽;即便如此,它们可以涵盖的范围远远超过动态测试所能实现的范围。静态分析的优点是不需要测试用例,因为程序从未真正执行过。

相反,这些工具通过创建程序模型然后以各种方式探索模型以发现异常来工作。GrammaTech 的 CodeSonar 通过创建表示每个线程持有的锁集的模型并通过执行探索执行路径的程序的符号执行来发现数据竞争。它记录受锁保护的变量集,并使用此信息来查找可能导致共享变量在没有适当同步的情况下使用的交错。类似的技术可用于发现其他并发缺陷,例如死锁和锁管理不善。

一旦发现,数据竞争通常很容易修复,尽管这样做会导致性能损失。在某些情况下,可能会尝试使用 C 中的 volatile 关键字来纠正数据争用,但不建议这样做,因为 volatile 并非旨在解决并发问题,并且在任何情况下都是一个难以理解的构造,经常被错误编译。最新版本的 C 和 C++ 包含并发并支持原子操作。对这些操作的编译器支持正在慢慢出现,在它变得可用之前,最好的方法是使用锁。

为了实现多核处理器的高质量软件,建议对数据竞争采取零容忍政策。使用静态和动态技术的组合来查找它们,并注意不要过度依赖深奥的编译器技术来修复它们。这些缺陷是如此危险和不可预测,因此系统地消除它们是确保它们不会造成伤害的唯一安全方法。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18807

    浏览量

    226417
  • 嵌入式
    +关注

    关注

    5032

    文章

    18695

    浏览量

    296551
  • C++
    C++
    +关注

    关注

    21

    文章

    2084

    浏览量

    73232
收藏 人收藏

    评论

    相关推荐

    DevOps中的质量门工作原理,以及静态代码分析Klocwork和Perforce Helix QAC在质量门中的实践应用

    如何使用 静态代码 分析 工具(如Klocwork 和 Helix QAC) 实现 质量门。 什么是 质量
    的头像 发表于07-29 15:12 133次阅读

    【直播预告】基于ISO 26262实现高质量的MBD过程

    直播时间:2024年6月12号20:00直播平台:视频号、CSDN、B站、抖音下方一键预约直播大纲•基于 模型的软件开发(MBD)基本原则和优势 模型 质量是高效MBD的关键设计 质量是高效
    的头像 发表于06-06 08:25 176次阅读
    【直播预告】基于ISO 26262<b class='flag-5'>实现</b><b class='flag-5'>高质量</b>的MBD过程

    【大语言模型:原理与工程实践】大语言模型的预训练

    和多样性。 高质量数据能确保 模型稳定收敛,而数据的多样性则有助于 模型学习广泛的通用能力,如文本生成、信息抽取、问答和编程等。此外,数据的多样性对于确保 模型在实际应用中具有良好的泛化能力至
    发表于05-07 17:10

    北斗芯片产业的高质量发展之路

    高质量发展是全面建设社会主义现代化国家的首要任务”,二十大报告中对 高质量发展有着明确的论断和要求。在2023年的全国两会中还指出,加快 实现高水平科技自立自强,是推动 高质量发展的必由之
    的头像 发表于03-15 14:03 251次阅读
    北斗芯片产业的<b class='flag-5'>高质量</b>发展之路

    稳中创新•产业升级•高质量发展 | 联诚发高质量发展工作推进会议召开

    推动企业 高质量发展。联诚发创始人兼总裁龙平芳、董秘毛强军等公司领导、员工代表出席了本次大会。 会上,董秘毛强军首先提到,在当今竞争激烈的市场环境中,公司的 高质量发展是企业追求的最终目标。为了 实现这一目标,各板块和各岗
    的头像 发表于02-22 11:33 325次阅读
    稳中创新•产业升级•<b class='flag-5'>高质量</b>发展 | 联诚发<b class='flag-5'>高质量</b>发展工作推进会议召开

    商汤科技与库醇科技达成合作 为垂域大模型构建高质量大规模的领域微调数据

    数字化转型,为垂域大 模型 构建 高质量大规模的领域微调数据。 本次合作将基于商汤通用大 模型进行二次开发,给 模型注入领域知识, 训练一个专门根
    的头像 发表于01-10 09:46 586次阅读
    商汤科技与库醇科技达成合作 为垂域大<b class='flag-5'>模型</b><b class='flag-5'>构建</b><b class='flag-5'>高质量</b>大规模的领域微调数据

    首批!中软国际四款审计产品入选“高质量智能审计工具目录”

    高质量智能审计 工具目录 ”。 12月15日,由中国信通院主办的“2023 GOLF+ IT新治理领导力论坛”在北京召开,论坛以“筑牢治理根基,共建数字未来”为主题,旨在助力企业健康、 高质量发展,共建IT治理繁荣生态。论坛上
    的头像 发表于12-16 16:10 674次阅读

    双目测宽仪高质量生产利器 测宽仪价格

    光,它能做到无损检测,实时监测报警,数据存储,数据 分析,是为轧钢工作人员提供重要指导依据的设备,是 高质量生产的利器。
    发表于12-04 17:10

    卓越领航!广和通获评“2023高质量发展领军企业”

    ,广和通荣获“2023 高质量发展领军企业”! 该榜单由深圳市企业 高质量发展促进会联合哈尔滨工业大学(深圳)深圳 高质量发展与新结构研究院评选发布,旨在以科学研究、精准 分析和高效服务洞悉产
    的头像 发表于11-29 18:00 362次阅读
    卓越领航!广和通获评“2023<b class='flag-5'>高质量</b>发展领军企业”

    基于ARM的嵌入式电机控制处理器构建模型设计平台

    德赢Vwin官网 网站提供《基于ARM的嵌入式电机控制 处理器 构建模型设计平台.pdf》资料免费下载
    发表于11-24 14:39 0次下载
    基于ARM的嵌入式电机控制<b class='flag-5'>处理器</b><b class='flag-5'>构建</b>的<b class='flag-5'>模型</b>设计平台

    为什么有多核处理器?从多核到众核处理器

    其实“ 多核”这个词已经流行很多年了,世界上第一款商用的非嵌入式 多核 处理器是2002年IBM推出的POWER4。
    的头像 发表于11-16 16:25 1245次阅读
    为什么有<b class='flag-5'>多核</b><b class='flag-5'>处理器</b>?从<b class='flag-5'>多核</b>到众核<b class='flag-5'>处理器</b>

    高质量LTE网络改变传统天线技术

    德赢Vwin官网 网站提供《 高质量LTE网络改变传统天线技术.pdf》资料免费下载
    发表于11-10 15:25 0次下载
    <b class='flag-5'>高质量</b>LTE网络改变传统天线技术

    高质量C、C++编程指南

    林锐- 高质量C、C++编程指南电子档
    发表于10-07 07:14

    如何构建高质量的大语言模型数据集

    构建 高质量的大语言 模型数据集是训练强大自然语言 处理 模型的关键一步。以下是一些关键步骤和考虑因素,有助于创建具有多样性、准确性和时效性的数据集
    的头像 发表于09-11 17:00 1204次阅读

    国家能源局:推动构建高质量充电基础设施体系

    8月29日,国家能源局召开推进新能源汽车充电基础设施 高质量发展现场会。会上,国家能源局党组成员、副局长余兵表示, 构建 高质量充电基础设施体系是促进新能源汽车产业 高质量发展的有力保障,是扩
    的头像 发表于09-01 15:19 618次阅读
    国家能源局:推动<b class='flag-5'>构建</b><b class='flag-5'>高质量</b>充电基础设施体系