线程与进程区别
一.定义:
进程(process)是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。
进程中所包含的一个或多个执行单元称为线程(thread)。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。
二.区别:
一个程序至少有一个进程,一个进程至少有一个线程.。
1.多进程比多线程程序要健壮进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程没有自己单独的内存地址空间。一个线程死掉整个进程就死掉了。
2.进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大;
线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进 程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
3.进程——资源分配的最小单位,线程——程序执行的最小单位。或者说是CPU调度和分派的基本单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位是线程。因此,实现并发功能的单位是线程。
4.体现在通信机制上面:正因为进程之间互不干扰,相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。一进程下的线程共享数据(比如全局变量,静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问的同步与互斥正是编写多线程程序的难点
5.体现在CPU系统上面:线程使得CPU系统更加有效,因为操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
进程占用内存多,切换复杂,CPU利用率低; 线程占用内存少,切换简单,CPU利用率高。
6.线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中, 由应用程序提供多个线程的并发控制。
三.进程、用户线程、内核线程的区别和联系
进程 | 用户线程(轻量级进程) | 内核线程 | |
代码段 | 有 | 有 | 有 |
数据段 | 有 | 有 | 有 |
描述符task_struct | 有 | 有 | 有 |
用户空间堆栈 | 有 | 一个线程组共享一个用户空间 | 完全没有 |
内核空间堆栈 | 有 | 有 | 有 |
PID | 独一无二的 | 一组线程共享一个 | 有 |
这里的有是指拥有独立的。
四.进程与线程的选择
取决以下几点:
1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。
6.对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。