第25章 线程处理(1)

25.1 Windows为什么要支持线程

进程:

Microsoft设计Windows NT内核时,它们决定在一个进程(process)中进行应用程序的每个实例。进程不过是应用程序的一个实例要使用的资源的一个集合。

1. 每个进程都被赋予了一个虚拟地址空间,确保一个进程使用的代码和数据无法由另一个进程访问。这就确保了应用程序的实例的健壮性,因为一个进程无法破坏另一个进程使用的代码或数据。(进程之间相互独立,互不访问)

2. OS的内核代码和数据是进程访问不到的;所以应用程序代码破坏不了操作系统代码或数据。

线程:

线程(thread)的职责是对CPU进行虚拟化。Windows为每个进程都提供了该进程专用的线程(功能相当于一个CPU,可将线程理解成一个逻辑CPU)。如果应用程序的代码进入无限循环,与那个代码关联的进程会“冻结”,但其他进程(他们有自己的进程)不会冻结;它们会继续执行!

25.2 线程开销

windows在系统中的所有线程(逻辑CPU)之间共享物理CPU。

在任何给定的时刻,windows只将一个线程分配给一个CPU。那个线程允许运行一个“时间片”(有时也称为“量”或者"量程",即quantum)。一旦时间片到期,windows就上下文切换到另一个线程。(OS的上下文切换)

如果要构建高性能的应用程序和组件,就应该尽可能地避免上下文切换。

一个时间片结束时,如果windows决定再次调度同一个线程(而不是切换到另一个线程),那么windows不会执行上下文切换。相反,线程将继续运行。这能显著改善性能。

执行垃圾回收时,CLR必须挂起(暂停)所有线程,遍历它们的栈来查找根以便对堆中的对象进行标记,再次遍历它们的栈,再恢复所有线程。所以,减少线程的数量也会显著提升垃圾回收器的性能。每次使用一个调试器并遇到一个断点,Windows都会挂起正在调试的应用程序中的所有线程,并在单步执行或者运行应用程序时恢复所有线程。因此,你用的线程越多,调试体验也就越差。

必须尽可能地避免使用线程,因为它们要耗用大量内存,而且需要相当多的时间来创建、销毁和管理。Windows在线程之间进行上下文切换,以及在发生垃圾回收的时候,也会浪费掉不少时间。

有时必须使用线程,因为他们使windows变得更健壮,反应更灵敏。

安装了多个CPU(或者一个多核CPU)的计算机可以真正同时运行几个线程,这提升了应用程序的可伸缩性(在少量时间里做更多工作的能力)。Windows为每个CPU内核都分配了一个线程,每个内核都自己执行到其他线程的上下文切换。Windows确保单个线程不会同时在多个内核上调度,因为这会带来巨大的混乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值