系统结构期末复习(四)指令级并行

目录

  1. 指令级并行概念
  2. 指令的动态调度和Tomasulo算法
  3. 动态分支预测技术
  4. 多指令流出基础(超标量、超长指令字、超流水
  5. 循环展开和指令调度
重要知识点:
1. 流水线实际CPI
2. 基本程序块
3. 循环级并行
4. 循环展开
5. 数据流
把握要点:
6. 流水线处理的实际CPI和基本程序宽度该奶奶
7. 循环级并行和基本的开发技术
8. 相关与流水线冲突以及解决方法、程序顺序
9. 数据流和异常行为,这里需注意使用并行化技术进行改进,其结果要与串行执行的结果一致

本章研究目的

在流水线思想的基础上进一步扩展,开发出更多的指令集并行

1. 指令级并行的概念(ILP)

  • 指令集并行:指令间存在的潜在并行性。(几乎所有的处理机都利用流水线来使指令重叠并行执行,以达到提高性能的目的。)
  • 开发ILP的方法主要有两种:基于硬件的动态开发方法基于软件的静态开发方法(这两种方法可以混用,动态和静态相结合才能充分的开发程序中潜在的ILP)
  • 流水线处理机的CPI等于理想流水线的CPI加上各类停顿的时钟周期数:
    在这里插入图片描述
    理想CPI是衡量流水线最高性能的一个指标,IPC是每个时钟周期完成的指令条数。
  • 基本程序块:如果一串连续的代码除了入口和出口外,没有其他的分支指令和转入点,则为一个基本程序块(一个程序块中可并行的指令过少,必须跨越多个基本程序块开发ILP)
  • 循环级并行性:开发循环的不同迭代之间存在的并行性【增加指令之间的并行性最简单和最常用的方法】
    1. 每一次循环都可以和其他循环重叠并行执行
    2. 每一次循环内部却是没有任何的并行性可言
  • 循环型并行性转换为ILP的方法:
    1. 循环展开处理
    2. 采用向量指令和向量数据表示
      系统结构期末复习(四)指令级并行_第1张图片
  • 确定程序中指令之间存在什么相关,对于确定程序中有多少并行性以及如何开发这些并行性具有重要意义。
  • 相关是程序固有的一种属性,他反映了程序中指令之间的相互依赖关系。而具体的一次相关是否会导致实际冲突以及该冲突会带来多长时间的停顿,则是流水线的属性。
  • 克服相关限制开发ILP:
    系统结构期末复习(四)指令级并行_第2张图片
  • 程序顺序:由源程序确定的在完全串行方式下指令的执行顺序。(只有在可能影响程序正确性的情况下才保持程序顺序)
  • 对于正确执行程序来说,必须保持的最关键的两个属性:数据流异常行为
    1. 保持异常行为:无论怎么改变指令的执行顺序都不能改变程序中异常的发生情况。(经常被弱化为:指令执行顺序的改变不能导致程序中发生新的异常)
    2. 数据流:数据值从其生产者指令到其消费者指令的实际流动。【分支指令使得数据流具有动态性,因为它使得给定指令的数据可以有多个来源】
    3. 如果能做到保持程序的数据相关和控制相关,就能保持程序的数据流和异常行为。(控制相关的影响不大:原因见教材108页最后一段)
      系统结构期末复习(四)指令级并行_第3张图片
    4. 仅仅保持数据相关性是不够的,因为一条指令有可能数据相关于多条先前指令,所以只有再加上保持控制顺序才能保持程序顺序,知道哪条指令是真正所需数据的生产者。
      系统结构期末复习(四)指令级并行_第4张图片
      通过保持控制相关可以避免对数据流的非法修改,所以DSUBU不能被移到分支指令之前。有时发现不遵守控制相关既不影响异常行为,也不改变数据流,这是就可以大胆地进行指令调度,把失败分支中的指令调度到分支指令之前。
  • 前瞻执行不仅能解决异常问题,而且能够在保持数据流的情况下减少控制相关对开发ILP的影响。

2. 指令的动态调度

系统结构期末复习(四)指令级并行_第5张图片

2.1 动态调度的基本思想

  • 指令顺序执行:
    指令放入流水线的顺序和指令完成的顺序一致
  • 指令乱序执行:
    指令放入流水线的顺序和指令完成的顺序不一致,也就是有些指令进入流水线后呗阻塞,而在其后进入流水线的指令先完成了
  • 简单流水线的局限性:
    其指令是按程序顺序流出和按序执行的。

第一个问题

在这里插入图片描述
在之前的简单流水线中,只有当既没有数据冲突也没有结构冲突的时候才能继续流出指令。
系统结构期末复习(四)指令级并行_第6张图片
不采用定向技术顺序流动,产生数据冲突后,后面的指令被阻塞不动。所以后面从IF开始执行。

如果想要让ADD指令流出,需要进行一些改进:原来数据冲突和结构冲突的检测都在ID段,现在必须把指令流出的工作拆分为两个步骤:【检测结构冲突、等待数据冲突消失】。只要检测到【没有结构冲突】就可以让指令流出,并且流出的指令一旦其操作数就绪即可执行。

现在指令的执行顺序与程序的完成顺序不同,指令的完成也是乱序的。
系统结构期末复习(四)指令级并行_第7张图片
系统结构期末复习(四)指令级并行_第8张图片

第二个问题

在这里插入图片描述
系统结构期末复习(四)指令级并行_第9张图片
指令的动态调度导致了指令的乱序执行,指令的乱序执行导致了有反相关和输出相关的指令进入流水线之后产生了读后写冲突和写后写冲突。

  • 采用动态调度的流水线支持多条指令同时处于执行当中,这是动态调度的一大优点。但这要求具有多个功能部件,或者流水线功能部件,或者两者兼而有之,后面假设具有多个功能部件。
    系统结构期末复习(四)指令级并行_第10张图片

总结

  1. 动态指令调度:相对于静态指令调度,动态指令调度是在指令的执行阶段中进行调度,使得无关的指令得以先执行,减少阻塞。且能够处理一些在编译时情况不太明确的相关(如存储器访问的相关)
  2. 动态指令调度将会引起指令乱序执行,因此使用换名技术消除名相关(包括反相关和输出相关)
  3. 指令乱序完成带来了另一个问题:难以处理异常
  4. 动态调度要保持正确的异常行为(只有那些在程序严格按程序执行时才会发生的异常,才能真正发生)。动态调度的处理机是这样来保持正确的异常行为的:对于一条会发生异常的指令来说,只有当处理机确切的知道该指令被执行后,才允许它发生异常
  5. 不精确异常:当执行指令i导致发生异常时,处理机的现场跟严格按程序顺序执行是指令i的现场不同。反之为精确异常(不精确异常使得在异常处理后难以接着继续执行程序)
  6. 发生不精确异常的原因:流水线可能已经执行完按程序顺序是位于指令i之后的指令;流水线可能还没有完成按程序顺序是指令i之前的指令。

2.2 Tomasulo算法

要点:
1. 核心思想
2. 基本结构
3. 寄存器换名的实现
4. Tomasulo算法的特点
5. 执行步骤

2.2.1 Tomasulo算法的核心思想

  • 记录和检测指令相关,操作数一旦就绪就立即执行(没有就绪则等待),把发生RAW冲突的可能性降到最小。
  • 通过寄存器换名来消除WAB冲突和WAW冲突

2.2.2 基本结构

系统结构期末复习(四)指令级并行_第11张图片

  1. 保留站

    1. 设置在运算部件的入口。浮点加法器的保留站有3 个,浮点乘法器的保留站️ 2个。每个保留站都有一个标识字段,唯一地标识了该保留站。每个保留站中保存一条一斤共流出并等待到本功能部件执行的命令。【内容:操作码、操作数以及用于检测和解决冲突的信息】
    2. 在一条指令流出到保留站的时候,如果该指令的源操作数已经在寄存器中就绪,则将之取到该保留站中;如果该操作数还没有计算出来,则在该保留站中记录将产生这个操作数的保留站的标识。
    3. CDB连接到除了load缓冲器以外的所有部件的入口,浮点寄存器通过一对总线连接到功能部件,并通过CDB连接到store缓冲器的入口。
  2. 公共数据总线CDB.

    1. 一条重要的数据通路
    2. 所有的功能部件的计算结果都是送到CDB上,由它吧这些结果直接播送到各个需要该结果的地方
    3. 在具有多个执行部件且采用多流出(即每个时钟周期流出多条指令)的流水线中,需要用多条CDB
  3. load和store缓冲器

    1. load和store缓冲器中存放的是读/写存储器的数据或地址
    2. load缓冲器的作用:
      a.存放用于计算有效地址的分量
      b.记录正在进行的load访存,等待存储器的响应
      c.保存已经完成了的load结果(即从存储器取来的数据),等待CDB传输
    3. store缓冲器的作用:
      a.存放用于计算有效地址的分量
      b.保存正在进行的store访存的目标地址,该store正在等待存储数据的到达
      c.保存该store的地址和数据,直到存储部件接收
  4. 浮点寄存器

    共有16个浮点寄存器:F0、F2、F4…F30。它们通过一对总线连接到功能部件,并通过CDB连接到store缓冲器。

  5. 指令队列

指令部件送来的指令放入指令队列,指令队列中的指令按先进先出的顺序流出

  1. 运算部件

浮点加法器完成加法和减法,浮点乘法器完成乘法和除法操作

2.2.3 寄存器换名技术

系统结构期末复习(四)指令级并行_第12张图片
寄存器换名是通过保留站和流出逻辑共同完成的。当指令流出时,如果其操作数还没有计算出来,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站的标识。所以指令流出到保留站后,其操作数寄存器号或者换成了数据本身(若已就绪),或者换成了保留站的标识,不再与寄存器有关系。

2.2.4 Tomasulo算法

1. 通过例子来解释Tomasulo算法

系统结构期末复习(四)指令级并行_第13张图片
系统结构期末复习(四)指令级并行_第14张图片

  • Tomasulo算法采用分布的保留站,具有2个特点:
    1. 冲突检测和指令执行控制是分布的。每个功能部件的保留站中的信息决定了什么时候指令可以在该功能部件开始执行。
    2. 计算结果通过CDB直接从产生它的保留站传送到所有需要它的功能部件,不用经过寄存器。
2.指令执行步骤(3步)

A.流出
其实思路都是在错误顺序的写入之前先占个坑

  1. 从指令队列的头部取一条指令。
  2. 如果该指令的操作所要求的保留站有空闲的,就把该指令送到保留站。并且如果其操作数在寄存器中已经就绪,就将这些操作数送入保留站r,如果其操作数还没有就绪,就把将产生该操作数的保留站的标识送入保留站r。这一步实际上进行了寄存器的换名和对操作数进行缓冲,消除了WAR冲突
  3. 另外还要完成对目的寄存器的预约工作,将之设置为接收保留站r的结果。这一步实际上相当于完成了写操作(预约)(提前完成了写操作虽然不知道结果,但是把保留站表示暂时作为结果看待),由于指令是按程序顺序流出的,当出现多条指令写同一个结果寄存器时,最后留下的预约结果肯定是最后一条指令的,消除了WAW冲突系统结构期末复习(四)指令级并行_第15张图片

B.执行
系统结构期末复习(四)指令级并行_第16张图片
load和store指令的执行需要两个步骤:

  1. 计算有效地址(要等到基地址寄存器就绪)
  2. 把有效地址放入load和store缓冲器
    load缓冲器中的load指令的执行条件:存储部件就绪
    store缓冲器中的store指令的执行条件是:执行前必须等到存入存储器的数据到达
    通过按顺序进行有效地址计算来保证程序顺序,这有助于避免访问存储器的冲突。

C.写结果

  • 功能部件计算完毕后,就将计算结果放到CDB上,所有等待该计算结果的寄存器和保留站(包括store缓冲器)都同时从CDB上获得所需要的数据。
  • 保留站、寄存器组和load/store缓冲器都包含附加标志信息,用于检测和消除冲突。不同部件的附加信息略有不同。标识信息实际上就是用于换名的一组虚拟寄存器的名称(编号)。【特殊编号0用于表示寄存器中的操作数就绪。】
  • 在Tomasulo算法中将保留站作为扩展的虚拟寄存器;在别的方法中也可以采用其他的存储单元作为虚拟寄存器,例如采用额外的寄存器或者类似于后面将要介绍的再定序缓冲器结构
    系统结构期末复习(四)指令级并行_第17张图片
3. 举例

系统结构期末复习(四)指令级并行_第18张图片
在这里插入图片描述
在指令进入保留站后会对操作数是否就绪进行检测,就根据寄存器状态表。若就绪直接将浮点寄存器中内容填入操作数。若两个寄存器都就绪可流出,但流出之前还要记得对目标寄存器进行预约,即将该指令所在保留站站号写入寄存器状态表里。

  • 与其他动态调度方法相比,Tomasulo算法具有以下两个主要优点:
    1. 冲突检测逻辑是分布的(通过保留站和CDB实现)。多个地方等待这个结果,可以同时获得。如果使用的是集中的寄存器组,各条指令就要等结果写入寄存器,然后再一次顺序从寄存器组读出。
    2. 消除了WAW和WAR冲突导致的停顿。这是通过使用保留站尽心个寄存器换名,并且在操作数一旦就绪就将之放入保留站来实现的。
4. 具体算法

系统结构期末复习(四)指令级并行_第19张图片
在这里插入图片描述

系统结构期末复习(四)指令级并行_第20张图片
(1)指令流出
【a】浮点运算指令
进入条件:有空闲保留站r
系统结构期末复习(四)指令级并行_第21张图片
【2】load和store
进入条件:缓冲器有空闲单元r
系统结构期末复习(四)指令级并行_第22张图片
系统结构期末复习(四)指令级并行_第23张图片
系统结构期末复习(四)指令级并行_第24张图片
(2)执行
【1】浮点操作指令
在这里插入图片描述
【2】load/store指令
系统结构期末复习(四)指令级并行_第25张图片
(3)写结果
【1】浮点运算指令和load指令
系统结构期末复习(四)指令级并行_第26张图片

【2】store指令
系统结构期末复习(四)指令级并行_第27张图片
Tomasulo算法总结:

  1. 当浮点运算指令流出到一个保留站r时,把该指令的目标寄存器rd的状态表项置为r,以便将来从r接收运算结果(相当于进行了预约或者定向),操作数如果已经准备好直接放在V字段,否则就要等待其他保留站产生操作数(这里如果不是已经清晰了的结果就一定是保留站)。当指令执行完成且CDB就绪,就可以把结果写回,把数据放到CDB上,所有需要数据的部分可以在同一个时钟周期内同时接收该结果(广播)。操作数因此而备齐的指令可以在下一个时钟周期开始执行。
  2. 在Tomasulo算法中,load/store指令的处理和浮点运算指令有些不同,只要load缓冲器有空闲单元,load指令就可以流出。
    系统结构期末复习(四)指令级并行_第28张图片
  3. 该算法对指令的执行有个限制:如果流水线中还有分支指令没有执行,那么当前指令就不能进入“执行”阶段。这是因为在“流出”阶段后,程序顺序就不再被保证了。所以为了保持正常行为,必须加上这个限制。【前瞻执行可以消除限制
    系统结构期末复习(四)指令级并行_第29张图片
  4. 对于多流出的处理机来说,随着流出能力的提高以及设计者们更多地关系难以静态调度的代码的性能,寄存器换名以及动态调度技术就变得越来越重要了。特别地,Tmoasulo算法还是硬件前瞻执行的基础,因此该算法得到了广泛的应用。
  5. 系统结构期末复习(四)指令级并行_第30张图片

3. 动态分支预测技术

当开发的ILP提高时,控制相关就会成为主要的限制因素之一,所开发的ILP越多,控制相关的制约就越大,分支预测就要有更高的准确度。本节方法对于每个时钟周期流出多条指令的处理机来说是非常重要的
在这里插入图片描述

要点:
1. 动态分支预测技术和静态分支预测技术的区别
2. 什么叫“分支指令过去的表现”?
3. 如何衡量分支预测的有效性?
4. 分支预测要解决的问题是什么?
问题解答:
  1. 静态分支检测技术所进行的操作数事先预定好的 ,与分支的实际执行情况无关;动态分支预测的方法在程序运行时根据分支执行过去的表现预测其将来的行为(如果分支行为发生了变化,预测结果也跟着改变,此外有更好的预测准确度和适应性)。
  2. 就是记录分支的历史信息,在预测错误时,要作废已经预取和分析的指令,恢复现场,为了恢复现场,需要在执行预测的目标指令之前将现场保存起来。系统结构期末复习(四)指令级并行_第31张图片
  3. 分支指令的有效性不仅取决于其准确性,而且与正确和不正确两种情况下的分支开销都有密切关系。这些分支开销是由流水线结构、预测的方法和预测错误时的恢复策略等诸因素决定的。
  4. 动态分支预测技术的目的有两个:预测分支是否成功尽快找到分支目标地址(或指令),从而避免控制相关造成的流水线停顿。【需要解决的关键问题:1. 如何记录分支的历史信息 2. 如何根据这些信息来预测分支的去向(甚至取到指令)】系统结构期末复习(四)指令级并行_第32张图片

3.1 采用分支历史表BHT

  • 分支历史表:(分支预测缓冲器)这种方法是最简单的动态分支预测方法。它用BHT来记录分支指令最近一次或几次的执行情况(成功或不成功),并据进行预测。
    为了提高预测的准确度,常采用两位二进制位来记录。
    系统结构期末复习(四)指令级并行_第33张图片
  • 两位分支预测中的操作有两个步骤:分支预测和状态修改(当分支指令到达译码段【ID】时,根据从BHT读出的信息进行分支预测)
  • ==在BHT方法中,只对分支是否成功进行预测,对分支目标地址没有提供支持。==所以只在如下情况有用:判定分支是否成功所需的时间大于确定分支目标地址所需的时间。在前述5段经典流水线中,由于判定分支是否成功和计算目标地址都是在ID段完成,所以BHT方法不会给该流水线带来好处。
  • 一般采用4K的BHT就可以了,BHT可以跟分支指令一起存放在指令Cache中【在取址阶段把历史位一起读出来】,也可以用一块专门的硬件来实现【在取指令的同时用指令地址的地位(低12位)去访问BHT,读出历史位。

3.2 采用分支目标缓冲器BTB

  • 背景:
    在高性能流水线中,特别是多流出的处理机中,只准确地预测分支还不够,还要能够提供足够的指令流。许多现代的处理器要求每个时钟周期能提供4~8条指令。这需要尽早知道分支是否成功尽早知道分支目标地址尽早获得分支目标指令

  • 分支目标缓冲器(BTB)/分支目标Cache(BHT是在ID段进行预测得到分支目标地址,在IF段得到下一条指令的地址,如果能提前1拍(即在IF段)就知道这些信息分支开销就可以减少位0)系统结构期末复习(四)指令级并行_第34张图片

  • BTB的流水线相关操作:
    系统结构期末复习(四)指令级并行_第35张图片
    系统结构期末复习(四)指令级并行_第36张图片

  • 分支指令可能存在3种情况:

    1. 上一次分支成功的指令,在BTB表中会有记录,这次仍预测它是成功的,直接用缓冲的分支目标地址取分支目标指令
    2. 以前没执行过的分支指令,在BTB表中不会有记录,那没办法,咋预测只能随缘,但是如果这次预测成功了,要将该指令的地址和对应的分支目标指令写入BTB
    3. 上次分支指令不成功的指令,同(2)
  • BTB的另一种形式:

    1. 在分支目标缓冲器中存放一条或多条分支目标处的指令。有的实现方案还保留了分支目标地址,有的则将之去掉了。
    2. 这种方案潜在的好处:更快地获得分支目标处的指令;可以一次提供分支目标处的多条指令,这对于多流出处理器是很有必要的;可以进行【分支折叠】 的优化,该优化可以用来实现0⃣️延迟无条件分支,甚至有的时候还可以做到零延迟条件分支。

基于硬件的前瞻执行

要点:
1. 分流出、执行、写结果、确认四个阶段
2. 顺序流出、准备好的先执行,顺序确认
3. 分支预测错误,刷新ROB
4. 异常指令到达ROB头部,刷新ROB
  • Tomasulo算法能够做什么?不能够做什么?
    能做:1. 解决RAW冲突 2. 消除WAW和WAR冲突
    不能做:1. 分支预测 2. 处理异常
  • 背景:
    前瞻执行能够更好的解决控制相关的问题。它对分支指令的结果进行猜测总是对的,然后按照这个猜测结果继续取,流出和执行后续的指令。只是执行指令的结果不是写回寄存器或存储器,而是放到一个称为ROB的缓冲器中,等到相应的指令得到“确认”后,才将结果写入寄存器或存储器。
  • 硬件的前瞻执行是把3种思想结合在了一起:
    1. 动态分支预测。用来选择后续执行的指令
    2. 在控制相关的结果尚未出来之前,前瞻的执行后续指令
    3. 用动态调度对基本块的各种组合进行跨基本块的调度
      系统结构期末复习(四)指令级并行_第37张图片
  • 前瞻执行的重要思想:前瞻执行允许指令乱序执行,但是要求程序顺序确认。并且在指令被确认之前,不允许它进行不可恢复的操作,如更新计算机状态或发生异常。
  • 前瞻执行的基本思路
    1. 顺序流出指令队列
    2. 猜测路径和乱序执行
    3. 顺序确认(保证顺序写回)
    4. 猜错或发生异常,没写回的全部不算数系统结构期末复习(四)指令级并行_第38张图片
      系统结构期末复习(四)指令级并行_第39张图片
  • 前瞻执行机制的具体执行情况:
    系统结构期末复习(四)指令级并行_第40张图片
    产生异常的指令:在该指令到达ROB头部前不处理,到达ROB头部时,产生中断,清空ROB,此操作能够完成精确的异常处理。
    个人认为:但凡刷新ROB,连同指令队列一起刷新,因为假如指令队列中有指令已经是有问题的指令流。

例题

系统结构期末复习(四)指令级并行_第41张图片
首先应该画出当前执行的状态表:
这里可以很明显的看出:虽然后面的指令都已经完成了执行但是没有得到确认,因为确认是需要按照顺序执行的,所以由增加的ROB实现了顺序完成。

  • 由于前瞻执行通过ROB实现了指令的顺序完成,所以它不仅能够进行前瞻执行,而且能够实现精确异常。比如上面的MUL引起异常,先不予理睬,只要等到它到达ROB的头部,再对该异常进行处理,同时清除所有正在执行的指令,这样就实现了精确的异常。
  • 尽管这里是针对浮点的,但可以很容易地推广到整数寄存器和整数功能单元上。实际上前瞻执行对整数程序更有效,因为这些程序中的分支特征更不容易预测(更不容易预测结果的采用动态的预测,随着程序运行进行判断就可以提高准确度)。
  • 基于硬件的前瞻和动态调度相结合,可以做到系统结构相同但实现不同的机器能够使用相同的编译器。
  • 前瞻执行的主要缺点是所需硬件太复杂

4.
  • 人--自私与无私 永夜-极光
                今天上毛概课,老师提出一个问题--人是自私的还是无私的,根源是什么?               从客观的角度来看,人有自私的行为,也有无私的
  • Ubuntu安装NS-3 环境脚本 随便小屋 ubuntu
      将附件下载下来之后解压,将解压后的文件ns3environment.sh复制到下载目录下(其实放在哪里都可以,就是为了和我下面的命令相统一)。输入命令:   sudo ./ns3environment.sh >>result   这样系统就自动安装ns3的环境,运行的结果在result文件中,如果提示     com
  • 创业的简单感受 aijuans 创业的简单感受
           2009年11月9日我进入a公司实习,2012年4月26日,我离开a公司,开始自己的创业之旅。      今天是2012年5月30日,我忽然很想谈谈自己创业一个月的感受。 当初离开边锋时,我就对自己说:“自己选择的路,就是跪着也要把他走完”,我也做好了心理准备,准备迎接一次次的困难。我这次走出来,不管成败
  • 如何经营自己的独立人脉 aoyouzi 如何经营自己的独立人脉
    独立人脉不是父母、亲戚的人脉,而是自己主动投入构造的人脉圈。“放长线,钓大鱼”,先行投入才能产生后续产出。   现在几乎做所有的事情都需要人脉。以银行柜员为例,需要拉储户,而其本质就是社会人脉,就是社交!很多人都说,人脉我不行,因为我爸不行、我妈不行、我姨不行、我舅不行……我谁谁谁都不行,怎么能建立人脉?我这里说的人脉,是你的独立人脉。   以一个普通的银行柜员
  • JSP基础 百合不是茶 jsp注释隐式对象
      1,JSP语句的声明 <%! 声明 %>    声明:这个就是提供java代码声明变量、方法等的场所。 表达式 <%= 表达式 %>    这个相当于赋值,可以在页面上显示表达式的结果, 程序代码段/小型指令 <% 程序代码片段 %>   2,JSP的注释   <!-- -->
  • web.xml之session-config、mime-mapping bijian1013 javaweb.xmlservletsession-configmime-mapping
    session-config 1.定义: <session-config> <session-timeout>20</session-timeout> </session-config> 2.作用:用于定义整个WEB站点session的有效期限,单位是分钟。   mime-mapping 1.定义: <mime-m
  • 互联网开放平台(1) Bill_chen 互联网qq新浪微博百度腾讯
    现在各互联网公司都推出了自己的开放平台供用户创造自己的应用,互联网的开放技术欣欣向荣,自己总结如下: 1.淘宝开放平台(TOP) 网址:http://open.taobao.com/ 依赖淘宝强大的电子商务数据,将淘宝内部业务数据作为API开放出去,同时将外部ISV的应用引入进来。 目前TOP的三条主线: TOP访问网站:open.taobao.com ISV后台:my.open.ta
  • 【MongoDB学习笔记九】MongoDB索引 bit1129 mongodb
    索引 可以在任意列上建立索引 索引的构造和使用与传统关系型数据库几乎一样,适用于Oracle的索引优化技巧也适用于Mongodb 使用索引可以加快查询,但同时会降低修改,插入等的性能 内嵌文档照样可以建立使用索引 测试数据     var p1 = { "name":"Jack", "age&q
  • JDBC常用API之外的总结 白糖_ jdbc
    做JAVA的人玩JDBC肯定已经很熟练了,像DriverManager、Connection、ResultSet、Statement这些基本类大家肯定很常用啦,我不赘述那些诸如注册JDBC驱动、创建连接、获取数据集的API了,在这我介绍一些写框架时常用的API,大家共同学习吧。     ResultSetMetaData获取ResultSet对象的元数据信息
  • apache VelocityEngine使用记录 bozch VelocityEngine
    VelocityEngine是一个模板引擎,能够基于模板生成指定的文件代码。   使用方法如下:     VelocityEngine engine = new VelocityEngine();// 定义模板引擎     Properties properties = new Properties();// 模板引擎属
  • 编程之美-快速找出故障机器 bylijinnan 编程之美
    package beautyOfCoding; import java.util.Arrays; public class TheLostID { /*编程之美 假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿以下且ID是小于10亿的整数,假设每份数据保存两个备份,这样就有两个机器存储了同样的数据。 1.假设在某个时间得到一个数据文件ID的列表,是
  • 关于Java中redirect与forward的区别 chenbowen00 javaservlet
    在Servlet中两种实现: forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request, response); redirect方式:response.sendRedirect(“/somePage.jsp”); forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知
  • [信号与系统]人体最关键的两个信号节点 comsci 系统
            如果把人体看做是一个带生物磁场的导体,那么这个导体有两个很重要的节点,第一个在头部,中医的名称叫做 百汇穴, 另外一个节点在腰部,中医的名称叫做 命门         如果要保护自己的脑部磁场不受到外界有害信号的攻击,最简单的
  • oracle 存储过程执行权限 daizj oracle存储过程权限执行者调用者
    在数据库系统中存储过程是必不可少的利器,存储过程是预先编译好的为实现一个复杂功能的一段Sql语句集合。它的优点我就不多说了,说一下我碰到的问题吧。我在项目开发的过程中需要用存储过程来实现一个功能,其中涉及到判断一张表是否已经建立,没有建立就由存储过程来建立这张表。 CREATE OR REPLACE PROCEDURE TestProc  IS    fla
  • 为mysql数据库建立索引 dengkane mysql性能索引
    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些开发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头。  最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。
  • 学习C语言常见误区 如何看懂一个程序 如何掌握一个程序以及几个小题目示例 dcj3sjt126com c算法
    如果看懂一个程序,分三步   1、流程   2、每个语句的功能   3、试数   如何学习一些小算法的程序 尝试自己去编程解决它,大部分人都自己无法解决 如果解决不了就看答案 关键是把答案看懂,这个是要花很大的精力,也是我们学习的重点 看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的含义 照着答案去敲 调试错误
  • centos6.3安装php5.4报错 dcj3sjt126com centos6
    报错内容如下: Resolving Dependencies --> Running transaction check ---> Package php54w.x86_64 0:5.4.38-1.w6 will be installed --> Processing Dependency: php54w-common(x86-64) = 5.4.38-1.w6 for
  • JSONP请求 flyer0126 jsonp
          使用jsonp不能发起POST请求。 It is not possible to make a JSONP POST request. JSONP works by creating a <script> tag that executes Javascript from a different domain; it is not pos
  • Spring Security(03)——核心类简介 234390216 Authentication
    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和AuthenticationProvider 1.3.1  &nb
  • 在CentOS上部署JAVA服务 java--hhf javajdkcentosJava服务
        本文将介绍如何在CentOS上运行Java Web服务,其中将包括如何搭建JAVA运行环境、如何开启端口号、如何使得服务在命令执行窗口关闭后依旧运行     第一步:卸载旧Linux自带的JDK ①查看本机JDK版本 java -version    结果如下 java version "1.6.0"
  • oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date] ldzyz007 oraclemysqlSQL Server
    oracle                                &n
  • 记Protocol Oriented Programming in Swift of WWDC 2015 ningandjin protocolWWDC 2015Swift2.0
    其实最先朋友让我就这个题目写篇文章的时候,我是拒绝的,因为觉得苹果就是在炒冷饭, 把已经流行了数十年的OOP中的“面向接口编程”还拿来讲,看完整个Session之后呢,虽然还是觉得在炒冷饭,但是毕竟还是加了蛋的,有些东西还是值得说说的。 通常谈到面向接口编程,其主要作用是把系统设计和具体实现分离开,让系统的每个部分都可以在不影响别的部分的情况下,改变自身的具体实现。接口的设计就反映了系统
  • 搭建 CentOS 6 服务器(15) - Keepalived、HAProxy、LVS rensanning keepalived
    (一)Keepalived (1)安装 # cd /usr/local/src # wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz # tar zxvf keepalived-1.2.15.tar.gz # cd keepalived-1.2.15 # ./configure # make &a
  • ORACLE数据库SCN和时间的互相转换 tomcat_oracle oraclesql
    SCN(System Change Number 简称 SCN)是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字,可以理解成ORACLE数据库的时间戳,从ORACLE 10G开始,提供了函数可以实现SCN和时间进行相互转换;    用途:在进行数据库的还原和利用数据库的闪回功能时,进行SCN和时间的转换就变的非常必要了;    操作方法:   1、通过dbms_f
  • Spring MVC 方法注解拦截器 xp9802 spring mvc
    应用场景,在方法级别对本次调用进行鉴权,如api接口中有个用户唯一标示accessToken,对于有accessToken的每次请求可以在方法加一个拦截器,获得本次请求的用户,存放到request或者session域。 python中,之前在python flask中可以使用装饰器来对方法进行预处理,进行权限处理 先看一个实例,使用@access_required拦截: ?