CN115202662A - 一种弱内存序架构下的代码检查方法及相应设备 - Google Patents
一种弱内存序架构下的代码检查方法及相应设备 Download PDFInfo
- Publication number
- CN115202662A CN115202662A CN202110401685.0A CN202110401685A CN115202662A CN 115202662 A CN115202662 A CN 115202662A CN 202110401685 A CN202110401685 A CN 202110401685A CN 115202662 A CN115202662 A CN 115202662A
- Authority
- CN
- China
- Prior art keywords
- busy
- code
- execution
- source code
- loop
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 230000015654 memory Effects 0.000 title claims abstract description 128
- 238000000034 method Methods 0.000 title claims abstract description 70
- 230000000903 blocking effect Effects 0.000 claims abstract description 58
- 238000012360 testing method Methods 0.000 claims abstract description 33
- 238000001914 filtration Methods 0.000 claims description 24
- 238000004590 computer program Methods 0.000 claims description 9
- 230000008569 process Effects 0.000 description 24
- 238000012545 processing Methods 0.000 description 23
- 238000010586 diagram Methods 0.000 description 22
- 238000007781 pre-processing Methods 0.000 description 9
- 238000004891 communication Methods 0.000 description 8
- 230000006870 function Effects 0.000 description 6
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000013461 design Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 125000004122 cyclic group Chemical group 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000007689 inspection Methods 0.000 description 2
- 230000009467 reduction Effects 0.000 description 2
- 238000004904 shortening Methods 0.000 description 2
- 230000003190 augmentative effect Effects 0.000 description 1
- 230000001351 cycling effect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000008707 rearrangement Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000000758 substrate Substances 0.000 description 1
- XLYOFNOQVPJJNP-UHFFFAOYSA-N water Substances O XLYOFNOQVPJJNP-UHFFFAOYSA-N 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3612—Software analysis for verifying properties of programs by runtime analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3628—Software debugging of optimised code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/458—Synchronisation, e.g. post-wait, barriers, locks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
- Debugging And Monitoring (AREA)
- Hardware Redundancy (AREA)
Abstract
本申请公开了一种弱内存序架构下的代码检查方法,包括:获取第一源代码和测试代码,第一源代码中包含阻塞标记,第一源代码对应多个线程,多个线程具有至少一块共享内存;根据测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流,多条执行流中包含阻塞标记的目标执行流中存在忙等循环;若调用多线程执行目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环。本申请提供的方案,因为可以通过阻塞标记来检查目标执行流,所以,可以在有限的时间内完成对第一源代码的正确性检查。
Description
技术领域
本申请涉及计算机技术领域,具体涉及一种弱内存序架构下的代码检查方法及相应设备。
背景技术
处理器在调用线程操作内存时,若是在强内存序架构(如:x86架构)下,实际执行的代码顺序与代码编写顺序一致,不会出现对内存的访问顺序进行重排的情况。而在弱内存序架构(如:高级精简指令集(advanced RISC machine,ARM)、基于精简指令集的第五代指令架构(reduced instruction set computing five,RISC-V)、无流水线互锁的微处理器架构(Microprocessor without Interlocked Pipeline Stages,MIPS)、基于精简指令集架构的指令集体系构架(performance optimization with enhanced RISC,POWER))下,处理器通常会根据执行的情况对内存的访问顺序进行重排,重排可能会导致处理器实际执行的代码顺序与代码的编写顺序不一致。
由于弱内存序架构下,处理器对内存实际执行的代码顺序与代码的编写顺序可能存在不一致,将强内存序架构下执行无误的代码移植到弱内存序架构后会大概率出现问题,产生非预期行为。
目前会通过模型检查技术来检查弱内存序架构下的访问内存的重排执行流,从而找出同样的代码在弱内存序架构和强内存序架构下是否存在行为差异。但由于目前的模型检查技术无法预知重排代码中忙等循环的执行次数,在碰到有忙等循环的代码时,就会生成无穷多的执行流,而在无穷多的执行流中找出重排代码是否存在问题,显然是无法完成的任务。
发明内容
本申请实施例提供一种弱内存序架构下的代码检查方法,用于解决在弱内存序架构下实现忙等循环代码的正确性检查。本申请实施例还提供了相应设备、计算机可读存储介质及计算机程序产品等。
本申请第一方面提供一种弱内存序架构下的代码检查方法,包括:获取第一源代码和测试代码,第一源代码中包含阻塞标记,测试代码用于指示第一源代码能正确运行需符合的条件,第一源代码对应多个线程,多个线程具有至少一块共享内存,阻塞标记用于指示第一源代码中忙等循环的位置;根据测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流,其中,每条执行流为处理器运行多线程对同一块共享内存进行读操作和/或写操作的代码执行流程,多条执行流中包含阻塞标记的目标执行流中存在忙等循环;若调用多线程执行目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环,死循环指示第一源代码存在错误,目标线程为多线程中的任意一个。
本申请中,该代码检查方法应用于计算机设备,该计算机设备可以是服务器、终端设备或虚拟机(virtual machine,VM)。弱内存序架构是相对于强内存序架构来说的,弱内存序架构和强内存序架构都是指令集架构,强内存序架构可以包括x86架构,弱内存序架构可以包括高级精简指令集(advanced RISC machine,ARM)架构。在强内存序架构下,处理器在调用线程操作内存时实际所执行的代码顺序会与代码的编写顺序保持一致。而在弱内存序架构下,处理器在调用线程操作内存时实际所执行的代码顺序可能会与代码的编写顺序保持不一致。
本申请中,第一源代码通常是带有忙等语义的多线程同步算法,如:自旋锁、无锁列表等。该第一源代码中的阻塞标记可以是人工添加的,也可以是计算机设备通过对最初获取的无阻塞标记的源代码进行预处理时添加的。测试代码用于定义第一源代码的正确性,该测试代码中可以给出第一源代码需要满足什么样的条件才是正确的。如:测试代码中可以给出循环退出需满足的条件。
本申请中,第一源代码对应多个线程指的是第一源代码可以被多个线程调用来执行对内存的操作。共享内存可以有多块,每块共享内存都有一个内存地址,不同共享内存的内存地址不同,多线程操作同一块共享内存时就会存在忙等循环的情况。忙等循环指的是一个线程操作共享内存时,其他线程占用处理器处于等待状态,直到忙等循环中的循环条件达到相应值时才会退出该忙等循环。在本申请中,忙等循环是一个代码块,该代码块中的代码表示了忙等循环的过程。
本申请中,线程操作共享内存可以包括线程对共享内存执行读操作和/或写操作,“读操作和/或写操作”表示可以只执行读操作,只执行写操作,或者既执行读操作又执行写操作。通常在多线程操作共享内存时,既要执行读操作也要执行写操作,如:线程1执行读操作,线程2执行写操作。
本申请中,执行流是多线程对同一块共享内存执行读操作和/或写操作的代码的实际执行流程,可以根据多线程对同一块内存的操作顺序来确定不同的执行流,如:有三个线程操作同一块共享内存,按照三个线程的执行顺序,可以有6个执行流。目标执行流中存在忙等循环,该忙等循环中包含阻塞标记,目标执行流不限于一条,多条执行流中的都每条执行流都可以是目标执行流,只要包含阻塞标记的执行流都可以理解为是目标执行流。
本申请中,会针对包含阻塞标记的目标执行流进行检查,因为目标执行流中存在忙等循环,所以,执行目标执行流的过程可能会执行多次忙等循环的代码,在每次忙等循环的过程都会涉及到读操作,通常一个新产生的读操作会对应一个新的写操作,因为一个新产生的读操作对应一个已经被别的读操作引用过的写操作只是一次无意义的循环,所以,当一个新产生的读操作引用不到一个新的写操作,也就是一个未被引用过的写操作时,就表示该目标执行流的忙等循环无法退出,是个死循环,那么则表示该第一源代码存在错误,不能正常执行。由以上内容可知,该第一方面中,因为可以通过阻塞标记来检查目标执行流,即使该第一源代码会产生无穷多个执行流,也无需全部都做检查,所以,该第一方面提供的方案可以在有限的时间内完成对第一源代码的正确性检查。
在第一方面的一种可能的实现方式中,上述步骤:获取第一源代码,包括:获取第二源代码;从第二源代码中识别出表示忙等循环的代码块,并在表示忙等循环的代码块中添加阻塞标记,以得到第一源代码。
该种可能的实现方式中,可以对不包含阻塞标记的第二源代码进行识别,并且添加阻塞标记,从而便于后续的代码检查过程可以实现对源代码的正确性检查。
在第一方面的一种可能的实现方式中,该方法还包括:将表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;上述步骤:在表示忙等循环的代码块中添加阻塞标记,包括:将阻塞标记添加在与第二形式的循环条件的符号关联的位置。
该种可能的实现方式中,循环条件(loop-condition)表示循环结束的条件,如:while(lock)表示一个循环条件,其中,while表示循环条件的符号,将循环条件的符号由第一形式转换为第二形式可以是将第一形式的while转换为第二形式的if,当然,本申请不限于第一形式和第二形式的内容,只要第一形式的符号能表示循环条件,第二形式的符号能被检查出表示循环即可。阻塞标记可以是阻塞原语,如:modelchecker_block。本申请中,可以将阻塞标记会添加到循环条件之后,当然,本申请不限定阻塞标记所添加的具体位置,只要与第二形式的循环条件的符号相关联的位置即可。该种可能的实现方式便于快速检查出忙等循环,从而提高代码正确性检查的速度。
在第一方面的一种可能的实现方式中,上述步骤:从第二源代码中识别出表示忙等循环的代码块,包括:从第二源代码中识别出循环条件,循环条件包括恒为真或不是恒为真;若循环条件不是恒为真,则根据循环条件所对应的值确定循环条件所关联的代码块为忙等循环的代码块;若循环条件恒为真,则根据循环条件所关联的循环体确定循环条件所关联的代码块为忙等循环的代码块。
该种可能的实现方式中,循环条件通常包括恒为真或不是恒为真。若不是恒为真,则循环条件通常为对某个原子变量的读操作或者原子读-交换(compare and swap)操作,通过该原子量变量的读操作读到的值是否满足退出循环来确定循环条件。若是恒为真,则需要通过循环体(loop–body)来定义退出的条件,从而确定代码中的循环条件。该种可能的实现方式,有利于快速确定循环条件,从而快速识别出源代码中的忙等循环的代码块。
在第一方面的一种可能的实现方式中,该方法还包括:过滤掉多条执行流中的冗余执行流,冗余执行流的至少两次循环中的至少两个写操作对应同一个写操作。
该种可能的实现方式中,在确定出多条执行流后,可以过滤掉其中的冗余执行流,这样可以缩小对执行流检查的范围,从而缩短检查源代码的时间。
在第一方面的一种可能的实现方式中,上述步骤:过滤掉多条执行流中的冗余执行流,包括:检查第一执行流的本次循环中的第一读操作,第一执行流为多条执行流中的任意一条执行流,本次循环为第一执行流中正在执行的一次忙等循环;若执行第一读操作的当前线程正在执行第一执行流中的忙等循环,则检查第一读操作所对应的写操作;若执行第一读操作的当前线程所引用的写操作,已被当前线程在之前的循环中执行第二读操作时引用过,则确定出第一执行流为冗余执行流;过滤掉第一执行流。
该种可能的实现方式中,确定冗余执行流的过程可以是通过检查读操作是否有对应的未被引用的写操作的方式来进行的,若一个写操作两次被不属于同一次忙等循环中的线程所执行的两个写操作所引用到,则表示所执行的第一执行流是冗余执行流,则需要过滤掉该第一执行流。该种过滤冗余执行流的方案,可以加速缩小对执行流检查的范围。
在第一方面的一种可能的实现方式中,上述步骤:若调用多线程执行目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环,包括:调用多线程执行目标执行流中的忙等循环时,在状态集合中为每个读操作设置一个状态标记;当忙等循环中产生一个写操作,则从状态集合中删除一个状态标记;直到忙等循环中不再产生写操作,若状态集合中还包含状态标记,则确定出目标执行流中的忙等循环为死循环。
该种可能的实现方式中,可以通过状态标记的方式来确定是否每个新产生的读操作都会有一个新产生的写操作,若状态集合中的状态标记有剩余,则表示新产生的读操作没有对应的新产生的写操作了,则表示该忙等循环无法退出,该忙等循环为死循环。该种实现方式有利于快速确定出忙等循环是否可终止,若不可终止,则表示该第一源代码存在错误。
本申请第二方面提供一种弱内存序架构下的代码检查装置,包括:
获取单元,用于获取第一源代码和测试代码,第一源代码中包含阻塞标记,测试代码用于指示第一源代码能正确运行需符合的条件,第一源代码对应多个线程,多个线程具有至少一块共享内存,阻塞标记用于指示第一源代码中忙等循环的位置。
第一处理单元,用于根据获取单元获取的测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流,其中,每条执行流为处理器运行多线程对同一块共享内存进行读操作和/或写操作的代码执行流程,多条执行流中包含阻塞标记的目标执行流中存在忙等循环。
第二处理单元,用于若调用多线程执行第一处理单元生成的目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环,死循环指示第一源代码存在错误,目标线程为多线程中的任意一个。
在第二方面的一种可能的实现方式中,获取单元,用于获取第二源代码;从第二源代码中识别出表示忙等循环的代码块,并在表示忙等循环的代码块中添加阻塞标记,以得到第一源代码。
在第二方面的一种可能的实现方式中,第一处理单元,还用于将表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;将阻塞标记添加在与第二形式的循环条件的符号关联的位置。
在第二方面的一种可能的实现方式中,第一处理单元,用于从第二源代码中识别出循环条件,循环条件包括恒为真或不是恒为真;若循环条件不是恒为真,则根据循环条件所对应的值确定循环条件所关联的代码块为忙等循环的代码块;若循环条件恒为真,则根据循环条件所关联的循环体确定循环条件所关联的代码块为忙等循环的代码块。
在第二方面的一种可能的实现方式中,第一处理单元,还用于过滤掉多条执行流中的冗余执行流,冗余执行流的至少两次循环中的至少两个写操作对应同一个写操作。
在第二方面的一种可能的实现方式中,第一处理单元,用于检查第一执行流的本次循环中的第一读操作,第一执行流为多条执行流中的任意一条执行流,本次循环为第一执行流中正在执行的一次忙等循环;若执行第一读操作的当前线程正在执行第一执行流中的忙等循环,则检查第一读操作所对应的写操作;若执行第一读操作的当前线程所引用的写操作,已被当前线程在之前的循环中执行第二读操作时引用过,则确定出第一执行流为冗余执行流;过滤掉第一执行流。
在第二方面的一种可能的实现方式中,第二处理单元,用于调用多线程执行目标执行流中的忙等循环时,在状态集合中为每个读操作设置一个状态标记;当忙等循环中产生一个写操作,则从状态集合中删除一个状态标记;直到忙等循环中不再产生写操作,若状态集合中还包含状态标记,则确定出目标执行流中的忙等循环为死循环。
本申请第三方面提供一种计算机设备,该计算机设备包括处理器、内存和存储有计算机程序的计算机可读存储介质;处理器与计算机可读存储介质耦合,处理器上运行的计算机执行指令,当计算机执行指令被处理器执行时,处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。可选地,该计算机设备还可以包括输入/输出(input/output,I/O)接口,该存储有计算机程序的计算机可读存储介质可以是存储器。
本申请第四方面提供一种存储一个或多个计算机执行指令的计算机可读存储介质,当计算机执行指令被处理器执行时,处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第五方面提供一种存储一个或多个计算机执行指令的计算机程序产品,当计算机执行指令被处理器执行时,处理器执行如上述第一方面或第一方面任意一种可能的实现方式的方法。
本申请第六方面提供了一种芯片系统,该芯片系统包括至少一个处理器,至少一个处理器用于支持内存管理的装置实现上述第一方面或第一方面任意一种可能的实现方式中所涉及的功能。在一种可能的设计中,芯片系统还可以包括存储器,存储器,用于保存内存管理的装置必要的程序指令和数据。该芯片系统,可以由芯片构成,也可以包含芯片和其他分立器件。
其中,第二方面至第六方面或者其中任一种可能实现方式所带来的技术效果可参见第一方面或第一方面不同可能实现方式所带来的技术效果,此处不再赘述。
本申请实施例提供的方案,因为可以通过阻塞标记来检查目标执行流,即使该第一源代码会产生无穷多个执行流,也无需全部都做检查,所以,可以在有限的时间内完成对第一源代码的正确性检查。
附图说明
图1A是一代码块示例图;
图1B为另一代码块示例图;
图2是本申请实施例提供的计算机系统的一架构示意图;
图3是本申请实施例提供的一种弱内存序架构下的代码检查方法的一实施例示意图;
图4是本申请实施例提供的一种弱内存序架构下的代码检查方法的另一实施例示意图;
图5A是本申请实施例提供的一自旋锁代码的一示例示意图;
图5B是本申请实施例提供的一自旋锁变体代码的一示例示意图;
图6是本申请实施例提供的执行流过滤的一示意图;
图7是本申请实施例提供的执行流过滤的另一实施例示意图;
图8A是本申请实施例提供的一示例示意图;
图8B是本申请实施例提供的一示例示意图;
图9是本申请实施例提供的执行流检查一实施例;
图10是本申请实施例提供的一种弱内存序架构下的代码检查装置的一实施例示意图;
图11是本申请实施例提供的计算机设备的一结构示意图。
具体实施方式
下面结合附图,对本申请的实施例进行描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。本领域普通技术人员可知,随着技术发展和新场景的出现,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本申请实施例提供一种弱内存序架构下的代码检查方法,用于解决在弱内存序架构下实现忙等循环代码的正确性检查。本申请实施例还提供了相应设备、计算机可读存储介质及计算机程序产品等。以下分别进行详细说明。
本申请实施例中,弱内存序架构是相对于强内存序架构来说的,弱内存序架构和强内存序架构都是指令集架构,强内存序架构可以包括x86架构,弱内存序架构可以包括高级精简指令集(advanced RISC machine,ARM)架构、基于精简指令集的第五代指令架构(reduced instruction set computing five,RISC-V)、无流水线互锁的微处理器架构(Microprocessor without Interlocked Pipeline Stages,MIPS)或基于精简指令集架构的指令集体系构架(performance optimization with enhanced RISC,POWER)。在强内存序架构下,处理器在调用线程操作内存时实际所执行的代码顺序会与代码的编写顺序保持一致。而在弱内存序架构下,处理器在调用线程操作内存时实际所执行的代码顺序可能会与代码的编写顺序不一致。
在实际应用中,通常会有将强内存序架构下的代码迁移到弱内存序架构下运行的情况,如:将业务从x86架构迁移到ARM架构时,在x86的强内存序架构下运行没有问题的代码,在ARM的弱内存序架构下可能会存在挂死或死锁的问题。
如图1A所示的代码块为代码编写顺序,如图1B所示的代码块为代码的实际执行顺序。在强内存序架构下,则会执行图1A所示的顺序,竖线100两侧的代码分别代表两个不同线程中的代码。在实际编写顺序上,竖线100左侧的代码中,由于x在l之后被赋值为1,因此竖线100右侧的线程在await_while循环退出后,l一定会被赋值为0,l不等于1,所以,竖线100左侧的线程的await_while一定可以顺利退出。该图1A所示的代码迁移到弱内存序架构后,代码会产生重排,会执行图1B所示的流程,x是可能比l先赋值。那么竖线100右侧的线程执行完l=0后,有可能轮到竖线100左侧的线程执行l=1,因为l=1,会导致await_while循环继续执行下去,最终导致竖线100左侧的await_while无法退出,程序挂死。
因此,为了避免代码运行中出现程序挂死或死锁的问题,在源代码要在弱内存序架构下实际运行前,需要在弱内存序架构下进行检查,若检查到问题,则说明这个源代码存在问题,需要修改。本申请所提供的方案即是对要在弱内存序架构下运行的源代码的检查方案。
本申请实施例提供的弱内存序架构下的代码检查方法应用于计算机系统,该计算系统可以为服务器、终端设备、虚拟机(virtual machine,VM)或容器(container)。
服务器可以是任意形态的物理机。
终端设备(也可以称为用户设备(user equipment,UE))是一种具有无线收发功能的设备,可以部署在陆地上,包括室内或室外、手持或车载;也可以部署在水面上(如轮船等);还可以部署在空中(例如飞机、气球和卫星上等)。终端设备可以个人电脑(personalcomputer,PC)、手机(mobile phone)、平板电脑(pad)、带无线收发功能的电脑、虚拟现实(virtual reality,VR)终端、增强现实(augmented reality,AR)终端、工业控制(industrial control)中的无线终端、无人驾驶(self driving)中的无线终端、远程医疗(remote medical)中的无线终端、智能电网(smart grid)中的无线终端、运输安全(transportation safety)中的无线终端、智慧城市(smart city)中的无线终端、智慧家庭(smart home)中的无线终端、以物联网(internet of things,IoT)中的无线终端等。
虚拟机可以位于云端也可以位于本地。
本申请实施例提供的计算机系统的架构可以参阅图2进行理解。
图2是本申请实施例提供的计算机系统的一架构示意图。
如图2所示,该计算机系统10的架构可以包括应用层101、内核层102和硬件层103。
应用层101包括操作界面,程序检测的工作人员可以通过该操作界面启动源代码的检查过程。
内核层102包括获取模块,该获取模块用于获取源代码和测试代码,该内核层102还包括模型检查模块,还可以包括预处理模块。
该预处理模块用于对未添加阻塞标记的源代码添加阻塞标记。
该模型检查模块用于检查多线程执行包含阻塞标记的源代码访问同一共享内存时,该源代码的正确性。
设备层103包括通信接口1031、处理器1032、内存1033和总线1034等。通信接口1031、处理器1032和内存1033通过总线1034连接。其中,处理器1032可以包括任何类型的通用计算电路或专用逻辑电路,例如:现场可编程门阵列(field-programmable gate array,FPGA)或专用集成电路(application specific integrated circuit,ASIC)。也可以是耦合到一个或多个半导体基板的一个或多个处理器,例如中央处理器(central processingunit,CPU)。内存可以包括多个共享内存,如图2中示意出的共享内存1至共享内存n,每个共享内存是内存中的一块存储区域。每个共享内存具有一个内存地址,不同的共享内存的内存地址不同。
本申请实施例中,处理器可以运行多个线程执行根据源代码和测试代码产生的执行流,操作同一块共享内存,并检查包含阻塞标记的执行流中的忙等循环是否是死循环,从而确定该源代码中是否存在错误。因为可以通过阻塞标记来检查目标执行流,即使该源代码会产生无穷多个执行流,也无需全部都做检查,所以,可以在有限的时间内完成对源代码的正确性检查。
由上述图2部分的内容可知,本申请所提供的方案包括:一、源代码不经过预处理模块直接由模型检查模块执行代码检查的方案;二、源代码经过预处理模块进行预处理后再由模型检查模块执行代码检查的方案。下面以计算机设备作为执行主体分别进行介绍。
一、源代码不经过预处理模块直接由模型检查模块执行代码检查的方案。
如图3所示,本申请实施例提供的一种弱内存序架构下的代码检查方法的一实施例包括:
201.获取第一源代码和测试代码。
第一源代码中包含阻塞标记,测试代码用于指示第一源代码能正确运行需符合的条件,第一源代码对应多个线程,多个线程具有至少一块共享内存,阻塞标记用于指示第一源代码中忙等循环的位置。
本申请实施例中,第一源代码通常是带有忙等语义的多线程同步算法,如:自旋锁的代码、无锁列表的代码等。该第一源代码中的阻塞标记可以是人工添加。测试代码用于定义第一源代码的正确性,该测试代码中可以给出第一源代码需要满足什么样的条件才是正确的。如:测试代码中可以给出循环退出需满足的条件。
本申请实施例中,第一源代码对应多个线程指的是第一源代码可以被多个线程调用来执行对共享内存的操作。内存中的共享内存可以有多块,每块共享内存都有一个内存地址,不同共享内存的内存地址不同,多线程操作同一块共享内存时就会存在忙等循环的情况。忙等循环指的是一个线程操作共享内存时,其他线程占用处理器处于等待状态,直到忙等循环中的循环条件达到相应值时才会退出该忙等循环。在本申请中,忙等循环是一个代码块,该代码块中的代码表示了忙等循环的过程。
202.根据测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流。
其中,每条执行流为处理器运行多线程对同一块共享内存进行读操作和/或写操作的代码执行流程,多条执行流中包含阻塞标记的目标执行流中存在忙等循环。
本申请实施例中,线程操作共享内存可以包括线程对共享内存执行读操作和/或写操作,“读操作和/或写操作”表示可以只执行读操作,只执行写操作,或者既执行读操作又执行写操作。通常在多线程操作共享内存时,既要执行读操作也要执行写操作,如:线程1执行读操作,线程2执行写操作。
本申请实施例中,执行流是多线程对同一块共享内存执行读操作和/或写操作的代码的实际执行流程,可以根据多线程对同一块内存的操作顺序来确定不同的执行流,如:有三个线程操作同一块共享内存,按照三个线程的执行顺序,可以有6个执行流。目标执行流中存在忙等循环,该忙等循环中包含阻塞标记,目标执行流不限于一条,多条执行流中的都每条执行流都可以是目标执行流,只要包含阻塞标记的执行流都可以理解为是目标执行流。
203.若调用多线程执行目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环。
死循环指示第一源代码存在错误,目标线程为多线程中的任意一个。
本申请实施例中,会针对包含阻塞标记的目标执行流进行检查,因为目标执行流中存在忙等循环,所以,执行目标执行流的过程可能会执行多次忙等循环的代码,在每次忙等循环的过程都会涉及到读操作,通常一个新产生的读操作会对应一个新的写操作,因为一个新产生的读操作对应一个已经被别的读操作引用过的写操作只是一次无意义的循环,所以,当一个新产生的读操作引用不到一个新的写操作,也就是一个未被引用过的写操作时,就表示该目标执行流的忙等循环无法退出,是个死循环,那么则表示该第一源代码存在错误,不能正常执行。
本申请实施例提供的方案,因为可以通过阻塞标记来检查目标执行流,即使该第一源代码会产生无穷多个执行流,也无需全部都做检查,所以,可以在有限的时间内完成对第一源代码的正确性检查。
二、源代码经过预处理模块进行预处理后再由模型检查模块执行代码检查的方案。
如图4所示,本申请实施例提供的一种弱内存序架构下的代码检查方法的另一实施例包括:
301.计算机设备获取第二源代码和测试代码。
该第二源代码是没有添加阻塞标记的源代码。
302.从第二源代码中识别出表示忙等循环的代码块,并在表示忙等循环的代码块中添加阻塞标记,以得到第一源代码。
该预处理过程还可以将表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;将阻塞标记添加在与第二形式的循环条件的符号关联的位置。
循环条件(loop-condition)表示循环结束的条件,如:while(lock)表示一个循环条件,其中,while表示循环条件的符号,将循环条件的符号由第一形式转换为第二形式可以是将第一形式的while转换为第二形式的if,当然,本申请不限于第一形式和第二形式的内容,只要第一形式的符号能表示循环条件,第二形式的符号能被检查出表示循环即可。阻塞标记可以是阻塞原语,如:modelchecker_block。本申请中,可以将阻塞标记会添加到循环条件之后,当然,本申请不限定阻塞标记所添加的具体位置,只要与第二形式的循环条件的符号相关联的位置即可。该方案便于快速检查出忙等循环,从而提高代码正确性检查的速度。
303.根据测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流。
其中,每条执行流为处理器运行多线程对同一块共享内存进行读操作和/或写操作的代码执行流程,多条执行流中包含阻塞标记的目标执行流中存在忙等循环。
304.若调用多线程执行目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环。
死循环指示第一源代码存在错误,目标线程为多线程中的任意一个。
步骤303和步骤304可以参阅前述步骤202和203进行理解,此处不再重复赘述。
本申请实施例提供的方案,可以对不包阻塞标记的源代码进行预处理,添加上阻塞标记,这样就可以通过阻塞标记来检查目标执行流,即使该第一源代码会产生无穷多个执行流,也无需全部都做检查,所以,可以在有限的时间内完成对第一源代码的正确性检查。
可选地,上述步骤302中,从第二源代码中识别出表示忙等循环的代码块,包括:从第二源代码中识别出循环条件,循环条件包括恒为真或不是恒为真;若循环条件不是恒为真,则根据循环条件所对应的值确定循环条件所关联的代码块为忙等循环的代码块;若循环条件恒为真,则根据循环条件所关联的循环体确定循环条件所关联的代码块为忙等循环的代码块。
本申请实施例中,若不是恒为真,则循环条件通常为对某个原子变量的读操作或者原子读-交换(compare and swap)操作,通过该原子量变量的读操作读到的值是否满足退出循环来确定循环条件。若是恒为真,则需要通过循环体(loop–body)来定义退出的条件,从而确定代码中的循环条件。该种可能的实现方式,有利于快速确定循环条件,从而快速识别出源代码中的忙等循环的代码块。
本申请实施例中,循环条件不是恒为真的情况可以参阅图5A进行理解,如图5A所示的自旋锁代码的一示例示意图。如图5A所示,该示例图中包括12行代码,在每行代码前分别用1至12做了标记。其中,第3行while(lock)是循环条件,通过在循环中反复检查lock的值,来决定调用spinlock_lock函数的线程是继续第3行到第6行这个循环,还是退出循环执行第6行之后的代码。
本申请实施例中,循环条件恒为真的情况可以参阅图5B进行理解,如图5B所示的自旋锁变体代码的一示例示意图。如图5B所示,该示例图中包括13行代码,在每行代码前分别用1至13做了标记。其中,第3行while(true)表示循环条件恒为真,第3行至第6行的{if(lock==0)break;}表示循环体,循环体中会反复检查lock的值,来决定调用spinlock_lock函数的线程是继续第3行到第7行这个循环,还是退出循环执行第7行之后的代码。
按照上述恒为真或不是恒为真识别出忙等循环后,可以将上述步骤302所介绍的方式,将循环条件做转换,并添加上循环标记,如:将图5A中第3行的循环条件while(lock)转换为if(!Locked)_MODELCHECKER_block();将图5B中第3行的循环条件while(true)转换为if(!Locked)_MODELCHECKER_block()。当处理器检查到包含if(!Locked)_MODELCHECKER_block()的执行流时,就会将该执行流标记为潜在的死循环执行流,从而执行相应的检查过程,来确认该执行流是否为死循环执行流。
在上述图3对应的实施例的步骤202之后,或者在图4对应的实施例的步骤303之后,还可以对多条执行流执行过滤,过滤掉其中的冗余执行流,这样可以缩小对执行流检查的范围,从而缩短检查源代码的时间。
该过滤执行流的过程所使用的过滤算法可以称为等待进度条件(await progresscondition,APC)算法。本申请实施例中,将循环生成的无穷多的执行流过滤为有限执行流的过程可以参阅图6进行理解。如图6所示,计算机设备接收到源代码和测试代码后,会进行模型检查,该模型检查过程会执行图遍历和循环遍历,执行图遍历会遍历该源代码中的每个分支,执行循环遍历会针对每个分支的循环进行遍历,循环遍历过程会产生无穷多的执行流,本申请中会采用APC过滤算法对无穷多的执行流进行过滤,过滤掉其中的冗余执行流,从而的到有限的执行流,其中,冗余执行流的至少两次循环中的至少两个写操作对应同一个写操作。
关于上述APC过滤多条执行流中的冗余执行流的具体过程可以参阅图7进行理解。
如图7所示,该过滤过程包括:
401.检查执行流。
该步骤401检查的执行流可以是任意一个执行流,本申请中可以将其称为第一执行流。可以是检查第一执行流的本次循环中的读操作。该读操作可以是本次循环中的任意一个读操作,可以将其称为第一读操作。
第一执行流为多条执行流中的任意一条执行流,本次循环为第一执行流中正在执行的一次忙等循环。
402.确定是否为读操作。
该步骤402指的是确定所检查的操作是读操作还是写操作,若是读操作,则执行步骤403,若否,则表示不是读操作,是写操作,则执行步骤407。
403.若是读操作,则确定该读操作是否在忙等循环内,若是,则执行步骤404,若否,则执行步骤407。
404.检查该读操作所对应的写操作。
也就是:若执行第一读操作的当前线程正在执行第一执行流中的忙等循环,则检查第一读操作所对应的写操作。
405.确定是否找到该读操作所对应的写操作,若是,则执行步骤407,若否,则执行步骤406。
406.若执行该读操作的当前线程所引用的写操作,已被当前线程在之前的循环中执行读操作时引用过,则确定出该执行流为冗余执行流;过滤掉该执行流。并生成下一个执行流,重复上述过程。
407.继续执行模型查找遍历。
若步骤402确定所检查的操作为写操作,或者步骤405找不到该读操作对应的写操作,则继续执行模型查找遍历。
也就是说:若执行第一读操作的当前线程所引用的写操作,已被当前线程在之前的循环中执行第二读操作时引用过,则确定出第一执行流为冗余执行流;过滤掉第一执行流。
上述APC算法在模型检查的流程中确保忙等条件的每一次读操作都是从新的写操作中得到值,而不是旧值。这样能删除掉无意义的读遍历,确保每一次在忙等循环条件里读到的都是新值。
本申请实施例中,确定冗余执行流的过程可以是通过检查读操作是否有对应的未被引用的写操作的方式来进行的,若一个写操作两次被不属于同一次忙等循环中的线程所执行的两个写操作所引用到,则表示所执行的第一执行流是冗余执行流,则需要过滤掉该第一执行流。该种过滤冗余执行流的方案,可以加速缩小对执行流检查的范围。
在具体应用中,关于是否使用APC过滤算法所产生的执行流可以参阅图8A所示的未使用APC过滤的示意图和图8B所示的使用了APC过滤的示意图的对比进行理解。
如图8A所示,针对一个await_while(l<3)的循环条件,在l=3时该循环才退出,因此,在该循环条件下可以产生如图8A中所示的多条执行流,图8A中,W(l,0)表示l=0时的初始写操作。W(l,1)表示l=1时的写操作,W(l,2)表示l=2时的写操作,W(l,3)表示l=3时的写操作。图8A中的rf表示读操作与写操作之间的引用关系。图8A中的引用关系包括读操作R(1)1引用了W(l,0),读操作R(1)2引用了W(l,2),读操作R(1)3引用了W(l,2),读操作R(1)4引用了W(l,3),其中,W(l,2)被两个读操作R(1)2和R(1)3引用了,其中,R(1)3是在R(1)2引用的W(l,2),所以,包含了R(1)3的这条执行流为用于执行流,若是按照本申请实施例提供的APC过滤算法进行过滤,则可以得到如图8B所示的示意图。从图8A和图8B的对比可以看出,通过APC过滤冗余执行流,可以缩小对执行流检查的范围,提高源代码正确性检查的效率。
可选地,本申请实施例提供的上述步骤203或者步骤304可以包括:调用多线程执行目标执行流中的忙等循环时,在状态集合中为每个读操作设置一个状态标记;当忙等循环中产生一个写操作,则从状态集合中删除一个状态标记;直到忙等循环中不再产生写操作,若状态集合中还包含状态标记,则确定出目标执行流中的忙等循环为死循环。
本申请实施例中,该检查目标执行流的过程可以参阅图9进行理解,如图9所示,该检查目标执行流的过程可以包括:
501.检查操作指令,若该操作指令为写操作,则执行步骤502,若该操作指令为读操作,则执行步骤503。
该操作指令指的是线程调用该目标执行流对共享内存的操作指令。
502.若操作指令为写操作,则记录写地址,将写操作记录进写操作集合,并继续执行步骤506。
该步骤会在写操作集合中增加一个写操作。
503.若操作指令为读操作,则记录读地址,在状态集合中为读操作设置一个状态标记。
状态集合用于存放状态标记,每个状态标记代表一个新的读操作。
504.检查是否可以从写操作集合中为读操作确定对应的写操作。若是,则执行步骤505,若否,则执行步骤506。
505.若为读操作确定了对应的写操作,则从状态集合中移除该读操作对应的状态标记,并从写操作集合中移除对应的写操作,然后执行步骤506。
506.检查是否有下一条操作指令,若有,则重复执行步骤501,若无,则执行步骤507。
507.检查状态集合中是否还存在状态标记,若是,则执行步骤508。
508.若状态集合中还存在状态标记,则报告存在死循环。
本申请实施例中,可以通过状态标记的方式来确定是否每个新产生的读操作都会有一个新产生的写操作,若状态集合中的状态标记有剩余,则表示新产生的读操作没有对应的新产生的写操作了,则表示该忙等循环无法退出,该忙等循环为死循环。该种实现方式有利于快速确定出忙等循环是否可终止,若不可终止,则表示该第一源代码存在错误。
以上描述了在弱内存序架构下的代码检查方法,下面结合附图介绍本申请实施例提供的一种弱内存序架构下的代码检查装置60。
如图10所示,本申请实施例提供的弱内存序架构下的代码检查装置60的一实施例包括:
获取单元601,用于获取第一源代码和测试代码,第一源代码中包含阻塞标记,测试代码用于指示第一源代码能正确运行需符合的条件,第一源代码对应多个线程,多个线程具有至少一块共享内存,阻塞标记用于指示第一源代码中忙等循环的位置。该获取单元601可以执行上述方法实施例部分的步骤201或步骤301。
第一处理单元602,用于根据获取单元601获取的测试代码所指示的条件和第一源代码,为操作同一块共享内存的多线程生成在弱内存序架构下的多条执行流,其中,每条执行流为处理器运行多线程对同一块共享内存进行读操作和/或写操作的代码执行流程,多条执行流中包含阻塞标记的目标执行流中存在忙等循环。该第一处理单元602可以执行上述方法实施例部分的步骤202或303。
第二处理单元603,用于若调用多线程执行第一处理单元602生成的目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出目标执行流中的忙等循环为死循环,死循环指示第一源代码存在错误,目标线程为多线程中的任意一个。该第二处理单元603可以执行上述方法实施例部分的步骤203或304。
本申请实施例提供的方案,因为可以通过阻塞标记来检查目标执行流,即使该第一源代码会产生无穷多个执行流,也无需全部都做检查,所以,可以在有限的时间内完成对第一源代码的正确性检查。
可选地,获取单元601,用于获取第二源代码;从第二源代码中识别出表示忙等循环的代码块,并在表示忙等循环的代码块中添加阻塞标记,以得到第一源代码。该获取单元601可以执行上述方法实施例部分的步骤302。
可选地,第一处理单元602,还用于将表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;将阻塞标记添加在与第二形式的循环条件的符号关联的位置。
可选地,第一处理单元602,用于从第二源代码中识别出循环条件,循环条件包括恒为真或不是恒为真;若循环条件不是恒为真,则根据循环条件所对应的值确定循环条件所关联的代码块为忙等循环的代码块;若循环条件恒为真,则根据循环条件所关联的循环体确定循环条件所关联的代码块为忙等循环的代码块。
可选地,第一处理单元602,还用于过滤掉多条执行流中的冗余执行流,冗余执行流的至少两次循环中的至少两个写操作对应同一个写操作。
可选地,第一处理单元602,用于检查第一执行流的本次循环中的第一读操作,第一执行流为多条执行流中的任意一条执行流,本次循环为第一执行流中正在执行的一次忙等循环;若执行第一读操作的当前线程正在执行第一执行流中的忙等循环,则检查第一读操作所对应的写操作;若执行第一读操作的当前线程所引用的写操作,已被当前线程在之前的循环中执行第二读操作时引用过,则确定出第一执行流为冗余执行流;过滤掉第一执行流。
可选地,第二处理单元603,用于调用多线程执行目标执行流中的忙等循环时,在状态集合中为每个读操作设置一个状态标记;当忙等循环中产生一个写操作,则从状态集合中删除一个状态标记;直到忙等循环中不再产生写操作,若状态集合中还包含状态标记,则确定出目标执行流中的忙等循环为死循环。
本申请实施例中,获取单元601可以对应上述图2中的(源代码+测试代码)获取模块,第一处理单元602和第二处理单元603可以对应上述图2中的模型检查模块,获取单元601还可以对应上述图2中的预处理模块。
以上所描述的装置60可以参阅前面方法实施例的相应内容进行理解,此处不在重复赘述。
图11所示,为本申请的实施例提供的计算机设备70的一种可能的逻辑结构示意图。计算机设备70包括:处理器701、通信接口702、物理内存703以及总线704。处理器701、通信接口702以及物理内存703通过总线704相互连接。在本申请的实施例中,处理器701用于对计算机设备70的动作进行控制管理,例如,处理器701用于执行图2至图8B的方法实施例中的步骤。通信接口702用于支持计算机设备70进行通信。物理内存703,用于存储计算机设备70的程序代码和数据,并为进程组提供内存空间。
其中,处理器701可以是中央处理器单元,通用处理器,数字信号处理器,专用集成电路,现场可编程门阵列或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器701也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,数字信号处理器和微处理器的组合等等。总线704可以是外设部件互连标准(PeripheralComponent Interconnect,PCI)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图11中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
在本申请的另一实施例中,还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机执行指令,当设备的处理器执行该计算机执行指令时,设备执行上述图2至图8B中处理器所执行的步骤。
在本申请的另一实施例中,还提供一种计算机程序产品,该计算机程序产品包括计算机执行指令,该计算机执行指令存储在计算机可读存储介质中;当设备的处理器执行该计算机执行指令时,设备执行上述图2至图8B中处理器所执行的步骤。
在本申请的另一实施例中,还提供一种芯片系统,该芯片系统包括处理器,该处理器用于支持内存管理的装置实现上述图2至图8B中处理器所执行的步骤。在一种可能的设计中,芯片系统还可以包括存储器,存储器,用于保存数据写入的装置必要的程序指令和数据。该芯片系统,可以由芯片构成,也可以包含芯片和其他分立器件。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请实施例的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请实施例所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请实施例各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请实施例各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上,仅为本申请实施例的具体实施方式,但本申请实施例的保护范围并不局限于此。
Claims (16)
1.一种弱内存序架构下的代码检查方法,其特征在于,包括:
获取第一源代码和测试代码,所述第一源代码中包含阻塞标记,所述测试代码用于指示所述第一源代码能正确运行需符合的条件,所述第一源代码对应多个线程,所述多个线程具有至少一块共享内存,所述阻塞标记用于指示所述第一源代码中忙等循环的位置;
根据所述测试代码所指示的条件和所述第一源代码,为操作同一块共享内存的所述多线程生成在弱内存序架构下的多条执行流,其中,每条执行流为处理器运行所述多线程对所述同一块共享内存进行读操作和/或写操作的代码执行流程,所述多条执行流中包含阻塞标记的目标执行流中存在忙等循环;
若调用所述多线程执行所述目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出所述目标执行流中的忙等循环为死循环,所述死循环指示所述第一源代码存在错误,所述目标线程为所述多线程中的任意一个。
2.根据权利要求1所述的方法,其特征在于,所述获取第一源代码,包括:
获取第二源代码;
从所述第二源代码中识别出表示忙等循环的代码块,并在所述表示忙等循环的代码块中添加所述阻塞标记,以得到所述第一源代码。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
将所述表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;
所述在所述表示忙等循环的代码块中添加所述阻塞标记,包括:
将所述阻塞标记添加在与所述第二形式的循环条件的符号关联的位置。
4.根据权利要求2或3所述的方法,其特征在于,所述从所述第二源代码中识别出表示忙等循环的代码块,包括:
从所述第二源代码中识别出循环条件,所述循环条件包括恒为真或不是恒为真;
若所述循环条件不是恒为真,则根据所述循环条件所对应的值确定所述循环条件所关联的代码块为忙等循环的代码块;
若所述循环条件恒为真,则根据所述循环条件所关联的循环体确定所述循环条件所关联的代码块为忙等循环的代码块。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述方法还包括:
过滤掉所述多条执行流中的冗余执行流,所述冗余执行流的至少两次循环中的至少两个写操作对应同一个写操作。
6.根据权利要求5所述的方法,其特征在于,所述过滤掉所述多条执行流中的冗余执行流,包括:
检查第一执行流的本次循环中的第一读操作,所述第一执行流为所述多条执行流中的任意一条执行流,所述本次循环为所述第一执行流中正在执行的一次忙等循环;
若执行所述第一读操作的当前线程正在执行所述第一执行流中的忙等循环,则检查所述第一读操作所对应的写操作;
若执行所述第一读操作的所述当前线程所引用的写操作,已被所述当前线程在之前的循环中执行第二读操作时引用过,则确定出所述第一执行流为所述冗余执行流;
过滤掉所述第一执行流。
7.根据权利要求1-6任一项所述的方法,其特征在于,所述若调用所述多线程执行所述目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出所述目标执行流中的忙等循环为死循环,包括:
调用所述多线程执行所述目标执行流中的忙等循环时,在状态集合中为每个读操作设置一个状态标记;
当所述忙等循环中产生一个写操作,则从所述状态集合中删除一个状态标记;
直到所述忙等循环中不再产生写操作,若所述状态集合中还包含状态标记,则确定出所述目标执行流中的忙等循环为死循环。
8.一种计算机设备,其特征在于,包括:处理器、内存和存储有计算机程序的计算机可读存储介质;所述处理器与所述计算机可读存储介质耦合,所述计算机程序被所述处理器执行时实现如下步骤:
获取第一源代码和测试代码,所述第一源代码中包含阻塞标记,所述测试代码用于指示所述第一源代码能正确运行需符合的条件,所述第一源代码对应多个线程,所述多个线程具有至少一块共享内存,所述阻塞标记用于指示所述第一源代码中忙等循环的位置;
根据所述测试代码所指示的条件和所述第一源代码,为操作同一块共享内存的所述多线程生成在弱内存序架构下的多条执行流,其中,每条执行流为处理器运行所述多线程对所述同一块共享内存进行读操作和/或写操作的代码执行流程,所述多条执行流中包含阻塞标记的目标执行流中存在忙等循环;
若调用所述多线程执行所述目标执行流中的忙等循环时,一次忙等循环中的目标线程所执行的读操作引用不到一个未被引用过的写操作,则确定出所述目标执行流中的忙等循环为死循环,所述死循环指示所述第一源代码存在错误,所述目标线程为所述多线程中的任意一个。
9.根据权利要求8所述的计算机设备,其特征在于,所述处理器用于:
获取第二源代码;
从所述第二源代码中识别出表示忙等循环的代码块,并在所述表示忙等循环的代码块中添加所述阻塞标记,以得到所述第一源代码。
10.根据权利要求9所述的计算机设备,其特征在于,所述处理器还用于:
将所述表示忙等循环的代码块中表示循环条件的符号由第一形式转换为第二形式;
将所述阻塞标记添加在与所述第二形式的循环条件的符号关联的位置。
11.根据权利要求9或10所述的计算机设备,其特征在于,所述处理器用于:
从所述第二源代码中识别出循环条件,所述循环条件包括恒为真或不是恒为真;
若所述循环条件不是恒为真,则根据所述循环条件所对应的值确定所述循环条件所关联的代码块为忙等循环的代码块;
若所述循环条件恒为真,则根据所述循环条件所关联的循环体确定所述循环条件所关联的代码块为忙等循环的代码块。
12.根据权利要求8-11任一项所述的计算机设备,其特征在于,所述处理器还用于:
过滤掉所述多条执行流中的冗余执行流,所述冗余执行流的至少两次循环中的至少两个写操作对应同一个写操作。
13.根据权利要求12所述的计算机设备,其特征在于,所述处理器用于:
检查第一执行流的本次循环中的第一读操作,所述第一执行流为所述多条执行流中的任意一条执行流,所述本次循环为所述第一执行流中正在执行的一次忙等循环;
若执行所述第一读操作的当前线程正在执行所述第一执行流中的忙等循环,则检查所述第一读操作所对应的写操作;
若执行所述第一读操作的所述当前线程所引用的写操作,已被所述当前线程在之前的循环中执行第二读操作时引用过,则确定出所述第一执行流为所述冗余执行流;
过滤掉所述第一执行流。
14.根据权利要求8-13任一项所述的计算机设备,其特征在于,所述处理器用于:
调用所述多线程执行所述目标执行流中的忙等循环时,在状态集合中为每个读操作设置一个状态标记;
当所述忙等循环中产生一个写操作,则从所述状态集合中删除一个状态标记;
直到所述忙等循环中不再产生写操作,若所述状态集合中还包含状态标记,则确定出所述目标执行流中的忙等循环为死循环。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-7任一项所述的方法。
16.一种芯片系统,其特征在于,包括处理器,所述处理器被调用用于执行如权利要求1-7任一项所述的方法。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110401685.0A CN115202662A (zh) | 2021-04-14 | 2021-04-14 | 一种弱内存序架构下的代码检查方法及相应设备 |
EP22787559.8A EP4318211A1 (en) | 2021-04-14 | 2022-04-13 | Method for inspecting code under weak memory order architecture, and corresponding device |
PCT/CN2022/086590 WO2022218337A1 (zh) | 2021-04-14 | 2022-04-13 | 一种弱内存序架构下的代码检查方法及相应设备 |
US18/484,641 US20240045787A1 (en) | 2021-04-14 | 2023-10-11 | Code inspection method under weak memory ordering architecture and corresponding device |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110401685.0A CN115202662A (zh) | 2021-04-14 | 2021-04-14 | 一种弱内存序架构下的代码检查方法及相应设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115202662A true CN115202662A (zh) | 2022-10-18 |
Family
ID=83574205
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110401685.0A Pending CN115202662A (zh) | 2021-04-14 | 2021-04-14 | 一种弱内存序架构下的代码检查方法及相应设备 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20240045787A1 (zh) |
EP (1) | EP4318211A1 (zh) |
CN (1) | CN115202662A (zh) |
WO (1) | WO2022218337A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115202662A (zh) * | 2021-04-14 | 2022-10-18 | 华为技术有限公司 | 一种弱内存序架构下的代码检查方法及相应设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100218196A1 (en) * | 2008-02-08 | 2010-08-26 | Reservoir Labs, Inc. | System, methods and apparatus for program optimization for multi-threaded processor architectures |
CN103858101A (zh) * | 2011-10-03 | 2014-06-11 | 国际商业机器公司 | 采用解码时间指令优化连接用于增强应用二进制接口(abi)的代码 |
CN104572451A (zh) * | 2014-12-25 | 2015-04-29 | 北京京东尚科信息技术有限公司 | 一种代码效率检查方法及系统 |
CN108509772A (zh) * | 2018-02-12 | 2018-09-07 | 北京梆梆安全科技有限公司 | 基于执行顺序和单点逻辑的源代码加固方法及装置 |
CN114518884A (zh) * | 2020-11-19 | 2022-05-20 | 华为技术有限公司 | 修复弱内存序问题的方法及装置 |
CN116841564A (zh) * | 2023-08-29 | 2023-10-03 | 腾讯科技(深圳)有限公司 | 一种数据处理方法、装置、设备以及计算机可读存储介质 |
US20240045787A1 (en) * | 2021-04-14 | 2024-02-08 | Huawei Technologies Co., Ltd. | Code inspection method under weak memory ordering architecture and corresponding device |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101833440B (zh) * | 2010-04-30 | 2013-01-02 | 西安交通大学 | 编译器支持下的推测多线程内存数据同步执行方法及装置 |
US10613854B2 (en) * | 2016-12-22 | 2020-04-07 | The United States Of America, As Represented By The Secretary Of The Navy | Systems and methods for automated renumbering, reformatting, and re-referencing of branching statements or go-to instruction line referencing within modified code using a dual-pass approach that includes operations using predicted new line numbers, error detection/correction, and alignment correction processing |
CN109960643B (zh) * | 2017-12-22 | 2022-07-22 | 网宿科技股份有限公司 | 一种代码测试方法和装置 |
CN111045832B (zh) * | 2019-11-13 | 2022-09-30 | 烽火通信科技股份有限公司 | 一种软件死循环或阻塞监控的方法及系统 |
-
2021
- 2021-04-14 CN CN202110401685.0A patent/CN115202662A/zh active Pending
-
2022
- 2022-04-13 WO PCT/CN2022/086590 patent/WO2022218337A1/zh active Application Filing
- 2022-04-13 EP EP22787559.8A patent/EP4318211A1/en active Pending
-
2023
- 2023-10-11 US US18/484,641 patent/US20240045787A1/en active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100218196A1 (en) * | 2008-02-08 | 2010-08-26 | Reservoir Labs, Inc. | System, methods and apparatus for program optimization for multi-threaded processor architectures |
CN103858101A (zh) * | 2011-10-03 | 2014-06-11 | 国际商业机器公司 | 采用解码时间指令优化连接用于增强应用二进制接口(abi)的代码 |
CN104572451A (zh) * | 2014-12-25 | 2015-04-29 | 北京京东尚科信息技术有限公司 | 一种代码效率检查方法及系统 |
CN108509772A (zh) * | 2018-02-12 | 2018-09-07 | 北京梆梆安全科技有限公司 | 基于执行顺序和单点逻辑的源代码加固方法及装置 |
CN114518884A (zh) * | 2020-11-19 | 2022-05-20 | 华为技术有限公司 | 修复弱内存序问题的方法及装置 |
US20240045787A1 (en) * | 2021-04-14 | 2024-02-08 | Huawei Technologies Co., Ltd. | Code inspection method under weak memory ordering architecture and corresponding device |
CN116841564A (zh) * | 2023-08-29 | 2023-10-03 | 腾讯科技(深圳)有限公司 | 一种数据处理方法、装置、设备以及计算机可读存储介质 |
Non-Patent Citations (3)
Title |
---|
JONAS OBERHAUSER 等: ""VSync: Push-Button Verification and Optimization for Synchronization Primitives on Weak Memory Mo"", pages 1 - 16, Retrieved from the Internet <URL:https://people.mpi-sws.org/~viktor/papers/asplos2021-vsync.pdf> * |
MIGUEL AREIA: ""Programming for shared memory architectures with processes"", Retrieved from the Internet <URL:https://www.dcc.fc.up.pt/~edrdo/aulas/cp/notes/slides/processes_slides.pdf> * |
凝望那片天空: "两个函数相互调用防止死循环", Retrieved from the Internet <URL:https://blog.csdn.net/weixin_43247299/article/details/103307476> * |
Also Published As
Publication number | Publication date |
---|---|
WO2022218337A1 (zh) | 2022-10-20 |
EP4318211A1 (en) | 2024-02-07 |
US20240045787A1 (en) | 2024-02-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102648449B (zh) | 一种用于处理干扰事件的方法和图形处理单元 | |
US9058201B2 (en) | Managing and tracking thread access to operating system extended features using map-tables containing location references and thread identifiers | |
CN104126179B (zh) | 用于多核处理器中的核心间通信的方法和装置 | |
CN108628638B (zh) | 数据处理方法及装置 | |
US20240045787A1 (en) | Code inspection method under weak memory ordering architecture and corresponding device | |
CN112905365B (zh) | 一种数据处理方法、装置、设备及介质 | |
CN116302103B (zh) | 指令编译方法及装置、图形处理单元、存储介质 | |
CN111208933A (zh) | 数据访问的方法、装置、设备和存储介质 | |
CN111158756A (zh) | 用于处理信息的方法和装置 | |
US20120210332A1 (en) | Asynchronous programming execution | |
CN111949513A (zh) | 一种配置文件加载方法、装置、电子设备和可读存储装置 | |
CN109582542B (zh) | 一种嵌入式系统核心转储的方法 | |
TW201235938A (en) | Enabling virtual calls in a SIMD environment | |
EP2804102A2 (en) | Parallel atomic increment | |
CN113485840A (zh) | 基于Go语言的多任务并行处理装置及方法 | |
US9218273B2 (en) | Automatic generation of a resource reconfiguring test | |
CN115905040B (zh) | 计数器的处理方法、图形处理器、设备及存储介质 | |
CN112084024A (zh) | 一种内存监控方法、装置、介质和电子设备 | |
CN116909819A (zh) | 一种处理器调试方法、装置、计算机设备及处理器 | |
CN115656788A (zh) | 一种芯片测试系统、方法、设备及存储介质 | |
US9513973B2 (en) | Device and method for synchronizing tasks executed in parallel on a platform comprising several calculation units | |
CN111078449B (zh) | 信息处理方法、信息处理装置及终端设备 | |
CN112346879B (zh) | 进程管理方法、装置、计算机设备及存储介质 | |
CN110825461A (zh) | 数据处理方法和装置 | |
CN111522600B (zh) | 一种在dsp上的异构计算框架构建方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |