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

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

3天内不再提示

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

星星科技指导员 来源:嵌入式计算设计 作者:Paul Anderson 2022-06-19 07:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

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

数据竞争的阴险本质

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

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

if (!initialized) {

object = create();

initialized = true;

}

。。. 目的 。。.

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

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

if (!initialized) {

lock();

if (!initialized) {

object = create();

initialized = true;

}

unlock();

}

。。. 目的 。。.

从表面上看,这看起来就足够了,实际上,只要保证语句按该顺序执行就足够了。但是,优化编译器可能会生成实质上切换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 global or local

if (local == something) {

。..

}

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

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

发现风险缺陷的技术

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

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

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

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

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

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

审核编辑:郭婷

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

    关注

    68

    文章

    20148

    浏览量

    247156
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76714
  • 编译器
    +关注

    关注

    1

    文章

    1669

    浏览量

    51082
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    广电计量创新服务体系助力商业航天高质量发展

    近日,国家航天局正式印发《推进商业航天高质量安全发展行动计划(2025—2027年)》(以下简称《行动计划》),明确将商业航天纳入国家航天发展总体布局,提出到2027年实现产业规模显著壮大、创新活力
    的头像 发表于 11-27 17:22 896次阅读

    研华AI智能体推动储能产业高质量发展

    储能行业正面临海量数据处理与AI应用挑战。研华科技推出软硬件一体化控制方案,实现整站交付效率提升90%。该方案打通从数据采集到AI智能体构建的全链路,推动储能系统向智能化升级,为产业高质量
    的头像 发表于 11-02 15:43 643次阅读

    利用Verdi调试协处理器实现步骤

    本次给大家介绍的是利用Verdi调试协处理器实现步骤。 有时为了观察协处理器运行情况,需要查看协处理器接口的信号波形,此时可以用Verdi
    发表于 10-30 08:26

    PCBA工程师必看:高质量BOM的5个‘隐形规则’

    一站式PCBA加工厂家今天为大家讲讲PCBA加工中高质量BOM要求有哪些?PCBA加工中高质量BOM的5大核心要素。在PCBA加工中,高质量的物料清单(BOM)是保障生产零失误的核心工具
    的头像 发表于 10-17 09:18 402次阅读

    索尼重载设备的高质量远程制作方案和应用(2)

    索尼的远程制作可以被称之为制作级的高质量远程制作,或重载设备的高质量远程制作,远程设备结合常规系统设备,提供和本地制作类似的制作级高质量图像,延续电视台/制作公司的设备特点和优势。
    的头像 发表于 08-21 15:56 876次阅读
    索尼重载设备的<b class='flag-5'>高质量</b>远程制作方案和应用(2)

    模型时代,如何推进高质量数据集建设?

    高质量数据集,即具备高价值、高密度、标准化特征的数据集合。 在AI领域,高质量数据集地位举足轻重,如同原油经炼化成为汽油驱动汽车,海量原始数据需转化为高质量数据集,才能助力大模型精准掌
    的头像 发表于 08-21 13:58 529次阅读

    从芯片到主板,科技创新实现高质量发展

    数字化时代,科技的迅猛发展深刻影响着各个领域。从芯片到主板的集成,生动展现了科技创新如何成为推动高质量发展的核心动力。
    的头像 发表于 07-26 16:26 653次阅读

    MBSE工具+架构建模:从效率提升到质量赋能

    MBSE解决方案,以架构建模为纽带,工具链集成为支撑,帮助客户有效应对汽车电子系统日益增长的复杂性挑战。通过打破信息孤岛、实现变更协同、提升工具链流畅度,加速开发进程、降低返工成本、提
    的头像 发表于 06-20 10:57 530次阅读
    MBSE<b class='flag-5'>工具</b>+架<b class='flag-5'>构建模</b>:从效率提升到<b class='flag-5'>质量</b>赋能

    您的模型诊断专家MI:助力把好模型质量

    Model Inspector是一款专门针对汽车、航空、轨交等行业的静态模型检查工具,可以对模型进行自动化、批量化建模规范和复杂度量的检查,
    的头像 发表于 06-11 16:57 1081次阅读
    您的<b class='flag-5'>模型</b>诊断专家MI:助力把好<b class='flag-5'>模型</b><b class='flag-5'>质量</b>关

    CADENAS 数字产品配置轻松实现Ascendor电梯规划

    的客户提供了符合国际标准的高质量数据。电梯制造商的经销商在为客户提供咨询和处理订单时,也因这款工具而得到了大力支持。 数字产品配置有助于推动业务扩张 对于 Ascendor 公司
    发表于 04-28 14:22

    电动工具EMC测试整改:迈向高质量生产的必由之路

    深圳南柯电子|电动工具EMC测试整改:迈向高质量生产的必由之路
    的头像 发表于 02-27 09:37 729次阅读
    电动<b class='flag-5'>工具</b>EMC测试整改:迈向<b class='flag-5'>高质量</b>生产的必由之路

    广汽集团召开高质量发展大会

    春回大地,万象更新。近两日广东省、广州市聚焦“建设现代化产业体系”主题,相继召开“新春第一会”——高质量发展大会,吹响奋进号角。广汽集团党委书记、董事长冯兴亚作为省市重点产业高质量发展代表参加会议,与产学研各界代表共聚一堂,共绘广东、广州
    的头像 发表于 02-07 10:18 1017次阅读

    电动工具EMC测试整改:迈向高质量生产的必经之路

    深圳南柯电子|电动工具EMC测试整改:迈向高质量生产的必经之路
    的头像 发表于 01-14 14:29 791次阅读
    电动<b class='flag-5'>工具</b>EMC测试整改:迈向<b class='flag-5'>高质量</b>生产的必经之路

    QorIQ®T1042多核处理器

    QorIQ®T1042多核处理器T1042 QorIQ高级多核处理器综合了数据网络、电信/数据通讯、无线网络基础设施和国防军事/航天工程应用所需要的性能卓越数据线路加速及网络和外围总线
    发表于 01-10 08:48

    借助谷歌Gemini和Imagen模型生成高质量图像

    在快速发展的生成式 AI 领域,结合不同模型的优势可以带来显著的成果。通过利用谷歌的 Gemini 模型来制作详细且富有创意的提示,然后使用 Imagen 3 模型根据这些提示生成
    的头像 发表于 01-03 10:38 1340次阅读
    借助谷歌Gemini和Imagen<b class='flag-5'>模型</b>生成<b class='flag-5'>高质量</b>图像