Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85826
  • 博文数量: 17
  • 博客积分: 318
  • 博客等级: 二等列兵
  • 技术积分: 256
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-07 21:53
文章分类

全部博文(17)

文章存档

2011年(17)

我的朋友

分类: LINUX

2011-11-24 20:29:38

 最简单的回答是:线程比进程更快,开销更小。考虑一下下面的场景:

 

1.       当需要在在进程间共享数据时,我们必须使用IPC来进行通信,因为两个进程间没有“天生”的共享内存区(进程要求虚拟空间独立,如果想共享数据,必须把这几个进程的某个地址映射到相同的物理内存上)。IPC的使用将会导致开销上升。

2.       需要创建新进程时,我们使用fork()函数。虽然该函数不会拷贝所有的数据,但是最基本的数据,比如页表,文件描述符表等还是需要创建的。这也会导致开销上升。

 

  而线程完全不会有上面的问题。两个线程之间的数据共享是很自然的事,因为同一进程的线程都在一个虚拟地址空间,数据的共享就像变量赋值一样(但要注意同步问题)。线程的创建也比进程的创建快,因为它不需要复制和创建很多数据。

 

 当然,线程并不是用来替代进程的,它自身也有缺点,它的出现只是给了程序员另一种选择。比如我们在线程中使用的函数必须是thread-safe的(即多个线程访问同一函数不会影响输出的结果);一个线程的bug很可能会引起该进程的崩溃(所有的线程都在同一个虚拟地址空间内,一个线程能很容易的访问到另一个线程的空间),线程间可能会有同步问题。所以使用线程的程序必须很小心的设计和实现。

阅读(1890) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~