进程和线程都是操作系统的概念。进程是指装入内存中正在执行的应用程序,它包括私有的虚拟地址空间、代码、数据、动态分配的内存、文件句柄等操作系统资源。进程就是应用程序的一个正在运行的实例,例如一个正在运行的字处理软件Word就是一个进程;而线程是操作系统分配处理器的最基本单元,线程隶属于进程,是进程之内独立执行的一个单元。线程可以执行进程代码的任何部分(当然那些被称之为原子的操作除外),包括那些正在被其它线程所执行的代码。一个进程可以包括多个在进程上下文中运行的线程,同一个进程的多个线程共享该进程的资源和操作系统分配给该进程的内存空间。具体地说,有该进程的静态变量、动态变量、可执行的代码段等,每个线程也有自己独有的一些资源,如堆栈、线程在堆栈中定义的静态变量和堆栈上的动态变量、CPU寄存器的状态等等。每个多线程的进程必有一个主线程。该进程中的其它线程都是由主线程所创建的。当操作系统载入WinMain()函数时,主线程便被激活。编程者可以将同一个进程中各个独立的线程看作是同时运行的。实际上操作系统的调度程序根据特定的规则将各个线程调入CPU中执行,这一切都是系统自动完成的,不需要编程者进行干预。
对于用户而言,一个多线程应用程序(以三个线程为例)的执行如图5-4所示。
上述各个线程对用户而言,的确好像是同时运行的。经过一段时间(并且可能对用户而言还是比较短)后,各个线程的都被执行了,好像在任一时刻,各个线程同时占用CPU资源。实际上,处理器是一种独占资源,在同一时刻,只能有一段代码被CPU执行。同一进程的各个线程实际上是在共同分享CPU时间片,处理器时间的分配是由系统专门的调度程序自动完成的。由于目前CPU的处理速度比较快,调度程序将CPU时间在各个线程之间很快地轮换。经过一段时间后,每个线程都被分配到CPU的处理时间,每个线程都向前执行了,这个过程可以用图5-5表示。
图5-4 多线程程序的执行示意图(www.xing528.com)
图5-5 时间分配示意
在图5-5中,三个线程A、B和C分享CPU的处理时间,实线长度表示各线程占用的处理器时间,虚线表示处理器花在线程调度上面的额外时间。经过一段时间后,线程都向前执行了,但由于处理器在多个线程之间快速地切换,故同一进程的多个线程在一段时间后都有了进展,并且在应用程序用户看来各个线程是并行执行的,至少在感觉上是如此。通过多线程,应用程序可以更充分利用CPU资源,但是如果线程开得过多,系统将会增加许多额外开销,即图5-5中的虚线长度所占比例会愈来愈大,这样许多宝贵的CPU时间就花在了各个线程间的切换上面去了,反而降低了CPU的使用效率;现在多数计算机都是单处理器(CPU)的,在这种机器上运行多线程程序,试想如果两个非常活跃的线程为了抢夺对CPU的控制权,则在线程切换中会消耗很多的CPU资源,但对于大部分时间被阻塞的线程(例如等待文件I/O操作),则可用一个单独的线程来完成。这样,就可将CPU时间让出来,使程序获得更好的性能。因此,在设计多线程应用程序时,应慎重选择,并且视具体情况加以分析,才能使应用程序获得最佳的性能。所以在实际编程中,要根据需要灵活地使用多线程,除非确有必要才使用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。