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

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

3天内不再提示

克服多核系统中的并发错误

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

多核处理器改变了游戏规则。我们只需要看看我们的智能手机就能看到它们卓越的处理能力的影响。在多核之前,处理器性能每年翻一番。随着半导体技术的进步,芯片上的晶体管数量从 1990 年的 100 万个增加到今天的 10 亿个以上。随着小型化的极限越来越近,业界转向多核设计以保持性能改进的步伐,因此现在四核处理器已司空见惯。通过并行处理器内核倍增处理能力的能力可实现非凡的性能。

并发不是一个新话题,但它在多核平台中呈现出一个新的维度。软件开发人员已经习惯于从单个处理器内的任务调度和上下文切换的角度来考虑并发性。然而,对于多个处理器内核,真正的并行性开始发挥作用:每个线程中的指令流在每个内核上并行执行。线程之间的通信通常是使用共享内存来实现的,并且对共享资源的访问同步通常是复杂性的最大来源,如果操作不正确,则是导致错误的主要原因。

编写一个正确的并发程序是出了名的困难,而多核架构使它变得更加困难。由于增加了复杂性,多核平台加剧了并发错误的影响,使它们特别有害。这些错误,包括竞争条件、死锁、活锁和资源匮乏,当它们出现时很难发现,甚至更难以诊断。在单处理器上无错误运行的程序可能会出现潜在错误,例如多核系统上的死锁。并发错误可能会出现异常症状,这些症状在触发它们的初始事件很久之后就会出现,并且通常难以重现。因为在测试过程中很难找到这样的错误,多核系统需要一种新的验证方法,专门解决并发错误。到目前为止,降低这些错误风险的最有效方法是采用多方面的方法,包括同行代码审查、测试,最重要的是,高级静态分析结合了复杂的并发模型。

编程语言支持

释放多核系统的全部性能潜力需要先进的编程技术。由于大多数嵌入式开发人员对多核编程比较陌生,因此引入并发错误的风险非常大。今天,C 和 C++ 仍然是嵌入式系统最流行的编程语言。然而,这些语言的根本弱点之一是它们不是为并发而设计的。最新版本 C11 和 C++11 引入了对多线程的标准化支持。添加了三个特性来解决并发问题:定义多线程程序行为的内存模型;可以被并发线程安全访问的原子数据类型;以及几个同步原语,例如锁和条件变量。尽管有这些改进,

与此同时,Java 越来越受到嵌入式开发人员的欢迎,如今有 28% 的人使用它,它现在是嵌入式系统第三流行的语言。与 C 和 C++ 相比,Java 始终在编程语言语法、源编译器和标准库中内置了对多线程的支持。此外,Java 5 添加了 java.util.concurrent 库,该库在 Java 6 和 Java 7 中进行了扩展,为并发和并行编程提供了广泛的支持。

许多嵌入式设计使用 C 或 C++ 和 Java 的组合。例如,Java 在汽车应用程序中非常流行,因为它为触摸屏显示器或娱乐系统的用户界面编程提供了一种简单的方法。此类应用程序可能有许多层,其中包含用 C 编写的安全关键代码,与运行在用户界面上的非安全关键 Java 代码进行通信。

静态分析工具

多核平台并发程序的最大挑战可能是无法保证能找到所有并发错误。实时执行指令的相对顺序是多线程程序中缺陷的主要来源。当多个线程运行时,它们的指令执行的相对顺序取决于同时处于活动状态的其他线程。如果错误是通过编程错误引入的,非确定性交错可能会导致不可预知的结果。随着指令数量的增加,可能的交错数量会大大增加,这种现象称为组合爆炸。即使是最小的线程也有许多可能的交错。现实世界的并发程序具有天文数字的合法交错,所以测试每一个交织是不可行的。同样,不可能使用同行代码审查或演练来探索每条潜在的执行路径。这是高级静态分析工具擅长的地方。

高级静态分析工具使用符号执行引擎来识别程序中的潜在问题,而无需实际运行程序。它们的工作方式与编译器非常相似,将源代码作为输入,然后对其进行解析并将其转换为中间表示 (IR)。编译器会使用 IR 来生成目标代码,而静态分析工具会保留 IR,也称为模型。检查器通过遍历或查询模型,对代码进行分析以查找常见缺陷、违反策略等,寻找指示缺陷的特定属性或模式。复杂的符号执行技术通过控制流图探索路径,控制流图是一种数据结构,表示语句在程序中执行的顺序。算法跟踪程序的抽象状态,并知道如何使用该状态来排除对不可行路径的考虑。模型的深度决定了工具的有效性。该深度基于内置了多少程序行为知识,一次可以考虑多少程序,以及它反映实际程序行为的准确程度。

许多开发人员利用流行的开源工具来查找 Java 中的错误,包括 FindBugs、PMD 和 CheckStyle。其中最广泛使用的 FindBugs 使用静态分析来识别 Java 程序中数百种不同类型的潜在错误。FindBugs 对 Java 字节码(Java 虚拟机执行的指令形式)进行操作。PMD 和 CheckStyle 检查源代码是否符合编码标准并检测不良做法。

这些工具中的每一个都有其优势。一般来说,静态分析工具的一个重要优势是它们可以在开发早期使用,甚至在测试开始之前就可以发现错误。可用于 Java 的大多数静态分析工具都是通用的,可以捕获一系列表面问题。

与这些开源工具相比,有一些商业产品专门用于非常精确地识别 Java、C 或 C++ 中的并发问题。这些工具包含非常深的模型,使他们能够发现其他工具经常遗漏的并发问题。这些高级静态分析工具中的一些最有效的工具是基于对软件并发行为的前沿学术研究。它们通过整个程序过程间分析提供 C 和 C++ 源代码的高级静态分析,通常可以处理多达 1000 万行代码的程序。除了查找竞争条件和死锁之外,Java 的一种商业工具还可以识别由于错误使用 java.util.concurrent 提供的并发集合库而导致的不可预测的结果。在协调对共享的非并发集合的访问时,它会检测到错误的错误处理或不正确的同步。此外,它还可以帮助诊断由错误的 API 使用、冗余同步和不必要地使用共享可变状态引起的性能瓶颈。

由于许多项目将包括 Java 和 C 或 C++,因此团队会发现在集成开发环境 (IDE) 中使用工具更容易、更高效。有一些工具套件可用于嵌入式和托管平台。商业版本为程序分析、程序检查、程序理解和架构可视化提供自动化工作流程和强大工具。使用带有目标高级静态分析工具的 IDE 使开发人员能够发现现有并发代码的基本设计意图,并识别新代码何时偏离该设计。它在首次引入新的并发缺陷时提供预警,并使用尖端技术帮助开发人员识别和理解它们。

有效的多核系统设计

为多核平台开发嵌入式应用程序需要一种新方法。需要先进的编程技术来利用并行处理内核。跨并行处理器的程序线程交错创建了天文数字的潜在执行路径。这使得不可能测试或审查每一个可能的场景。静态分析提供了唯一可行的方法来探索高度并发系统中软件错误的所有可能代码路径。当与其他代码质量实践(例如代码审查和集成测试)结合使用时,高级静态分析工具可以显着降低由于未发现的并发错误而导致的现场故障风险。

审核编辑:郭婷

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

    关注

    68

    文章

    19091

    浏览量

    228776
  • JAVA
    +关注

    关注

    19

    文章

    2952

    浏览量

    104472
  • C++
    C++
    +关注

    关注

    21

    文章

    2097

    浏览量

    73452
收藏 人收藏

    评论

    相关推荐

    pcb板设计的常见错误

    印刷电路板(PCB)是电子设备不可或缺的组成部分,它负责连接电子元件并传输电信号。一个优秀的PCB设计对于确保电路的性能、可靠性和成本效益至关重要。然而,在PCB设计过程,工程师可能会犯一些常见
    的头像 发表于 11-04 13:58 83次阅读

    socket编程错误处理技巧

    Socket编程是网络编程的基础,它允许程序之间通过TCP/IP协议进行通信。然而,网络通信是不稳定的,可能会遇到各种问题,如网络延迟、连接中断、数据丢失等。 错误处理的重要性 提高程序的健壮性
    的头像 发表于 11-01 17:47 746次阅读

    SRAM错误检测

    电子发烧友网站提供《SRAM错误检测.pdf》资料免费下载
    发表于 09-20 11:15 0次下载
    SRAM<b class='flag-5'>中</b>的<b class='flag-5'>错误</b>检测

    多核CPU的优势是什么

    多核CPU(Central Processing Unit,中央处理器)作为现代计算机技术的重要里程碑,其优势在于显著提升了计算性能、多任务处理能力、系统稳定性以及能效比等多个方面。以下将详细阐述多核CPU的几大优势,并结合相关
    的头像 发表于 08-22 14:30 1743次阅读

    并发物联网云平台是什么

    并发物联网云平台是一种能够处理大量设备同时连接并进行数据交换的云计算平台。这种平台通常被设计用来应对来自数以万计甚至数十亿计的物联网设备的并发请求,保证系统的稳定性和响应速度。 首先,从技术层面
    的头像 发表于 08-13 13:50 198次阅读

    并发系统的艺术:如何在流量洪峰中游刃有余

    前言 我们常说的三高,高并发、高可用、高性能,这些技术是构建现代互联网应用程序所必需的。对于京东618备战来说,所有的系统服务,无疑都是围绕着三高来展开的。而对于京东庞大的客户群体,高并发
    的头像 发表于 08-05 13:43 210次阅读
    高<b class='flag-5'>并发</b><b class='flag-5'>系统</b>的艺术:如何在流量洪峰中游刃有余

    闭包在错误处理的应用模式探索

    通过在函数和方法返回错误对象作为它们的唯一或最后一个返回值——如果返回 nil,则没有错误发生——并且主调(calling)函数总是应该检查收到的错误
    的头像 发表于 03-15 09:57 383次阅读

    应用程序的服务器错误怎么解决?

    在使用应用程序时,可能会遇到服务器错误的问题。这种错误通常会导致应用程序无法正常运行 ,给用户带来不便。下面将介绍应用程序的服务器错误及其解决方法,帮助您快速解决这一问题。
    的头像 发表于 03-12 15:13 5469次阅读

    AURIX系列MCU多核系统和时钟有关系吗?

    AURIX系列MCU多核系统和时钟有关系吗?2.如何系统的理解GTM的时钟结构(以前用的ST的片子,发现英飞凌MCU的时钟树和ST的很不一样,有些时钟实现的功能和原理是一样的)?3.编写应用程序是不是不能脱离底层比较好?
    发表于 02-05 06:10

    盘点PCB设计的常见错误

    搞技术,难免存在错误,只有经历过错误,才能更快地成长。PCB设计也一样,今天就来盘点一下PCB设计中最常见的错误
    的头像 发表于 01-12 09:53 1282次阅读
    盘点PCB设计<b class='flag-5'>中</b>的常见<b class='flag-5'>错误</b>

    探讨多线程编程的volatile关键字应用

    有时候,我们可能需要在指针类型之间进行转换,而编译器会认为这是不安全的操作,从而导致编译错误。使用volatile关键字可以告知编译器,这个类型转换是有意义的,不应该引发错误
    发表于 12-27 13:53 397次阅读

    脚本错误scripterror怎么解决

    分析和排查。以下是一些常见的解决脚本错误的方法: 检查语法错误: 仔细检查脚本的代码,看是否有拼写错误、缺少分号、括号不匹配等语法错误
    的头像 发表于 11-26 14:46 7568次阅读

    服务器并发的概念

    自己调整系统的相关参数 并发的概念是什么?什么是并发? 对于服务器并发的概念,下面几点是错误的定义 ①服务器处理客户端请求的数量:没有时间、
    的头像 发表于 11-10 10:05 4855次阅读
    服务器<b class='flag-5'>并发</b>的概念

    操作系统上并行和并发的区别

    两人并列同时进入,但是在办公室外的路人甲(用户)看来,同学A和同学B同时都在办公室内,这是并发。 其实这个例子不合理,因为真正的并行是多核CPU下的概念,但上面这个简单的例子非常有助于理解。 如果举例要精确一点,那么大概是这样的:进办公室
    的头像 发表于 11-09 14:42 1863次阅读
    操作<b class='flag-5'>系统</b>上并行和<b class='flag-5'>并发</b>的区别

    如何在PCB设计克服放大器的噪声干扰?

    如何在PCB设计克服放大器的噪声干扰? 在PCB设计,放大器的噪声干扰是一个常见的问题。噪声干扰会对系统的性能产生负面影响,降低信号质量和可靠性。为了
    的头像 发表于 11-09 10:08 642次阅读