进程+线程+协程+php,进程、线程和协程三者之间的区别和联
系
⼀、进程、线程、协程
1,进程
进程,直观点说,保存在硬盘上的程序运⾏以后,会在内存空间⾥形成⼀个独⽴的内存体,这个内存体有⾃⼰独⽴的地址空间,有⾃⼰的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间⽚、内存等资源),进程是资源分配的最⼩单位。
2,线程(thread)(内核级线程)
线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执⾏的最⼩单位。
3,协程(⽤户级线程)
协程是⼀种⽤户态的轻量级线程,⼜称微线程。协程调度完全由⽤户控制,相当于⼦程序。
4,区别
1、资源⽅⾯:进程间相互独⽴,同⼀进程的各线程间共享。某进程内的线程在其他进程不可见
2、通信:进程间通信IPC,进程间可以直接读写进程数据段进⾏通信——需要进程同步和互斥⼿段辅助,以保证数据的⼀致性,线程通信主要通过共享内存
3、调度和切换:线程上下⽂切换⽐进程上下⽂切换要快的多
4、对于进程、线程,都是有内核进⾏调度,有 CPU 时间⽚的概念,进⾏抢占式调度(有多种调度算法),对于 协程(⽤户级线程),这是对内核透明的,是由⽤户程序⾃⼰控制,通常只能进⾏ 协作式调度,需要协程⾃⼰主动把控制权转让出去之后,其他协程才能被执⾏到。
进程优点:
1. 进程有独⽴的地址空间,⼀个进程崩溃后,在保护模式下不会对其它进程产⽣影响
进程缺点:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显⼤于创建或撤消线程时的开销。多进程的程序要⽐多线程的程序健壮,但在进程创建、切换、撤销时,耗费资源较⼤,效率要差⼀些。
进程间通信(IPC)较为复杂和耗时
php支持多线程吗线程优点:
1.线程的出现是为了减少任务切换的消耗,提⾼系统的并发性,实现让⼀个进程也能执⾏多个任务
线程缺点:
1.线程只是⼀个进程中的不同执⾏路径。线程有⾃⼰的堆栈和局部变量,但线程之间没有单独的地址空间,⼀个进程死掉就等于所有的线程死掉
2.线程没有⾃⼰的系统资源,只有运⾏时不可缺少的资源,但是同⼀进程的各线程可以共享进程所拥有的系统资源。对于某些独占资源存在锁机制,处理不当会出现死锁。
协程优点:
1.协程执⾏效率⾼。因为⼦程序切换不是线程切换,由程序⾃⾝控制,避免了陷⼊内核级别的上下⽂切换造成的性能损失,进⽽突破了线程在IO上的性能瓶颈。
2.协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好,所以执⾏效率⽐多线程⾼很多。
5.场景
多进程:
密集CPU任务,需要重复利⽤CPU多核资源(⼤量的并⾏计算)
多线程:
密集IO任务(⽹络IO,磁盘IO,数据库IO)
协程:
当程序中存在⼤量不需要CPU的操作时
最⾼效的组合:利⽤多核CPU最简单的⽅法是多进程+协程,既充分利⽤多核,⼜充分发挥协程的⾼效率,可获得极⾼的性能
6.进程/线程之间的亲缘性
亲缘性的意思是进程/线程只在某个cpu上运⾏(多核系统),⽐如:
使⽤CPU亲缘性的好处:设置CPU亲缘性是为了防⽌进程/线程在CPU的核上频繁切换,从⽽避免因切换带来的CPU的L1/L2 cache失效,cache失效会降低程序的性能。
⼆、⼩结
核⼼只有⼀个,线程是操作系统调度,协程是⽤户态调度。协程不必须是语⾔集成,例如C语⾔可以⽤setjmp/longjmp实现,也可以⾃⼰通过改变esp指针换栈实现协程。
协程本⾝跟⾼吞吐没任何关系,基于io多路复⽤+回调就可以实现⾼并发和⾼吞吐。引⼊协程是为了将回调逻辑变成线性同步逻辑。
版权声明:本⽂由PHP⾯试资料⽹发布,如需转载请注明出处。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论