如何理解php的进程,线程,协程?
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何理解php的进程,线程,协程?
⼀.概念
进程:操作系统分配和管理资源的最基本单位。
线程:进程中的单⼀顺序流。
协程:由⽤户,模拟线程操作。
⼆.区别
线程之间资源共享,⽽进程间资源独⽴。
如何实现资源共享:
同⼀个进程中的多个线程。
这些线程所以对应的是同⼀个进程描述符。
通过同⼀个进程中多个线程指向同⼀个进程描述符,实现了线程间的资源共享。
三.使⽤场景
在很多场景下,其实⽤户是期望资源本⾝就可以共享的。
我们玩游戏的时候,期望⼀边能继续玩,⼀边能后台加载后续的内容。
我们在使⽤视频软件的时候,我们期望视频能⼀边下载,⼀边播放已经下载完的内容。
线程之间的资源可以共享,在这些场景下使⽤就⾮常合适。
有了线程,为啥还要有协程?
如今出现了⼀种场景:
开发者在每个线程中只做⾮常轻量的操作,⽐如访问⼀个极⼩的⽂件,下载⼀张极⼩的图⽚,加载⼀段极⼩的⽂本等。
但是,这样”轻量的操作“的量却⾮常多。
在有⼤量这样的轻量操作的场景下,即使可以通过使⽤线程池来避免创建与销毁的开销,但是线程切换的开销也会⾮常⼤,甚⾄于接近操作本⾝的开销。
线程切换的开销主要有以下两点:
恢复现场成本。
cpu缓存中的资源需要从⼀个线程更新到另⼀个线程。
(在java中,这块内容也称为⼯作区)
保护现场成本。
操作系统切换线程需要使⽤系统中断,保留现场也需要消耗⼀定资源。
使⽤协程,虽然也不可能完全避免这两点开销,但是由于协程不再是交给操作系统控制的,⽽是直接由开发者在⽤户空间控制。
四.优劣势:
1. 优势
由于不需要操作系统⼲预,因此所有操作完全可以在⽤户空间实现,更加轻量。
2. 劣势
所有原先作⽤于线程的操作,⽤户都需要⾃⼰去处理,如:协程的创建、销毁、切换、调度等。