进程、线程、多进程、多线程的优缺点和区别
进程:是并发执⾏的程序在执⾏过程中分配和管理资源的基本单位,是⼀个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的⼀个执⾏单元,是进程内科调度实体。⽐进程更⼩的独⽴运⾏的基本单位。线程也被称为轻量级进程。
⼀个程序⾄少⼀个进程,⼀个进程⾄少⼀个线程。
为什么会有线程?
每个进程都有⾃⼰的地址空间,即进程空间,在⽹络或多⽤户换机下,⼀个服务器通常需要接收⼤量不确定数量⽤户的并发请求,为每⼀个请求都创建⼀个进程显然⾏不通(系统开销⼤响应⽤户请求效率低),因此操作系统中线程概念被引进。
线程的执⾏过程是线性的,尽管中间会发⽣中断或者暂停,但是进程所拥有的资源只为改线状执⾏过程服务,⼀旦发⽣线程切换,这些资源需要被保护起来。
进程分为单线程进程和多线程进程,单线程进程宏观来看也是线性执⾏过程,微观上只有单⼀的执⾏过程。多线程进程宏观是线性的,微观上多个执⾏操作。
线程的改变只代表CPU的执⾏过程的改变,⽽没有发⽣进程所拥有的资源的变化。
进程线程的区别:
地址空间:同⼀进程的线程共享本进程的地址空间,⽽进程之间则是独⽴的地址空间。
资源拥有:同⼀进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独⽴的。
⼀个进程崩溃后,在保护模式下不会对其他进程产⽣影响,但是⼀个线程崩溃整个进程都死掉。所以多进程要⽐多线程健壮。
进程切换时,消耗的资源⼤,效率⾼。所以涉及到频繁的切换时,使⽤线程要好于进程。同样如果要求同时进⾏并且⼜要共享某些变量的并发操作,只能⽤线程不能⽤进程
执⾏过程:每个独⽴的进程程有⼀个程序运⾏的⼊⼝、顺序执⾏序列和程序⼊⼝。但是线程不能独⽴执⾏,必须依存在应⽤程序中,由应⽤程序提供多个线程执⾏控制。
线程是处理器调度的基本单位,但是进程不是。
两者均可并发执⾏。
优缺点:
线程执⾏开销⼩,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运⾏。
进程执⾏开销⼤,但是能够很好的进⾏资源管理和保护。进程可以跨机器前移。
何时使⽤多进程,何时使⽤多线程?
对资源的管理和保护要求⾼,不限制开销和效率时,使⽤多进程。
要求效率⾼,频繁切换时,资源的保护管理要求不是很⾼时,使⽤多线程。
⼀. 在Linux下编程多⽤多进程编程少⽤多线程编程
IBM有个家伙做了个测试,发现切换线程context的时候,windows⽐linux快⼀倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows⽐linux的要快五倍左右。当然这并不是说linux不好,⽽且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows⼀点。这应该是的,毕竟unix家族都是从多进程过来的,⽽ windows从头就是多线程的。
如果是UNIX/linux环境,采⽤多线程没必要。多线程⽐多进程性能⾼?误导!应该说,多线程⽐多进程成本低,但性能更低。在UNIX环境,多进程调度开销⽐多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很⾼的。内存消耗⽅⾯,⼆者只差全局数据区,现在内存都很便宜,服务器内存动辄若⼲G,根本不是问题。
多进程是⽴体交通系统,虽然造价⾼,上坡下坡多耗点油,但是不堵车。多线程是平⾯交通系统,造价低,但红绿灯太多,⽼堵车。就⽐如我们都开跑车,油(主频)不是问题,也不怕上坡下坡,但就怕堵车。
⾼性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是⾮常⾼的。TUXEDO是的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很⼤的参考意义。
⼆. 进程
1. 进程的优点
顺序程序的特点:具有封闭性和可再现性;一个线程可以包含多个进程
程序的并发执⾏和资源共享。多道程序设计出现后,实现了程序的并发执⾏和资源共享,提⾼了系统
的效率和系统的资源利⽤率。
2. 进程的缺点
操作系统调度切换多个线程要⽐切换调度进程在速度上快的多。⽽且进程间内存⽆法共享,通讯也⽐较⿇烦。
线程之间由于共享进程内存空间,所以交换数据⾮常⽅便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显⼤于创建或撤消线程时的开销。
三. 线程
1. 线程的优点
它是⼀种⾮常”节俭”的多任务操作⽅式。在下,启动⼀个新的进程必须分配给它独⽴的地址空间,建⽴众多的数据表来维护它的代码段、堆栈段和数据段,这是⼀种”昂贵”的多任务⼯作⽅式。⽽运⾏于⼀个进程中的多个线程,它们彼此之间使⽤相同的地址空间,共享⼤部分数据,启动⼀个线程所花费的空间远远⼩于启动⼀个进程所花费的空间,⽽且,线程间彼此切换所需的时间也远远⼩于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能会有较⼤的区别;
线程间⽅便的通信机制,由于同⼀进程下的线程之间共享数据空间,所以⼀个线程的数据可以直接为其它线程所⽤,这不仅快捷,⽽且⽅便;
使多CPU系统更加有效。操作系统会保证当线程数不⼤于CPU数⽬时,不同的线程运⾏于不同的CPU上;
2. 线程的缺点
调度时, 要保存线程状态,频繁调度, 需要占⽤⼤量的机时;
程序设计上容易出错(线程同步问题)。
四. 多进程
1. 多进程优点
每个进程互相独⽴,不影响主程序的稳定性,⼦进程崩溃没关系;
通过增加CPU,就可以容易扩充性能;
可以尽量减少线程加锁/解锁的影响,极⼤提⾼性能,就算是线程运⾏的模块算法效率低也没关系;
每个⼦进程都有2GB地址空间和相关资源,总体能够达到的性能上限⾮常⼤
2. 多进程缺点
逻辑控制复杂,需要和主程序交互;
需要跨进程边界,如果有⼤数据量传送,就不太好,适合⼩数据量传送、密集运算
多进程调度开销⽐较⼤;
五. 多线程
1. 多线程的优点
⽆需跨进程边界;
程序逻辑和控制⽅式简单;
所有线程可以直接共享内存和变量等;
线程⽅式消耗的总资源⽐进程⽅式好;
2. 多线程缺点
每个线程与主程序共⽤地址空间,受限于2GB地址空间;
线程之间的同步和加锁控制⽐较⿇烦;
⼀个线程的崩溃可能影响到整个程序的稳定性;
到达⼀定的线程数程度后,即使再增加CPU也⽆法提⾼性能,例如Windows Server 2003,⼤约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
线程能够提⾼的总性能有限,⽽且线程多了之后,线程本⾝的调度也是⼀个⿇烦事⼉,需要消耗较多的CPU
在开发中,最好是多进程和多线程结合,即根据实际的需要,每个CPU开启⼀个⼦进程,这个⼦进程开启多线程可以为若⼲同类型的数据进⾏处理。当然你也可以利⽤多线程+多CPU+轮询⽅式来解决问题。⽅法和⼿段是多样的,关键是⾃⼰看起来实现⽅便有能够满⾜要求,代价也合适。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论