当前位置: 首页 > 专利查询>微软公司专利>正文

可执行代码数据的无锁流传送制造技术

技术编号:11280701 阅读:103 留言:0更新日期:2015-04-09 14:05
分解器接收指令并将它们分解成多个分开的操作码。分解器创建标识每一个操作码之间的边界的表。通过原子地写存储器的标准块来将每一个操作码以逐操作码的方式写至存储器。当需要时将调试断点操作码追加到操作码以创建完整的存储器块。存储器块可以长达例如三十二位或者六十四位。长操作码可重叠两个或更多的存储器块。可将调试断点操作码追加到长操作码的第二部分以创建完整的存储器块。流故障拦截器标识何时所请求的数据页不可用并取回该数据页。

【技术实现步骤摘要】
【国外来华专利技术】可执行代码数据的无锁流传送的方法和系统
本专利技术涉及一种计算机系统和计算机实现的方法,尤其涉及可执行代码数据的无锁流传送的方法和系统。
技术介绍
当同时收到读和写数据的命令时发生竞争状况。这也可以在例如在写线程将数据递送至存储器的同时一线程正在执行来自存储器的可执行数据分组的时候发生。结果可能是计算机崩溃、程序关闭、读/写错误或其他问题。在一个解决方案中,在等待写线程提供数据的同时可将执行线程挂起。然而,挂起线程可导致相关进程的性能问题。举例而言,对于进程可以有数十或数百个线程在运行,其中只有一个或几个线程访问该数据,但每一次流故障发生时所有的线程都必须被挂起以等待数据递送。
技术实现思路
提供本概述以便以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制所要求保护主题的范围。各实施例通过分解可执行代码并对于对存储器页的写排序来允许可执行代码以无锁的方式递送。这允许可执行代码贯穿流数据的递送而保持在一致的状态中。因为存储器处于一致的状态,所以当字节代码被写进存储器时其他线程可继续执行。这允许更大的可扩展性和性能。进一步的实施例启用用户模式中可执行代码数据的流传送,而无需挂起整个进程或使用内核模式组件。附图说明为了进一步阐明本专利技术的各实施例的以上及其他优点和特征,将参考附图来呈现对本专利技术的各实施例的更具体的描述。应当理解,这些附图只描绘本专利技术的典型实施例,并且因此将不被认为是对其范围的限制。本专利技术将通过使用附图用附加特征和细节来描述和解释,在附图中:图1A-D示出了根据一个实施例的存储器写随时间的排序。图2示出了根据一个实施例用于流传送无锁可执行代码数据的系统。图3是根据一个实施例用于流传送可执行代码数据的过程或方法的流程图。图4示出了提供可执行代码数据的无锁流传送的适合的计算和网络环境的示例。具体实施方式此处描述的无锁解决方案利用现代处理器的两个特征。首先,处理器提供原子三十二位或六十四位的存储器访问写。这保证了处理器将在存储器中看到所有的三十二位或六十四位。第二,处理器有一个字节的调试断点异常操作码(opcode)。此调试断点操作码允许处理器重试从存储器读和执行操作码而不导致调用线程失败。在一个实施例中,在指令对处理器可用之前在存储器中分解代码。此分解允许创建包括数个单独的三十二位或六十四位写的存储器写的有序列表。此分解和分析可以在客户端或者服务器上执行。在客户端上执行此操作以增加处理器周期的代价节省网络传输,而在服务器上执行此操作意味着更大的网络传输但要求客户端节点处的较少处理器操作。当存储器页被分配时,整个页用一个字节的异常代码来写。流故障处理器保持已经写过或者无效的页和位置的列表。操作码使用从页末开始的分解的三十二位或六十四位的块写至存储器。替换性地,可以分析汇编树以标识叶操作码,叶操作码是由其他操作码调用的操作码。叶操作码可通过遍历操作码执行调用图来标识。这些叶操作码可首先被写至存储器。对于三十二位或更小(或者在其他实施例中是六十四位或更小)的操作码,整个操作码被写至存储器使得处理器将成功地执行指令。如果操作码大于三十二位(或者在其他实施例中是大于六十四位),那么首先写操作码的“末尾”。通过首先写操作码的末尾,如果处理器在操作码仍在被写的时候执行指令,那么处理器将首先执行调试断点操作码。这允许流故障处理器完成写操作码并使得处理器可以重试该操作码。如果三十二位(或者六十四位)写跨多于一个操作码,那么调试断点操作码被编写成允许重试。如果三十二位(或者六十四位)写已经被写了,那么写入之前的值,在这种情况下操作码保持有效。通过写入由调试断点分隔的经分解的操作码,处理器将或者遇到无效的调试断点或者遇到有效的可执行代码。若应用程序执行无效的调试断点,那么如此处所述的流故障拦截器将在异常被递送到应用程序之前拦截该异常。流故障拦截器等待直到存储器有效,然后重试操作码。流故障拦截器可以使用页和被写的操作码的表来区分作为流故障的一部分而发生、必须被重试的断点或者由调试器或应用程序使用、必须被传回应用程序的断点。在有效可执行代码的情况中,应用程序成功地执行代码。结果是,流故障处理器不需要在递送流故障的结果时挂起进程中的所有线程。图1A-D示出了根据一个实施例的存储器写随时间的排序。在此示例中使用的程序代码包括指令:0xAB0xE90x000xFE0x700x08…。分解器将此代码拆分成以下操作码:(1):0xAB(2):0xE90x000xFE0x700x08(3):....第一个操作码长达一个字节,第二个操作码长达五个字节,且不同长度的其它操作码是以类似的方式标识的。存储器101包括数个三十二位的块102-104。在其他实施例中,存储器块可以是六十四位或某一其他大小。图1A示出了存储器101全部用一个字节的调试断点操作码0xCC填充的原始状态。如果线程在此时从存储器101读取指令,则调试断点操作码将导致流处理器试图将代码加载到存储器101于是线程将重试读取代码。在图1B中,第一个操作码0xAB已经被写至三十二位的块102b。第一个、一个字节长的操作码0xAB用替代第一个0xCC的原子写来写入到存储器101中。写操作需要写三十二位的数据。因为指令在写入存储器之前已经被分解了,写操作跟踪正在写什么字节并知道用0xCC填充块102b剩下的二十四个位以填满整个三十二位的块。如果处理器执行第一个指令0xAB,它将会成功。但是,如果处理器试图在此时执行第二个指令,则调试断点0xCC将被读取并且流故障重试机制将接管。现在流故障处理器需要写第二个操作码(即,0xE90x000xFE0X700x08)。流故障处理器知道前一指令(0xAB)被写了并且知道块102b-104b是怎样被写的。流故障处理器也知道下一操作码是多长和它需要怎样被写至存储器101。特别是,流故障处理器知道第二个、五个字节长的操作码将在操作码0xAB之后被写至块102b和103b。流故障处理器也判断第二个操作码将不能放进单个三十二位块102b的剩余空间中。因而,第二个操作码必须在存储器块102b和103b之间拆分。如图1C中所示,在写操作码的第一部分之前,操作码的第二部分(即,0x700x08)以调试断点0x00补充以填满三十二位而写至块103c。通过首先写操作码的第二部分,如果处理器执行0xAB块之后的操作码,那么处理器将招致调试故障(0xCC)并将不会试图执行垃圾。在操作码的第二部分被写至块103c之后,然后第一部分(即,0xE90x000xFE)可以被写至存储器101。如图1D中所示,此第一部分随第一操作码0xAB写入它之前在块102d中所分配的位置。此时,处理器将能够成功地执行两个指令。将指令写到存储器101的这个过程将被逐操作码地应用直到整个页面常驻。图2示出了根据一个实施例用于流传送无锁可执行代码数据的系统。在操作系统201上运行的应用程序试图从存储器读数据页202。当调用了可执行存储器的非常驻页时,这触发操作系统异常203,该异常通知操作系统201说这个调用失败了。在应用程序看到故障之前,操作系统201向流故障拦截器204发送读失败返回码。流故障拦截器204在它的数据本文档来自技高网...
可执行代码数据的无锁流传送

【技术保护点】
一种计算机实现的方法,包括:接收包括多个操作码的指令,每一个操作码包括一个或多个字节的数据;将所述指令分解成分开的操作码;创建标识每一个操作码之间的边界的表;以及通过原子地写存储器的标准块将每一个操作码以逐操作码的方式写至存储器。

【技术特征摘要】
【国外来华专利技术】2012.07.27 US 13/560,2161.一种计算机实现的方法,包括:接收包括多个操作码的指令,每一个操作码包括一个或多个字节的数据;将所述指令分解成分开的操作码;创建标识每一个操作码之间的边界的表;将调试断点操作码追加到操作码以创建完整的存储器标准块;以及通过原子地写存储器的标准块将每一个操作码以逐操作码的方式写至存储器。2.如权利要求1所述的计算机实现的方法,其特征在于,还包括:将调试断点操作码写至所有存储器位置以初始化所述存储器。3.如权利要求1所述的计算机实现的方法,其特征在于,所述存储器标准块长达三十二位或六十四位。4.如权利要求1所述的计算机实现的方法,其特征在于,还包括:标识何时长操作码将重叠两个或更多的存储器标准块;将所述长操作码的第二部分写至第二存储器块;以及将所述长操作码的第一部分写至第一存储器块。5.如权利要求4所述的计算机实现的方法,其特征在于,还包括:将调试断点操作码追加到所述长操作码的第二部分以创建完整的存储器标准块。...

【专利技术属性】
技术研发人员:K·雷厄森
申请(专利权)人:微软公司
类型:发明
国别省市:美国;US

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

1