一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

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

2022-07-13 22:09:26 来源:中国专利 TAG:

1.本发明涉及计算机技术领域,具体来说是一种跨平台的程序指令重排的验证方法。


背景技术:

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


技术实现要素:

3.本发明的目的在于解决现有技术的不足,提供一种跨平台的程序指令重排的验证方法。
4.为了实现上述目的,设计一种跨平台的程序指令重排的验证方法,该方法将两个应用进程对同一块共享内存读写并发操作,运行时写进程在某地址写数据时,读进程在该地址上追赶到写进程进行读操作,具体方法如下:写进程程序,主流程中执行两个步骤,第一进行data变量赋值操作,第二进行flag变量的赋值操作;读进程程序,主流程中执行两个步骤,第一判断flag变量是否就绪,第二进行data变量的读操作,检查data值和上一次读取值之差,差值不为1则表示指令重排。
5.本发明还包括如下优选的技术方案。
6.优选地,一种跨平台的程序指令重排的验证方法,还包括所述应用进程中的变量data和flag在内存实现中组成程序操作的最小单元,以便读写进程的使用,因此程序中使用结构体将两个变量组合成逻辑上的整体。
7.优选地,一种跨平台的程序指令重排的验证方法,还包括所述共享内存是一块大小固定且连续的共享内容,形同一块连续的数组。
8.优选地,一种跨平台的程序指令重排的验证方法,还包括所述的共享内存为首尾相接的环形结构。
9.一种跨平台的程序指令重排的验证方法,所述验证方法,具体如下:a.写进程负责内存数据的生成,写进程使用写指针操作共享内存,从第一位置开始,将data和flag赋一个相同的64位的long long类型值,使用相同的数值用于读进程进行数据判断,赋值完成后,写指针后移一位,同时,下一个位置的赋值递增一;b.读进程负责内存数据的读取,同时,通过对flag和data的数据检查,完成对程序运行状态的验证,判断进程运行过程中程序是否发生了指令重排,读进程使用读指针操作
共享内存,在读进程中设置一个变量predata,初始化0,该值记录每次读进程获取到的内存位置中的data值,供读进程进行数据正确性判断。
10.本发明同现有技术相比,其优点在于:1.不限于特定的程序运行环境,支持多种程序设计语言;2.通过共享内存使用,便于进程之间的数据同步;3.提出了内存中的data和flag同时设置为相同的数值的方式,简化了指令重排的结果验证。
附图说明
11.图1 为内存数据结构体图。
12.图2为共享内存结构图。
13.图3为正常的读取过程图。
14.图4为异常的读取过程图。
具体实施方式
15.参见图1,图1为内存数据结构体图,应用进程中的变量data和flag在内存实现中组成程序操作的最小单元,以便读写进程的使用,因此程序中使用结构体将两个变量组合成逻辑上的整体。
16.参见图2,图2为共享内存结构图,基于图1的内存数据结构体,创建一块大小固定且连续的共享内存,形同一块连续的数据,本方法中设置的创建大小为500万个结构体,约76mb内存空间,其中,当读写指针进行内存操作达到最后一个位置500万时,读写指针操作的下一位置为1,因此在逻辑上共享内存为首尾相接的环形结构。
17.针对上述方法的验证方法如下:(1)内存数据的生成写进程负责内存数据的生成,写进程使用写指针操作共享内存,从位置1开始,将data和flag赋一个相同的64位的long long类型值,使用相同的数值以便于读进程进行数据判断,赋值完成后,写指针后移一位,同时下一个位置的赋值递增1,;例如,位置1的data和flag值为1,则位置2的data和flag的值为2,依次类推。
18.当写指针写完位置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值,供读进程进行数据正确性判断。
19.参见图3,图3为正常的读取过程图,在进程模型的操作流程中,写进程在完成data变量的赋值之后,再完成flag变量的赋值,读进程在判断flag变量就绪后,再读取data变量,当读指针当前读取的data和predata的差值为1,即data-predata=1时,表示读取的数值正确,指令执行正常。
20.否则参见图4,图4为异常的读取过程图,表示读取数据异常,发生了指令重排,同时错误预期内读取的data和predata的差值-4999999,即当前读指针获取data的是上一轮的数据值,而flag为当前这一轮的值,在异常的数据读取过程中,读进程在进行数据读取的那一时刻,读指针和写指针指向内存中的同一结构体,并且同时对内存进行操作。
21.为了验证上述方法,进行如下实施例验证。
实施例
22.实施环境:操作系统:openvms v8.4-2l1;cpu:hp integrity bl860ci6;程序开发语言:c语言。
23.实施过程:编写读写进程程序代码,其中读进程进行共享内存的创建。
24.验证时,先将实施环境中的共享内存清空,关闭其他的应用进程,读进程优先启动运行,启动完成后再启动运行写进程。
25.在实验环境执行读写进程验证程序,查看实验结果,读进程如发生异常读取,则在终端屏显上打印相关日志,如进程执行时在一定的时间内无异常读取的屏显日志,则认为读取数据正常,实验结果如表2所示:表2测试数据 predatadatadata-predata输出16768467562684676-4999999输出26772624262726243-4999999输出36781469162814692-4999999输出46951261064512611-4999999输出57158145966581460-4999999
……ꢀꢀꢀ
以上所述,仅为此发明的具体实施方式,但本发明的保护范围不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案和新型的构思加于等同替换或改变,都应涵盖在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献