一种跨平台的程序指令重排的验证方法技术

技术编号:34125635 阅读:71 留言:0更新日期:2022-07-14 14:08
本发明专利技术公开一种跨平台的程序指令重排的验证方法,该方法将两个应用进程对同一块共享内存读写并发操作,运行时写进程在某地址写数据时,读进程在该地址上追赶到写进程进行读操作,具体方法包括写进程程序和读进程程序,所述写进程程序主流程中先进行Data变量赋值操作,再进行Flag变量的赋值操作;所述读进程程序主流程中先判断Flag变量是否就绪,再进行Data变量的读操作,检查Data值和上一次读取值preData之差,差值不为1则表示指令重排;本发明专利技术公开的一种跨平台的程序指令重排的验证方法,提出了内存中的Data和Flag同时设置为相同的数值的方式,简化了指令重排的结果验证,支持多种程序设计语言,通过共享内存使用,便于进程之间的数据同步。进程之间的数据同步。进程之间的数据同步。

A cross platform verification method for program instruction rearrangement

【技术实现步骤摘要】
一种跨平台的程序指令重排的验证方法


[0001]本专利技术涉及计算机
,具体来说是一种跨平台的程序指令重排的验证方法。

技术介绍

[0002]现代CPU一般采用流水线来执行指令,一般情况下一条指令的执行被分成:取指、译码、访存、执行、写回等若干个阶段,多条指令可以同时存在于流水线中,同时被执行,指令流水线是并行的,多条指令可以同时处于同一阶段,只要CPU的处理部件未被占满即可;因此,指令乱序就有可能产生了,乱序产生时代码执行的顺序就发生了颠倒,这一现象称之为指令重排。比如,程序存在两条先后顺序的赋值语句,后一条赋值语句就有可能先于前一条语句完成。

技术实现思路

[0003]本专利技术的目的在于解决现有技术的不足,提供一种跨平台的程序指令重排的验证方法。
[0004]为了实现上述目的,设计一种跨平台的程序指令重排的验证方法,该方法将两个应用进程对同一块共享内存读写并发操作,运行时写进程在某地址写数据时,读进程在该地址上追赶到写进程进行读操作,具体方法如下:写进程程序,主流程中执行两个步骤,第一进行Data变量赋值操作,第二进行Flag变量的赋值操作;读进程程序,主流程中执行两个步骤,第一判断Flag变量是否就绪,第二进行Data变量的读操作,检查Data值和上一次读取值之差,差值不为1则表示指令重排。
[0005]本专利技术还包括如下优选的技术方案。
[0006]优选地,一种跨平台的程序指令重排的验证方法,还包括所述应用进程中的变量Data和Flag在内存实现中组成程序操作的最小单元,以便读写进程的使用,因此程序中使用结构体将两个变量组合成逻辑上的整体。
[0007]优选地,一种跨平台的程序指令重排的验证方法,还包括所述共享内存是一块大小固定且连续的共享内容,形同一块连续的数组。
[0008]优选地,一种跨平台的程序指令重排的验证方法,还包括所述的共享内存为首尾相接的环形结构。
[0009]一种跨平台的程序指令重排的验证方法,所述验证方法,具体如下:a.写进程负责内存数据的生成,写进程使用写指针操作共享内存,从第一位置开始,将Data和Flag赋一个相同的64位的long long类型值,使用相同的数值用于读进程进行数据判断,赋值完成后,写指针后移一位,同时,下一个位置的赋值递增一;b.读进程负责内存数据的读取,同时,通过对Flag和Data的数据检查,完成对程序运行状态的验证,判断进程运行过程中程序是否发生了指令重排,读进程使用读指针操作
共享内存,在读进程中设置一个变量preData,初始化0,该值记录每次读进程获取到的内存位置中的Data值,供读进程进行数据正确性判断。
[0010]本专利技术同现有技术相比,其优点在于:1.不限于特定的程序运行环境,支持多种程序设计语言;2.通过共享内存使用,便于进程之间的数据同步;3.提出了内存中的Data和Flag同时设置为相同的数值的方式,简化了指令重排的结果验证。
附图说明
[0011]图1 为内存数据结构体图。
[0012]图2为共享内存结构图。
[0013]图3为正常的读取过程图。
[0014]图4为异常的读取过程图。
具体实施方式
[0015]参见图1,图1为内存数据结构体图,应用进程中的变量Data和Flag在内存实现中组成程序操作的最小单元,以便读写进程的使用,因此程序中使用结构体将两个变量组合成逻辑上的整体。
[0016]参见图2,图2为共享内存结构图,基于图1的内存数据结构体,创建一块大小固定且连续的共享内存,形同一块连续的数据,本方法中设置的创建大小为500万个结构体,约76MB内存空间,其中,当读写指针进行内存操作达到最后一个位置500万时,读写指针操作的下一位置为1,因此在逻辑上共享内存为首尾相接的环形结构。
[0017]针对上述方法的验证方法如下:(1)内存数据的生成写进程负责内存数据的生成,写进程使用写指针操作共享内存,从位置1开始,将Data和Flag赋一个相同的64位的long long类型值,使用相同的数值以便于读进程进行数据判断,赋值完成后,写指针后移一位,同时下一个位置的赋值递增1,;例如,位置1的Data和Flag值为1,则位置2的Data和Flag的值为2,依次类推。
[0018]当写指针写完位置500万时,下一个位置为位置1,Data和Flag的值为5000001,同时覆盖原位置1的Data和Flag数据,即写指针在循环写数据时,写入的数值是持续递增的,环形共享内存中Data和Flag的数值变化如表1所示:表1 内存中的数值 位置1的值位置2的值位置N的值位置5000000的值第1轮12N5000000第2轮1+50000002+5000000N+50000005000000+5000000第M轮1+5000000*(M

1)2+5000000*(M

1)N+5000000*(M

1)5000000+5000000*(M

1)
(2)内存数据的读取读进程负责读取内存中的数据,同时,通过对Flag和Data的数据检查,完成对程序运行状态的验证,判断进程运行过程中程序是否发生了指令重排,读进程使用读指针操作
共享内存,在读进程中设置一个变量为preData,初始化为0,该值记录每次读进程获取到的内存位置中的Data值,供读进程进行数据正确性判断。
[0019]参见图3,图3为正常的读取过程图,在进程模型的操作流程中,写进程在完成Data变量的赋值之后,再完成Flag变量的赋值,读进程在判断Flag变量就绪后,再读取Data变量,当读指针当前读取的Data和PreData的差值为1,即Data

preData=1时,表示读取的数值正确,指令执行正常。
[0020]否则参见图4,图4为异常的读取过程图,表示读取数据异常,发生了指令重排,同时错误预期内读取的Data和preData的差值

4999999,即当前读指针获取Data的是上一轮的数据值,而Flag为当前这一轮的值,在异常的数据读取过程中,读进程在进行数据读取的那一时刻,读指针和写指针指向内存中的同一结构体,并且同时对内存进行操作。
[0021]为了验证上述方法,进行如下实施例验证。
实施例
[0022]实施环境:操作系统:OpenVMS V8.4

2L1;CPU:HP Integrity BL860ci6;程序开发语言:C语言。
[0023]实施过程:编写读写进程程序代码,其中读进程进行共享内存的创建。
[0024]验证时,先将实施环境中的共享内存清空,关闭其他的应用进程,读进程优先启动运行,启动完成后再启动运行写进程。
[0025]在实验环境执行读写进程验证程序,查看实验结果,读进程如发生异常读取,则在终端屏显上打印相关日志,如进程执行时在一定的时本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种跨平台的程序指令重排的验证方法,其特征在于将两个应用进程对同一块共享内存读写并发操作,运行时写进程在某地址写数据时,读进程在该地址上追赶到写进程进行读操作;具体方法如下:写进程程序,主流程中执行两个步骤:先进行Data变量赋值操作,后进行Flag变量的赋值操作;读进程程序,主流程中执行两个步骤:先判断Flag变量是否就绪;就绪后再进行Data变量的读操作,然后检查Data值和上一次读取值preData之差,差值不为1则表示指令重排。2.如权利要求1所述的一种跨平台的程序指令重排的验证方法,其特征在于所述应用进程中的变量Data和Flag在内存实现中组成程序操作的最小单元,以便读写进程的使用,因此程序中使用结构体将两个变量组合成逻辑上的整体。3.如权利要求1所述的一种跨平台的程序指令重排的验证方法,其特征在于所述共享内存是一块大小固定且连续的共享内存,形同一块连续的数组。...

【专利技术属性】
技术研发人员:束长栋廖球
申请(专利权)人:上交所技术有限责任公司
类型:发明
国别省市:

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

1