并发问题简介以及研究现状

如今,随着计算机硬件,网络技术以及多核心处理器系统的发展,并发系统已成为当前主流的软件体系,随着实际应用对并发系统软件的需求不断增加,并发程序的分析、理解、调试、测试和维护已引起人们的高度重视,并发程序在提高计算效率上发挥着越来越重要的作用。

程序的并发是指若干个可在同一时间段内执行的程序模块。并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。

并发程序的特性导致错误具有不可重现性,程序员很难根据错误报告重现错误并进行纠正,这使软件排错工作非常困难。程序的正确性仅仅依赖于程序员编写正确的,不会冲突的代码,然而编写高质量的并发程序对于程序员而言并不是一件简单的事,很难满足高可靠性软件的要求。

由于并发程序中线程调度的不确定性,并发程序开发者很难考虑到所有的输入以及线程调度组合,使得目前的并发程序中很容易出现并发错误。另一方面,并发程序带来的问题也给传统的软件调试、软件测试、程序分析等领域带来新的挑战。并发程序中使用多线程技术,会带来数据的并发访问,如果没有进行恰当的同步,可能会引起并发错误,例如数据竞争、原子性错误、数据没有初始化和死锁等,这些问题说明存在并发程序缺陷,会带来和预期不同的程序执行结果。

虽然对于并发程序的测试已经提出了很多方法,但尚未形成完备的体系,很多问题还有待解决。因此,针对并发程序进行有效的测试,重现错误,找出错误路径,是现代软件测试的一个重要研究点。

并发软件最常见的错误是非确定性,数据竞争和死锁。非确定性行为给我们在结构上测试多线程程序带来了更多的挑战。这意味着对并发程序的相同输入可能导致不同的执行序列,它发生的原因是并发程序的交错执行从而可能造成应用程序得出不正确的运行结果。并发错误的发生不仅取决于程序的输入和运行环境,它还取决于不同线程对同一内存单元的交叉访问顺序以及一些和具体时间有关的事件(如信号量)。

并发程序中的错误可能导致严重的后果,如数据竞争,死锁,活锁,饥饿,顺序违背以及原子性违背。

数据竞争是指当两个或多个线程同时访问共享数据并更改它时,会发生竞争条件;这导致对于共享数据的不可预测的输出。数据竞争出现在软件中,当应用程序依赖于进程或线程的顺序或时序才能正常运行时。与电子产品一样,存在严重的数据竞争,导致无效的执行和错误。当进程或线程依赖某些共享状态时,通常会发生严重的数据竞争。共享状态下的操作是必须相互排斥的关键部分。不遵守这个规则就会破坏共享状态的可能性。

在C11和C ++ 11标准中定义的存储器模型对于共享存储器位置的并发读取和写入引起的关键竞争条件使用术语“数据竞争”。包含数据竞赛的AC或C ++程序有未定义的行为。数据竞争问题具有难以再现和调试的声誉,因为最终结果是非确定性的,并且取决于干扰线程之间的相对时序。

因此,程序运行时发生的问题可能会在调试模式下运行时,添加额外的日志记录或连接调试器(通常称为“ Heisenbug ”)时消失。许多和软件数据竞争有关联的计算机安全隐患。数据竞争允许访问共享资源的线程或者进程利用该资源从而导致其他线程或进程发生故障。两个或多个程序可能会在尝试修改或访问文件系统时发生冲突,从而导致数据损坏或特权升级。文件系统中存在不同形式的数据竞争,其中不相关的程序可能会突然使用可用资源(如磁盘空间,内存空间或处理器周期)而相互影响。未仔细设计以预测和处理这种种族情况的软件可能变得不可预测。这样的风险可能会在似乎非常可靠的系统中长时间被忽视。

未完待续...

转载请注明出处

原创作者:抚仙湖的小王子
哈尔滨的某个地方

你可能感兴趣的:(并发问题简介以及研究现状)