进程
- 进程是表示==资源分配==的基本单位,进程有利于资源的管理和保护
- 优点: 拥有独立的运行空间
- 缺点:系统开销大,在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销.
线程
- 线程是进程中执行运算的最小单位,亦即执行处理机==调度==的基本单位
- 线程机制支持并发程序设计技术,在多处理器上能真正保证并行处理。而在linux实现线程很特别,linux把所有的线程都当作进程实现。linux下线程看起来就像普通进程(只是该进程和其他进程共享资源,如地址空间)
- Linux下不管是多线程编程还是多进程编程,最终都是用do_fork实现的多进程编程
线程的好处:
- 易于调度
- 提高并发性。通过线程可方便有效地实现并发性,进程可创建多个线程来执行同一个程序的不同部分。
- 开销少,在进程内创建、终止线程比创建、终止进程要快。同一进程内的线程间切换比进程间的切换要快,尤其是==用户级线程间==的切换。线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件)
- 充分发挥多处理器的功能,通过多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使得每个处理器得到充分运行
进程与线程的关系
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
- 独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在
- 资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源
- 资源分配给进程,统一进程的所有线程共享该进程的所有资源;
- 线程在执行过程中,需要协作同步,==不同进程的线程==间要利用消息通信的办法实现同步;
- 处理机分给线程,即真正在处理机上运行的是线程。
- 一个说法:
UNIX/linux环境,采用多线程没必要
==占用资源角度==:产生一个多进程时肯定是需要产生的一点内存用来复制进程表项,即一个task_struct结构,但这个结构本身做得相当小巧;对于多进程来说,代码段是肯定不用复制的,因为父进程和各子进程的代码段是相同的;数据段和堆栈段,通过copy-on-write,即写时拷贝技术,当子进程或父进程要改变变量x的值时就会复制该变量。
多线程优点
- 无需跨进程边界;
- 程序逻辑和控制方式简单;
- 所有线程可以直接共享内存和变量等;
- 线程方式消耗的总资源比进程方式好;
多线程缺点
- 每个线程与主程序共用地址空间,受限于2GB地址空间;
- 线程之间的同步和加锁控制比较麻烦;
- 一个线程的崩溃可能影响到整个程序的稳定性;
- 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU
多进程优点
- 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
- 通过增加CPU,就可以容易扩充性能;
- 可以==尽量减少线程加锁/解锁==的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
- 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。
多进程缺点
- 逻辑控制复杂,需要和主程序交互;
- 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算;
- 多进程调度开销比较大;
网友评论