当前位置:嗨网首页>书籍在线阅读

10-线程VS进程

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

29.9 线程VS进程

将应用程序实现为一组线程还是进程?本节将简单考虑一下可能影响这一决定的部分因素。先从多线程方法的优点开始。

  • 线程间的数据共享很简单。相形之下,进程间的数据共享需要更多的投入。(例如,创建共享内存段或者使用管道pipe)。
  • 创建线程要快于创建进程。线程间的上下文切换(context-switch),其消耗时间一般也比进程要短。

线程相对于进程的一些缺点如下所示。

  • 多线程编程时,需要确保调用线程安全(thread-safe)的函数,或者以线程安全的方式来调用函数。(31.1节将讨论线程安全的概念。)多进程应用则无需关注这些。
  • 某个线程中的bug(例如,通过一个错误的指针来修改内存)可能会危及该进程的所有线程,因为它们共享着相同的地址空间和其他属性。相比之下,进程间的隔离更彻底。
  • 每个线程都在争用宿主进程(host process)中有限的虚拟地址空间。特别是,一旦每个线程栈以及线程特有数据(或线程本地存储)消耗掉进程虚拟地址空间的一部分,则后续线程将无缘使用这些区域。虽然有效地址空间很大(例如,在x86-32平台上通常有3GB),但当进程分配大量线程,亦或线程使用大量内存时,这一因素的限制作用也就突显出来。与之相反,每个进程都可以使用全部的有效虚拟内存,仅受制于实际内存和交换(swap)空间。

影响选择的还有如下几点。

  • 在多线程应用中处理信号,需要小心设计。(作为通则,一般建议在多线程程序中避免使用信号。)关于线程与信号, 33.2节会做深入讨论。
  • 在多线程应用中,所有线程必须运行同一个程序(尽管可能是位于不同函数中)。对于多进程应用,不同的进程可以运行不同的程序。
  • 除了数据,线程还可以共享某些其他信息(例如,文件描述符、信号处置、当前工作目录,以及用户ID和组ID)。优劣之判,视应用而定。