论述题 5.  请回答以下关于进程、线程以及程序的有关问题。
    1)进程和线程的区别是什么?
    2)多线程程序有什么优点与缺点?
    3)多进程程序有什么优点与缺点?与多线程相比,有什么区别?
【正确答案】1)进程和线程的关系如下:
   ①一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
   ②资源分配给进程,同一进程的所有线程共享该进程的资源。
   ③处理机分给线程,即真正在处理机上运行的是线程。
   ④线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程指的是进程内的一个执行单元,也是进程内的可调度实体。
   进程和线程的相同点如下:
   ①二者都具有ID、一组寄存器、状态、优先级以及所要遵循的调度策略。
   ②每个进程都有一个进程控制块,线程也拥有一个线程控制块。
   ③线程和子进程共享父进程中的资源;线程和子进程独立于它们的父进程,竞争使用处理器资源;线程和子进程的创建者可以在线程和子进程上实行某些控制,例如创建者可以取消、挂起、继续和修改线程和子进程的优先级;线程和子进程可以改变其属性并创建新的资源。
   进程和线程的不同点如下:
   ①线程是进程的一部分,一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
   ②启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
   ③系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),同一个进程内的线程可以共享进程的资源。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。而一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。
   ④与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
   ⑤进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
   2)多线程的优点如下:
   无须跨进程边界;程序逻辑和控制方式简单;所有线程可以直接共享内存和变量等;线程方式消耗的总资源比进程方式少。
   多线程的缺点如下:
   每个线程与主程序共用地址空间,受限于2GB地址空间;线程之间的同步和加锁控制比较麻烦;一个线程的崩溃可能影响到整个程序的稳定性;到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约1500个线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也很烦琐,需要消耗较多的CPU。
   3)多进程的优点如下:
   每个进程互相独立,不影响主程序的稳定性,子进程崩溃也没关系;通过增加CPU,就可以容易扩充性能;可以尽量减少线程加锁/解锁的影响,即使线程运行的模块算法效率低,也可极大提高性能;每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。
   多线程的缺点如下:
   逻辑控制复杂,需要和主程序交互;需要跨进程边界,如果有大数据量传送,就不太适用,适合于小数据量传送、密集运算、多进程调度开销比较大;最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然,也可以利用多线程+多CPU+轮询方式来解决问题。
   方法和手段是多样的,关键是自己看起来实现方便又能够满足要求,代价也合适。
【答案解析】