敬业的IT人 >> 编程开发 >> C/C++ >> Visual C++优化对大型数据集合的并发访问

Visual C++优化对大型数据集合的并发访问

敬业的IT人 互联网 佚名 2008-1-3 20:12:03

本文示例源代码下载

  摘要 应用程序性能不仅仅与速度有关。在 Web服务器环境中,卓越的性能还意味着确保可以并发地为最大数量的用户服务。这可以通过高效地使用多处理器计算机和线程管理来达到。本文介绍了可以解决许多并发性问题的技术。一种方法是使用线程管理,在线程基础上控制对数据库的访问— 这可以保护数据的完整性。在本文中,生成并提供了可重用的线程类。然后,对这些类进行了测试,并在实际环境中分析了它们的性能。

  服务器应用程序的成功与否迟早将归结为性能。但是,服务器应用程序中的性能不完全等同于纯粹的速度。您还必须考虑并发性 — 即您能够同时为多少个客户端提供服务。实际上,对于服务器而言,并发性通常要比纯速度更为重要,尤其是对带有许多 CPU的高端硬件而言。具有低并发性的服务器应用程序只是无法利用多个 CPU(无论该应用程序有多么快)。

  我不知道是否有简单明了的用于优化并发性的处方,但多年以来,我已经形成了大量能够提供巨大帮助的窍门。其中一个窍门可以很好地同步对大型集合中的对象的访问,而不会牺牲并发性。本文将演示我的技巧。首先,我将说明一个小型多线程示例程序,该程序演示了并发访问大型集合中的对象的需要。然后,我将开发一个能够解决该问题的可重用类,并且将比较得到的性能数值。作为一项附加的好处,该示例程序将包含一组便于使用的、用于创建和同步线程的类(当然是可重用的)。

  示例代码可在 Windows98 Secborder="0" alt="Visual C++优化对大型数据集合的并发访问(图一)" width="257" height="176" />

  • 如何重装xp系统图解
  • 下载Flash播放插件
  • 巧妙清除Windows 2000/XP登录密码
  • 如何利用路由器设置局域网
  • QQ空间打不开
  • 开机后鼠标不动怎么办
  • Excel密码保护的解除方法与解除原理
  • Windows XP注册表详解
  • 3dmax不锈钢金属材质的制作方法
  • 硬盘变成raw格式怎么办

  图 14 单 CPU 计算机上的结果

  使用单个临界区时,随着线程数目的增加,用于执行固定次数迭代的时间显著增加。这是因为单个临界区使得线程过于频繁地进行上下文切换,并且 CPU 花费过多的时间在内核模式下执行上下文切换代码。

  您可以在 Windows NT或 Windows 2000 上通过 Performance Mborder="0" alt="Visual C++优化对大型数据集合的并发访问(图二)" width="258" height="176" />

  • 如何重装xp系统图解
  • 下载Flash播放插件
  • 巧妙清除Windows 2000/XP登录密码
  • 如何利用路由器设置局域网
  • QQ空间打不开
  • 开机后鼠标不动怎么办
  • Excel密码保护的解除方法与解除原理
  • Windows XP注册表详解
  • 3dmax不锈钢金属材质的制作方法
  • 硬盘变成raw格式怎么办

  图 15 多 CPU计算机上的结果

  四 CPU 计算机上的结果更加令人吃惊(参见图 15)。使用单个临界区时的趋势在最初因为线程数从一个增加为两个而增加以后,变得相当稳定。请注意此处与单 CPU 计算机上的单个临界区情形完全不同的行为。四 CPU 计算机无须疲于应付上下文切换的原因在于,在多 CPU 计算机上,临界区具有一个“旋转计数”。这意味着当一个线程试图获取已经锁定的临界区时,该线程将在循环中“旋转”一会儿,检查该锁是否已被释放,然后进入休眠状态。这是有利的,因为休眠会导致上下文切换,其代价要比浪费在旋转上的周期更大。

  使用临界区表时,随着您使用的线程数从一个增加到四个,执行时间会急剧下降(70% 以上)。这表明全部四个 CPU 正在并行工作,以获得最佳的并发性。(实际上,理论上的最佳并发性将显示执行时间下降 75%,但完全按线性比例下降是很罕见的。)请注意,随着您使用的线程数超过四个,性能将会因为上下文切换更为频繁而下降。这表明了使用 I/O 完成端口以使正在运行的线程数非常接近 CPU 个数的重要性。

小结

  本文介绍的用于提高并发性的技术具有许多应用。我首先在一个服务器应用程序上设计了这一技术,该应用程序使用 C++ 智能指针并通过引用计数对象实现了垃圾回收。我用临界区表保护了该引用计数。(您可能认为我可以使用 InterlockedXxx 系列函数达到这一目的,但是将引用计数递减到零以及删除该对象的操作必须是需要临界区的原子操作。)

  还可以使用临界区表来克服 CD 示例中数据库的一个主要局限,即无法以线程安全且具有高度并发性的方式在该数据库中添加或删除项。创建具有高度并发性的集合是一项艰难的任务,并且超出了本文的范围,但在我已经发现的问题的一个解决方案中,临界区表是一个重要的组件。

  我希望您将在自己的服务器应用程序中找到这一技术的用武之地。如果您确实这样做了,那么我非常愿意了解相关情况。

本文地址:进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com