.NET相关问题:错误共享2011-11-14 msdn Huseyin Yildi……除非您一直与世隔绝,否则肯定听说过“多核转换”。处理器制造商 Intel 和 AMD 正在 通过增加处理器的内核数来提高硬件性能,而非一味地试图继续提高指数级增长的时钟速度。这种转换对 软件开发人员提出了新的要求,他们必须开始考虑以并发方式编写所有应用程序,以便能够从这些显著提 升的计算性能中受益。为了因应这一挑战,许多并发库和语言陆续问世,其中包括针对 Microsoft .NET Framework 的并行 扩展、并行模式库 (PPL)、并发和协调运行库 (CCR)、Intel 的线程构建块 (TBB) 等。这些库都旨在通 过提供 Parallel.For 和 AsParallel 等结构来减少编写高效并行应用程序所需的样板代码数量。遗憾的 是,尽管这些结构代表了在并行表达方面所取得的巨大进步,但它们却无法从根本上解决开发人员所面临 的诸多问题,例如必须了解代码的执行情况、代码的构建方式以及硬件对应用程序的性能究竟有何重要影 响等。尽管软件行业为处理并发问题而专门开发的编程模型有了长足发展,但似乎并没有哪种编 程模型能够在不久的将来神奇般地消除所有与并发相关的问题。至少在最近一段时期内,了解内存和缓存 的工作原理还是相当重要的,因为只有这样才能编写出高效的并行程序。完全归结为硬件当然,了解某个应用程序的底层正在发生什么业已不是新概念了。为达到最佳性能,开发人员需要深入了 解诸如内存访问等过程会对应用程序的性能产生哪些影响。当我们谈及内存的读取和写入时,通 常会忽略这一实事,即目前的硬件已很少会直接读取或写入计算机的内存条。内存访问过慢 - 数量级慢 于数学计算(尽管要比访问硬盘和网络资源快很多)。为解决这种内存访问较慢的问题,目前大 多数处理器都使用内存缓存来改进应用程序的性能。缓存可分为多个级别,大多数消费级计算机都至少有 两个级别(被称为 L1 和 L2),某些计算机的级别会更多。L1 级别最快,但也最昂贵,因此通常计算机 只含有少量此类缓存(我们编写此专栏所使用的便携式计算机的 L1 缓存为 128KB)。L2 稍微慢一些, 但较为便宜,因此计算机中的此类缓存要略多一些(上面提到的便携式计算机的 L2 缓存为 2MB)。从内存中读取数据时,会将请求的数据以及它周围的数据(称为缓存行)从内存加载到缓存,然 后缓存再将数据提供给程序。这种加载整个缓存行(而不是单个字节)的做法可明显改进应用程序的性能 。在我们的便携式计算机上,L1 和 L2 的缓存行均为 64 字节。由于应用程序经常需要连续读取内存中 的字节(常见于访问数组及类似对象),应用程序可通过加载缓存行中的一系列数据来避免在每次请求时 都命中主内存,因为很可能要读取的数据已被加载到缓存中。但是,这将意味着开发人员必须了解应用程 序访问内存的方式,只有这样才能最大限度地发挥缓存的作用。