缓存行和页
Ⅰ .net带有参数的页面怎么进行缓存,缓存后可浏览正确页面
ASP.NET 提供三种主要形式的缓存:页面缓存、用户控件输出缓存和缓存 API。
页面输出缓存作为最简单的缓存形式,将已经生成的动/静太页面全部内容保存在服务器内容中。当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期。在这个过程中,缓存不再要再次经过页面处理生命周期。这样可以缩短请求响应时间,提高应用程序性能。显然,页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面。
实现页面输出缓存,通常可以用以下两种方法:
一、使用@ OutputCache指令
使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要。@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明。这种方式非常方便,只需几个简单的属性设置,就能够实现页面的输出缓存策略。
二、使用HttpCacheability类
该类主要包含用于设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。与.NET Framework 1.x中的HttpCachePolicy类相比,.NET Framework 2.0中的HttpCachePolicy类得到了扩充和发展。
使用这两种方法,我们可以实现下列功能:
1、使用参数对页的各个版本进行缓存
使用 ASP.NET,您可以根据指定的 HTTP 标头的值对某页的多个版本进行缓存。当请求页时,您可以指定按传递到应用程序的单个标头、多个标头或所有标头进行缓存。
根据 HTTP 标头值以声明方式对某页的各个版本进行缓存
A、 在 ASP.NET 页中,在 @ OutputCache 指令中包括必需的 Duration 和 VaryByParam 或 VaryByControl 属性。必须将 Duration 属性设置为大于零的整数。如果希望只按 HTTP 标头值进行缓存,则必须将 VaryByParam 属性设置为“None”。
B、 在 @ OutputCache 指令中,包含 VaryByHeader 属性,将其值设置为要作为改变缓存内容的依据的 HTTP 标头的名称。
下面的示例将页缓存 60 秒,并根据随 Accept-Language HTTP 标头传递的值设置要缓存的页的版本:
<%@ OutputCache Duration="60" VaryByParam="None" VaryByHeader="Accept-Language" %>
注意:如果要根据多个标头改变缓存的内容,请以分号 (;) 作为分隔符包括标头名称的列表。如果要根据所有标头值改变缓存的内容,请将 VaryByHeader 属性设置为星号 (*)。
根据 HTTP 标头值以编程方式对某页的各个版本进行缓存
A、 在页的 Page_Load 方法中,对页的 Response 对象的 Cache 属性调用 SetCacheability 和 SetExpires 方法。
B、 将 VaryByHeaders 属性中的 HTTP 标头值设置为 true。
下面的代码示例演示如何为有不同的 Accept-Language HTTP 标头值的请求,将某页的多个版本缓存一分钟之久。
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
Response.Cache.VaryByHeaders["Accept-Language"] = true;
}
注意:如果要根据多个标头改变缓存的内容,需要在 VaryByHeaders 属性中设置多个值。如果要根据所有标头改变缓存的内容,请将 VaryByHeaders["VaryByUnspecifiedParameters"] 设置为 true。
2、使用请求浏览器缓存页的各个版本
基于浏览器类型以声明方式缓存页的多个版本
A、 在 ASP.NET 页中,包括一个具有必需的 Duration 以及 VaryByParam 或 VaryByControl 属性的 @ OutputCache 指令。必须将 Duration 属性设置为大于零的整数。如果希望仅按浏览器类型进行缓存,请将 VaryByParam 属性设置为“None”。
B、 在 @ OutputCache 指令中,包括 VaryByCustom 属性并将其设置为“browser”。下面的示例将导致持续缓存该页达 10 秒。输出将因浏览器类型而异。
<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="browser" %>
基于浏览器类型以编程方式缓存页的多个版本
A、 在页代码中,对页的 Response 属性的 Cache 属性调用 SetExpires 和 SetCacheability 方法。
B、 调用 SetVaryByCustom 方法,在 custom 参数中传递值“browser”。
下面的代码示例演示如何持续缓存页的多个版本达 1 分钟。输出将因发出请求的浏览器的类型而异。
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetExpires(DateTime.Now.AddMinutes(1d));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
Response.Cache.SetVaryByCustom("browser");
}
3、 使用自定义字符串对页的各个版本进行缓存
根据自定义字符串对页输出的多个版本进行缓存
A、 在 ASP.NET 页中包括 @ OutputCache 指令,该指令带有必需的 Duration 和 VaryByParam 属性。必须将 Duration 属性设置为大于零的整数。如果不想使用 VaryByParam 属性提供的功能,则必须将其值设置为“无”。
B、 若要以声明方式设置自定义字符串,请在 @ OutputCache 指令中包括 VaryByCustom 属性,并将该属性设置为您要作为进行不同输出缓存行为的依据的字符串。
下面的指令根据自定义字符串“minorversion”改变页输出。
<%@ OutputCache Duration="10" VaryByParam="None" VaryByCustom="minorversion" %>
1. 若要以编程方式设置自定义字符串,请调用 SetVaryByCustom 方法,并将要使用的自定义字符串传递给它。
下面的代码示例演示如何将自定义字符串设置为“minorversion”。
Response.Cache.SetVaryByCustom("minorversion");
在应用程序的 Global.asax 文件中,重写 GetVaryByCustomString 方法以指定自定义字符串的输出缓存行为。
被重写的方法接受您在 VaryByCustom 属性或 SetVaryByCustom 方法中设置的字符串,作为它的 arg 参数。例如,有些页可能根据请求浏览器的次版本进行缓存。对于这些页,可以将 VaryByCustom 属性设置为“minorversion”。然后,在被重写的 GetVaryByCustomString 方法中,可以检查 arg 参数,并根据 arg 参数的值是否为“minorversion”返回不同的字符串。
下面的代码示例演示一个 Global.asax 文件,其中的 GetVaryByCustomString 方法被重写。
<%@ Application language="C#" %>
<script runat="server">
public override string GetVaryByCustomString(HttpContext context,
string arg)
{
if(arg == "minorversion")
{
return "Version=" +
context.Request.Browser.MinorVersion.ToString();
}
else
{
return "";
}
}
</script>
Ⅱ 请教CPU的cache中关于line,block,index等的理解
- cache子系统: 通常按照功能可以分成SRAM, tag RAM, cache controller三部分. 实际设计时, 三部分可以由多个芯片来实现, 也可以合并入单个芯片中.
- SRAM: 静态随机存储器, 与DRAM相对, 是cpu cache中用来承载数据的内存块. SRAM的大小决定了cache的大小.
- tag RAM: 一小片用来存储数据地址的SRAM, cache缓存了哪些主存中的数据, tag RAM中就会存储哪些地址.
- cache controller: 缓存控制器, 主要功能有: 实现snoop和snarf; 更新SRAM和tag RAM; 实现写策略; 确定内存访问请求是否能够被缓存. (并不是所有主存都有缓存需求, 哪些主存区域不需要缓存与设计有关. 例如, PC平台上主存中用于视频显示的内存区域是不需要缓存的); 确定内存访问请求是否命中cache
- 缓存页(cache page): 主存(也就是通常所说的内存, 存储器类型是DRAM)被分成多个大小相等的片段, 每一个片段称为一个cache page. cache page的大小依赖于cpu cache的大小以及cpu cache是如何组织的. 注: 这里的page与分页模式下的内存页没有直接的关系, 是不同的概念.
- 缓存行(cache line): 每一个cache page又被分成更小的片段, 每一个片段称为一个cache line. 通常翻译成缓存线, 而我一般翻译成缓存行. cache line的大小(有时候也称作宽度)取决于cpu以及cache的设计.
- cache的组织结构通常分成三种: 直接映射(direct map)型, 全关联(fully-associative)型, 组关联(set associative)型. 现在流行的英特尔x86_64一般采用的是组关联型cache.
- 全关联(fully-associative): 全关联cache仅仅使用line而不采用page, 主存和cache都被划分成等大的line, 主存中的某一line可以存入任意一cache line中. 全关联cache的优点是性能高, 缺点是实现起来电路复杂, 复杂性源于需要确定被请求的数据是否已经在cache中, 被请求的地址需要与存储在tag RAM中的每一个地址进行比较, 这需要大量的比较器, 从而增加了大容量cache的实现复杂度以及价格. 全关联结构通常仅仅用在小容量cache中, 典型容量不超过4K
-直接映射(direct map): 主存被划分成多个cache page, 每一个cache page的大小等于cache的大小. 仅仅把的一些特定的内存line存入同一个cache line中, 例如把所有page中的line 0存储cache line 0中. page中的cache 1存储在cache line 1中, ...; 直接映射cache是三种cache结构中最简单的一种. 在直接映射cache中被请求的地址只需要与tag RAM中的一个地址相比较. 优点: 由于直接映射cache的简单性, 它的价格也比其它类型的cache便宜很多; 缺点: 灵活性很低, 导致性能也低很多, 尤其是在cache page之间跳转的时候. (考虑page 0和page 1的line 0都映射到cache line 0, 而程序又试图交替访问page 0和page 1中的line 0)
- 组关联(set associative): cache被划分成多个等大小(典型的值是2, 4, 8, 16, ...)的部分, 每一个部分称作是一个 cache way; 而主存则会被划分成多个cache page, 每个cache page的大小等于一个cache way的大小. 然后每一个cache way被当成是一个小的直接映射cache. 由于比较器的数目等于cache way的数目, 因此组关联cache比全关联cache要简单, 价格也比全关联cache便宜. 一个两路组关联cache只需要两个比较器.
有了以上概念就应该比较容易理解一些文章中对cpu cache的描述了。 如果仍然觉得理解有困难, 我们可以再进一步粗略的理解: 把cache看成是一个M行N列的二维表格, 每一个单元格就是一个cache line; 每一行就是一个set, 由横向的N个cache line构成; 每一列就是一个way, 由纵向的M行cache line构成; 当M为1时, 就是全关联cache; 当N为1时, 就是直接映射cache.
没有完全回答你的问题, 不过应该能够辅助你理解你所看的文档了。
Ⅲ 原子操作的实现原理
我们一起来聊一聊在Inter处理器和java里是如何实现原子操作的。
32位IA-32处理器使用基于 对缓存加锁或总线加锁 的方式来实现多处理器之间的原子操作
首先处理器会自动保证基本的内存操作的原子性。 处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。奔腾6和最新的处理器能自动保证单处理器对同一个缓存行里进行16/32/64位的操作是原子的,但是复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。但是处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作的原子性。
第一个机制是通过总线锁保证原子性。 如果多个处理器同时对共享变量进行读改写(i++就是经典的读改写操作)操作,那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致,举个例子:如果i=1,我们进行两次i++操作,我们期望的结果是3,但是有可能结果是2。如下图
处理器使用总线锁就是来解决这个问题的。 所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占使用共享内存。
“缓存锁定”指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不需要在总线上声言LOCK#信号,而是修改内部的内存地址,通过缓存一致性机制保证操作的原子性。
例外:当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行,处理器会调用总线锁定。
在java中可以通过锁和循环CAS的方式来实现原子操作。
CAS
ABA问题
循环时间长开销大
只能保证一个共享变量的原子操作
原子操作的实现原理
聊聊并发(五)原子操作的实现原理
Ⅳ 请教大师,页面读取Access数据库表太多,页面打开速度太慢,怎么解决呢,用缓存行不,怎么用
缓存查询结果把。
application("缓存对象名")=要缓存缓存的内容。
用的时候直接 response.write application("缓存对象名")
如果表里数据量很大,建议改用SQL
Ⅳ 如何使用缓存
缓存是分层次的,下面是计算机缓存山:
cpu缓存策略:
寄存器中计算数据,而数据存储在内存中,由于cpu和内存之间的性能逐渐增大,系统设计者在cpu和内存之间插入了3层的高速缓存。高速缓存有三个层级,就是整个计算机缓存系统的一个小缩影。
Ⅵ 汇编语言显示缓存区的内容怎么显示
首先你要知道,当你把字符对应的ASCII码写入显示缓冲区的时候它就会被屏幕所显示出来。
显示缓冲区一共有8页(这里只用第一页就够了,所以我就提一下)
每页的可以存储2000个字,一个字的高位存放的是需要显示的字符,低位存放的是字符的颜色
也就是说一页最多显示2000个字符了 比如说 0位:41,1位:02 这里41所在的位是0位(偶数位)所以它将被转换成对应的字符显示在屏幕上 而紧跟0位后面的是奇数位(1位),它里面的内容会转换成控制0位字符和背景等颜色信息,以后的都是这样,比如第2位和第3位配对,第4位和第5位配对,第4位是字符信息,第5位就是控制第4位字符信息的颜色。
而每行可以放80个字,也就是80个字符(字符位+颜色位=160个字节),而每页又可以显示25行
我们可以用 行数*160=内存中相对于行数所在的地址(因为一行是160个字节,所以乘以160)
我们可以用 列数*2=内存中相对于列数所在的地址 (因为每行用2个字节分别存放字符和颜色)
如果说用SI存放行数,DI存放列数,而你需要在屏幕的第13行40列显示数据的时候,它的偏移地址就是:si*160+di*2(这个是字符存放的位置),如果你要设置颜色的话 只要向后面偏移一位就可以了:si*160+di*2+1
说了这么多,我来写个具体的给你看看吧,不会的看我写的备注
需要向屏幕的 13行40列显示字符X,颜色为(黑底绿色)
assume cs:code
code segment
start:
mov bx,0b800h
mov es,bx ;用ES段存放显示缓冲区
mov bx,13*160+40*2 ;在编译的时候编译器会帮你计算出显示的偏移地址
mov es:[bx],'X' ;在显示缓冲区的内存中写入字符'X'的ascii码
mov es:[bx+1],2h ;这里向后移一位,控制‘X’的颜色
mov ax,4c00h
int 21h
code ends
end start
回答完毕 QQ544980123 一起交流
Ⅶ 磁盘块 内存页 cache行 三者大小相等吗
三者可以没有任何关系。
磁盘块,格式化时建立的。内存页,操作系统需要考虑的东西。Cache行,操作系统需要考虑的内容。它们可以一样,也可以毫无关系。
Ⅷ 谷歌浏览器怎么查看缓存
谷歌浏览器查看缓存步骤如下:
1、在电脑桌面上面点击Chrome图标,启动浏览器。
Ⅸ 缓存行与伪共享
由于CPU的速度远远大于内存速度,为提高CPU的速度,CPU中加入了缓存(cache),缓存分为三级L1,L2,L3。级别越小越接近CPU, 速度更快, 同时容量越小。每个缓存里面是以缓存行为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节,最常见的缓存行大小是64个字节。
CPU 访问内存时,首先查询 cache 是否已缓存该数据。如果有,则返回数据,无需访问内存;如果不存在,则需把数据从内存中载入 cache,最后返回给CPU。若cache命中率高,这会极大提高性能。
一个long类型占8个字节,8个long类型共64字节可以填充一个缓存行,为使对比明显,建立一个8 * 1000000的long数组,一次顺序存取,一次跳跃存取,对比运行时间:
顺序存取:
运行结果如下:
跳跃存取:
运行结果如下:
在进行了1000万次存取下,差距还是比较明显的。
假设有两个变量X,Y,多线程访问中,运行于CPU1的线程访问X,运行于CPU2的线程访问Y,尽管两个变量之间没有任何关系,但是在线程之间仍然需要同步。比如CPU1的线程改变了X,同一行的Y及时没有更新也会失效,导致CPU2访问Y时缓存无法命中,同理,CPU2对Y的更新也会影响到X,反反复复,影响性能。
为了避免这种情况,一种可行的做法是填充缓存行,使一个缓存行中,只有一个变量实际是有效的。
声明一个对象demo,对象头占8字节,一个long类型占8字节,共16个字节,连续创建4个实例,多半在同一个缓存行中,起四个线程分别对四个实例的value做大量的存取操作查看其运行时间。然后在demo填充6个8字节的long,填满64字节,重新运行查看其运行时间。
未填充运行结果如下:
四个线程互不干扰,运行时间大致相当,均与未填充时第一个启动线程相当。
在Java8中提供了@sun.misc.Contended来避免伪共享,在运行时需要设置JVM启动参数-XX:-RestrictContended
更详细介绍参考: https://www.jianshu.com/p/7f89650367b8
Ⅹ 请高手给我说一下如何解决网页或FLASH的缓存问题
在HTML中加入如下信息
<meta http-equiv="pragram" content="no-cache">
禁止浏览器从本地缓存中调阅页面。
网页不保存在缓存中,每次访问都刷新页面。
<meta http-equiv="cache-control" content="no-cache, must-revalidate">
同上面意思差不多,必须重新加载页面
<meta http-equiv="expires" content="0">
网页在缓存中的过期时间为0,一旦网页过期,必须从服务器上重新订阅。