NET面试题:多线程程序在操作系统里是并行执行的吗
编写多线程的程序,大部分情况下是希望得到并行处理带来的高效率。那在操作系统层面上多个线程的运行是否真的是并行运行的呢?这样的问题在.NET面试中也时常会出现,旨在考查应聘者关于操作系统中线程调度的基本知识。
  所涉及的知识点
· 线程调度的概念
· 多处理器系统的特点
  分析问题
1.线程调度
回顾计算机系统发展的历史,在早期的操作系统之上,应用程序的执行完全不存在并行的概念。所有的应用都排队等候在一个单线程的队列之中,每个程序都必须等到前面的程序都安全地执行完毕后才能获得执行的权利,一个小的错误将会导致操作系统上所有程序的阻塞。在后来的操作系统中,逐渐产生了分时和进程、线程的概念。
多个线程受到操作系统的调度控制,以决定何时运行哪个线程。所谓的线程调度,是指操作系统决定如何安排线程执行顺序的算法。按照常规的分类,线程调度可分为抢占式调度和非抢占式调度两种方法。
1)抢占式调度
抢占式调度是指每个线程都只有极少的运行时间(在Windows NT内核模式下这个时间不会超过20ms),而当时间用完时该线程就会被强制暂停,保存上下文并把运行权利交给下一个线程,这样调度的结果就是所有的线程都在被快速地切换运行,使得使用者感觉所有的线程在并行运行。
2)非抢占式调度
非抢占式调度是指某个线程在运行时不会被操作系统强制暂停,它可以持续地运行直至运行告一段落并主动地交出运行权。在这样的调度模式之下,线程的运行就完全是单队列的,并且可能产生恶意程序长期霸占运行权的情况。
现在很多的操作系统,包括微软公司的Windows系统,都同时采用抢占式和非抢占式模式。对于那些优先级相当高的线程,操作系统采用非抢占式来给予充分的时间运行,而对于普通的线程,则采用抢占式模式来快速地切换执行。
2.线程的并行问题
在单CPU单核的系统架构之上,线程的并行运行完全是使用者的主观体验,事实上在任一时刻只可能存在一个处于运行状态的线程。但在多CPU或多核的架构上,情况则略有不同。多CPU多核的架构允许操作系统完全并行地运行两个或多个无其他资源争用的线程,理论上这样的架构可以使运行性能整数倍地提高。
微软公司曾经提出过超线程的技术,简单来说这是一种逻辑上模拟多CPU的技术,但实际上它们却共享物理处理器和缓存。超线程对性能的提高相当有限。
  答案
在单CPU的计算机架构上,任何时候只可能存在一个运行的线程,操作系统通过快速的调度轮换使使用者感觉到多线程在同时执行。而在多CPU的架构上,则可能存在完全并行运行的线程,这取决于线程之间是否争用了其他的资源
 

更多.net面试题,.net电子书,.net视频,请参考"爱学网izixue"