Part V Threading

25 Thread Basics 

 

在这个章节,我会介绍一些关于线程的基础,包括他们的概念和用处。我还会解释为什么微软创造线程、CPU趋势、CLR线程和windows线程的关系、使用线程的开销、windows是如何安排线程的、微软.NET框架类中线程的属性等等。

 

这本书的第五部分,“线程”将想你讲述windowsCLR是如何一起工作来提供一个线程架构的。我希望在你读完这章的时候,你能够通过学到的知识使用线程高效的构建你的程序。

 

25.1 Why Does Windows Support Threads? 为什么Windows支持线程

 

追溯到很久以前,操作系统是没有提供线程这个概念的。实际上,整个系统只有一个线程,包括操作系统代码和应用程序代码。一个线程的问题就是如果一个花费时间很长的任务会阻止其他任务的运行。比如,在16windows 的年代,为了打印一个文件而占用了整台机器是十分常见的,导致OS和其他应用程序停止响应。而且有时候应用程序里如果有bug,会导致无限循环从而机器就无法操作了。

 

基于这个原因,终端用户没有办法只能重新启动电脑。当然,用户是不喜欢这样的,因为所有正在运行的应用程序停止了;更重要的,这些应用程序中正在处理的数据都被抛出内存和丢失。微软知道,要在电脑行业处于领先地位,16 Windows 还不够好,因此他们的目标是构建一个新的操作系统,以满足企业和个人的需要。这个新的操作系统,必须稳健,可靠,可扩展,安全,它必须提高16Windows的许多不足之处。这个操作系统内核原本在Microsoft Windows NT 中附带。多年来,这个内核已经有许多的调整,并添加了很多功能。这个最新版本的内核附带在微软客户端和服务器的Windows操作系统的最新版本。

 

当微软设计这个操作系统的内核,他们决定在所谓的进程(process)运行每一个应用实例。进程是由一个应用程序的一个实例要使用的资源的集合。每个进程都有一个虚拟地址空间,确保代码和一个进程使用的数据是无法访问另一个进程。这使得应用程序实例健壮,因为一个进程不能破坏被另一个进程使用的代码或数据。此外,进程是无法访问操作系统的内核代码和数据的,因此,它不可能对应用程序代码破坏操作系统代码或数据。所以,现在,应用程序代码不能破坏其他应用程序或操作系统本身,整个计算体验,是为最终用户提供更好的多。此外,该系统更安全,因为应用程序代码不能访问另一应用程序或操作系统本身的用户名,密码,信用卡信息或其他敏感信息。

 

这很好,但CPU本身呢?如果一个应用程序进入一个无限循环该怎么办?如果只有一个CPU的机器中,然后它执行的无限循环,不能执行其他任何东西,因此,尽管数据无法被损坏,更安全,系统仍然可恩那个停止响应。微软需要解决这个问题,问题的答案就是线程。作为一个Windows的概念,其任务是虚拟化CPUWindows为每个进程中提供线程自己专有的线程(这功能类似于一个CPU,姑且当作一个逻辑CPU),如果应用程序代码进入一个无限循环,那么与之相关的代码就会被冻结,但其他进程(其中有他们自己的线程)不冻结,他们继续运行!