zoukankan      html  css  js  c++  java
  • CLR_via_C#.3rd 翻译[25.3 停止疯狂 ]

    25.3 Stop the Madness 停止疯狂

     

    如果非常在意原始性能,那个一台机器上最好的线程数就是这台机子上CPU的数量。所以,单核的机子就只有一个线程,双核的机子两个线程,以此类推。原因很明显:如果你的线程比CPU的数量多,那么上下文切换就会被创建并使性能变差。如果每个CPU只有一个线程,那么就不存在上下文切换,而且线程会全速运行。

     

    然而,微软在设计windows 的时候,更侧重于可靠性和响应能力,而非侧重原是速度和性能。我喜欢这种决定:如果今天的应用程序仍然能“停止、冻结”OS和其他应用程序,那么应该没人会愿意使用windows或者.NET框架。因此,windows 为每个进程提供了该进程专用的线程来增强系统的可靠性和响应能力。比如,在我的机子上,当我运行“任务管理器”,并选择“性能”选项卡,会看到图25-1所示的结果。

     

     

     

    看来我的机子上正在运行60个进程,所以我们可以想象我的机子上至少运行着60个线程,因为每个进程都至少有一个线程。但是“任务管理器”显示我的机器实际上有811个线程!这意味着仅仅为线程,栈就要分配811M的内存,而我的机子总共才2GB RAM。这也意味着每个进程平均有大约13.5个线程。

     

    现在再来看看“CPU使用率”的读数:25%。如果你想要知道哪些进程最浪费,请单击“进程”标签,添加“线程数”列,再按降序对这个列进行排序,如图25-2所示

     

    就像你看到的那样,wps创建了27个线程,使用着7%CPU

     

    当开发者学习windows 的时候,会认识到windows中的一个进程是十分昂贵的。创建一个进程通常要花几秒钟的时间,必须分配大量内存,这些内存必须初始化,EXEDLL文件要从磁盘上加载,等等。相对的,在windows上创建一个线程是十分廉价的,所以开发者不再创建进程,而是用线程来代替。所以,这也是为什么你会看到这么多线程。但是尽管线程比进程廉价,但是相对于其他的系统资源,它还是很昂贵的,所以还是应该省着用,而且要用得适当。

     

    毫无疑问,刚才讨论的所有这些应用程序都在以一种低效的方式使用线程。所有这些线程在系统中都没有存在的必要。在应用程序中分配资源是十分正常的事情,但是分配了又不用,这算是什么呢?这是浪费,分配所有的内存到线程栈上意味着一些更重要的数据(比如用户的文档)获得的内存变少了。

     

    想像一下更糟糕的情况,如果这些进程在一个用户的“远程桌面服务”会话中进行,而且这台机器有100个用户在访问,那么会发生什么?在这种情况下,将会有100wps的实例,每个实例都创建27个什么都不干的线程。这2700个什么都不做的线程都有自己的内核对象、TEB、用户模式栈、内核模式栈等等。由此浪费的资源将非常可观。在本书接下来的章节中,将讲述如何正确设置一个应用程序,以一种高效的方式使用尽量少的线程。

     

    必须承认,今天系统中的大多数线程都是由本地代码创建的。所以,线程的用户模式栈仅仅是保留地址空间,而且栈似乎没有完全提交来使用物理存储。然而,随着越来越多的应用程序会被托管,还托管着自身的组件。然后越来越多的栈会完全提交,直到分配完完整的1MB物理内存。无论如何,即便抛开用户模式栈不谈,所有线程也仍然会分配到一个内核对象、内核模式栈以及其他资源。

     

    这种觉得线程廉价便随便创建线程的趋势必须遏制;线程并不廉价——相反,它们很“贵”,要合理的使用它们。

  • 相关阅读:
    [Canvas]RPG游戏雏形 (地图加载,英雄出现并移动)
    [Canvas]计时表/秒表
    [Canvas]新版箴言钟表
    [Canvas]用透明PNG图在背景上画前景能不遮挡背景
    [Canvas]动态背景
    [Canvas]更多的球
    [Canvas]碰撞球 增加小球间碰撞检测
    [Canvas]碰撞球
    [Canvas]越来越近的女孩
    [Canvas]走近的女孩
  • 原文地址:https://www.cnblogs.com/TivonStone/p/1816956.html
Copyright © 2011-2022 走看看