2011年(17)
分类: LINUX
2011-11-24 20:29:38
最简单的回答是:线程比进程更快,开销更小。考虑一下下面的场景:
1. 当需要在在进程间共享数据时,我们必须使用IPC来进行通信,因为两个进程间没有“天生”的共享内存区(进程要求虚拟空间独立,如果想共享数据,必须把这几个进程的某个地址映射到相同的物理内存上)。IPC的使用将会导致开销上升。
2. 需要创建新进程时,我们使用fork()函数。虽然该函数不会拷贝所有的数据,但是最基本的数据,比如页表,文件描述符表等还是需要创建的。这也会导致开销上升。
而线程完全不会有上面的问题。两个线程之间的数据共享是很自然的事,因为同一进程的线程都在一个虚拟地址空间,数据的共享就像变量赋值一样(但要注意同步问题)。线程的创建也比进程的创建快,因为它不需要复制和创建很多数据。
当然,线程并不是用来替代进程的,它自身也有缺点,它的出现只是给了程序员另一种选择。比如我们在线程中使用的函数必须是thread-safe的(即多个线程访问同一函数不会影响输出的结果);一个线程的bug很可能会引起该进程的崩溃(所有的线程都在同一个虚拟地址空间内,一个线程能很容易的访问到另一个线程的空间),线程间可能会有同步问题。所以使用线程的程序必须很小心的设计和实现。