一种弱内存序架构下的代码检查方法及相应设备技术

技术编号:35253119 阅读:19 留言:0更新日期:2022-10-19 10:08
本申请公开了一种弱内存序架构下的代码检查方法,包括:获取第一源代码和测试代码,第一源代码中包含阻塞标记,第一源代码对应多个线程,多个线程具有至少一块共享内存;根据测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流,多条执行流中包含阻塞标记的目标执行流中存在忙等循环;若调用多线程执行目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环。本申请提供的方案,因为可以通过阻塞标记来检查目标执行流,所以,可以在有限的时间内完成对第一源代码的正确性检查。间内完成对第一源代码的正确性检查。间内完成对第一源代码的正确性检查。

【技术实现步骤摘要】
一种弱内存序架构下的代码检查方法及相应设备


[0001]本申请涉及计算机
,具体涉及一种弱内存序架构下的代码检查方法及相应设备。

技术介绍

[0002]处理器在调用线程操作内存时,若是在强内存序架构(如:x86架构)下,实际执行的代码顺序与代码编写顺序一致,不会出现对内存的访问顺序进行重排的情况。而在弱内存序架构(如:高级精简指令集(advanced RISC machine,ARM)、基于精简指令集的第五代指令架构(reduced instruction set computing five,RISC

V)、无流水线互锁的微处理器架构(Microprocessor without Interlocked Pipeline Stages,MIPS)、基于精简指令集架构的指令集体系构架(performance optimization with enhanced RISC,POWER))下,处理器通常会根据执行的情况对内存的访问顺序进行重排,重排可能会导致处理器实际执行的代码顺序与代码的编写顺序不一致。
[0003]由于弱内存序架构下,处理器对内存实际执行的代码顺序与代码的编写顺序可能存在不一致,将强内存序架构下执行无误的代码移植到弱内存序架构后会大概率出现问题,产生非预期行为。
[0004]目前会通过模型检查技术来检查弱内存序架构下的访问内存的重排执行流,从而找出同样的代码在弱内存序架构和强内存序架构下是否存在行为差异。但由于目前的模型检查技术无法预知重排代码中忙等循环的执行次数,在碰到有忙等循环的代码时,就会生成无穷多的执行流,而在无穷多的执行流中找出重排代码是否存在问题,显然是无法完成的任务。

技术实现思路

[0005]本申请实施例提供一种弱内存序架构下的代码检查方法,用于解决在弱内存序架构下实现忙等循环代码的正确性检查。本申请实施例还提供了相应设备、计算机可读存储介质及计算机程序产品等。
[0006]本申请第一方面提供一种弱内存序架构下的代码检查方法,包括:获取第一源代码和测试代码,第一源代码中包含阻塞标记,测试代码用于指示第一源代码能正确运行需符合的条件,第一源代码对应多个线程,多个线程具有至少一块共享内存,阻塞标记用于指示第一源代码中忙等循环的位置;根据测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流,其中,每条执行流为处理器运行多线程对同一块共享内存进行读操作和/或写操作的代码执行流程,多条执行流中包含阻塞标记的目标执行流中存在忙等循环;若调用多线程执行目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环,死循环指示第一源代码存在错误,目标线程为多线程中的任意一个。
[0007]本申请中,该代码检查方法应用于计算机设备,该计算机设备可以是服务器、终端设备或虚拟机(virtual machine,VM)。弱内存序架构是相对于强内存序架构来说的,弱内存序架构和强内存序架构都是指令集架构,强内存序架构可以包括x86架构,弱内存序架构可以包括高级精简指令集(advanced RISC machine,ARM)架构。在强内存序架构下,处理器在调用线程操作内存时实际所执行的代码顺序会与代码的编写顺序保持一致。而在弱内存序架构下,处理器在调用线程操作内存时实际所执行的代码顺序可能会与代码的编写顺序保持不一致。
[0008]本申请中,第一源代码通常是带有忙等语义的多线程同步算法,如:自旋锁、无锁列表等。该第一源代码中的阻塞标记可以是人工添加的,也可以是计算机设备通过对最初获取的无阻塞标记的源代码进行预处理时添加的。测试代码用于定义第一源代码的正确性,该测试代码中可以给出第一源代码需要满足什么样的条件才是正确的。如:测试代码中可以给出循环退出需满足的条件。
[0009]本申请中,第一源代码对应多个线程指的是第一源代码可以被多个线程调用来执行对内存的操作。共享内存可以有多块,每块共享内存都有一个内存地址,不同共享内存的内存地址不同,多线程操作同一块共享内存时就会存在忙等循环的情况。忙等循环指的是一个线程操作共享内存时,其他线程占用处理器处于等待状态,直到忙等循环中的循环条件达到相应值时才会退出该忙等循环。在本申请中,忙等循环是一个代码块,该代码块中的代码表示了忙等循环的过程。
[0010]本申请中,线程操作共享内存可以包括线程对共享内存执行读操作和/或写操作,“读操作和/或写操作”表示可以只执行读操作,只执行写操作,或者既执行读操作又执行写操作。通常在多线程操作共享内存时,既要执行读操作也要执行写操作,如:线程1执行读操作,线程2执行写操作。
[0011]本申请中,执行流是多线程对同一块共享内存执行读操作和/或写操作的代码的实际执行流程,可以根据多线程对同一块内存的操作顺序来确定不同的执行流,如:有三个线程操作同一块共享内存,按照三个线程的执行顺序,可以有6个执行流。目标执行流中存在忙等循环,该忙等循环中包含阻塞标记,目标执行流不限于一条,多条执行流中的都每条执行流都可以是目标执行流,只要包含阻塞标记的执行流都可以理解为是目标执行流。
[0012]本申请中,会针对包含阻塞标记的目标执行流进行检查,因为目标执行流中存在忙等循环,所以,执行目标执行流的过程可能会执行多次忙等循环的代码,在每次忙等循环的过程都会涉及到读操作,通常一个新产生的读操作会对应一个新的写操作,因为一个新产生的读操作对应一个已经被别的读操作引用过的写操作只是一次无意义的循环,所以,当一个新产生的读操作引用不到一个新的写操作,也就是一个未被引用过的写操作时,就表示该目标执行流的忙等循环无法退出,是个死循环,那么则表示该第一源代码存在错误,不能正常执行。由以上内容可知,该第一方面中,因为可以通过阻塞标记来检查目标执行流,即使该第一源代码会产生无穷多个执行流,也无需全部都做检查,所以,该第一方面提供的方案可以在有限的时间内完成对第一源代码的正确性检查。
[0013]在第一方面的一种可能的实现方式中,上述步骤:获取第一源代码,包括:获取第二源代码;从第二源代码中识别出表示忙等循环的代码块,并在表示忙等循环的代码块中添加阻塞标记,以得到第一源代码。
[0014]该种可能的实现方式中,可以对不包含阻塞标记的第二源代码进行识别,并且添加阻塞标记,从而便于后续的代码检查过程可以实现对源代码的正确性检查。
[0015]在第一方面的一种可能的实现方式中,该方法还包括:将表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;上述步骤:在表示忙等循环的代码块中添加阻塞标记,包括:将阻塞标记添加在与第二形式的循环条件的符号关联的位置。
[0016]该种可能的实现方式中,循环条件(loop

condition)表示循环结束的条件,如:while(lock)表示一个循环条件,其中,while表示循环条件的符号,将循环条本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种弱内存序架构下的代码检查方法,其特征在于,包括:获取第一源代码和测试代码,所述第一源代码中包含阻塞标记,所述测试代码用于指示所述第一源代码能正确运行需符合的条件,所述第一源代码对应多个线程,所述多个线程具有至少一块共享内存,所述阻塞标记用于指示所述第一源代码中忙等循环的位置;根据所述测试代码所指示的条件和所述第一源代码,为操作同一块共享内存的所述多线程生成在弱内存序架构下的多条执行流,其中,每条执行流为处理器运行所述多线程对所述同一块共享内存进行读操作和/或写操作的代码执行流程,所述多条执行流中包含阻塞标记的目标执行流中存在忙等循环;若调用所述多线程执行所述目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出所述目标执行流中的忙等循环为死循环,所述死循环指示所述第一源代码存在错误,所述目标线程为所述多线程中的任意一个。2.根据权利要求1所述的方法,其特征在于,所述获取第一源代码,包括:获取第二源代码;从所述第二源代码中识别出表示忙等循环的代码块,并在所述表示忙等循环的代码块中添加所述阻塞标记,以得到所述第一源代码。3.根据权利要求2所述的方法,其特征在于,所述方法还包括:将所述表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;所述在所述表示忙等循环的代码块中添加所述阻塞标记,包括:将所述阻塞标记添加在与所述第二形式的循环条件的符号关联的位置。4.根据权利要求2或3所述的方法,其特征在于,所述从所述第二源代码中识别出表示忙等循环的代码块,包括:从所述第二源代码中识别出循环条件,所述循环条件包括恒为真或不是恒为真;若所述循环条件不是恒为真,则根据所述循环条件所对应的值确定所述循环条件所关联的代码块为忙等循环的代码块;若所述循环条件恒为真,则根据所述循环条件所关联的循环体确定所述循环条件所关联的代码块为忙等循环的代码块。5.根据权利要求1

4任一项所述的方法,其特征在于,所述方法还包括:过滤掉所述多条执行流中的冗余执行流,所述冗余执行流的至少两次循环中的至少两个写操作对应同一个写操作。6.根据权利要求5所述的方法,其特征在于,所述过滤掉所述多条执行流中的冗余执行流,包括:检查第一执行流的本次循环中的第一读操作,所述第一执行流为所述多条执行流中的任意一条执行流,所述本次循环为所述第一执行流中正在执行的一次忙等循环;若执行所述第一读操作的当前线程正在执行所述第一执行流中的忙等循环,则检查所述第一读操作所对应的写操作;若执行所述第一读操作的所述当前线程所引用的写操作,已被所述当前线程在之前的循环中执行第二读操作时引用过,则确定出所述第一执行流为所述冗余执行流;过滤掉所述第一执行流。
7.根据权利要求1

6任一项所述的方法,其特征在于,所述若调用所述多线程执行所述目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出所述目标执行流中的忙等循环为死循环,包括:调用所述多线程执行所述目标执行流中的忙等循环时,在状态集合中为每个读操作设置一个状态标记;当所述忙等循环中产生一个写操作,则从所述状态集合中删除一个状态标记;直到所述忙等循环中不再产生写操作,若所述状态集合中还包含状态标记,则确定出所述目标执行流中的忙等循环为死循环。8.一种计算机设备,其特征在于,包括:处理器、内存和存储有计算机程序的计算机可读存储介质;所...

【专利技术属性】
技术研发人员:文羽中乔纳斯
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1