如何理解php的进程,线程,协程?
一.概念
-
进程:操作系统分配和管理资源的最基本单位。
-
线程:进程中的单一顺序流。
-
协程:由用户,模拟线程操作。
二.区别
线程之间资源共享,而进程间资源独立。
如何实现资源共享:
同一个进程中的多个线程。
这些线程所以对应的是同一个进程描述符。
通过同一个进程中多个线程指向同一个进程描述符,实现了线程间的资源共享。
三.使用场景
在很多场景下,其实用户是期望资源本身就可以共享的。
- 我们玩游戏的时候,期望一边能继续玩,一边能后台加载后续的内容。
- 我们在使用视频软件的时候,我们期望视频能一边下载,一边播放已经下载完的内容。
线程之间的资源可以共享,在这些场景下使用就非常合适。
有了线程,为啥还要有协程?
如今出现了一种场景:
- 开发者在每个线程中只做非常轻量的操作,比如访问一个极小的文件,下载一张极小的图片,加载一段极小的文本等。但是,这样”轻量的操作“的量却非常多。
- 在有大量这样的轻量操作的场景下,即使可以通过使用线程池来避免创建与销毁的开销,但是线程切换的开销也会非常大,甚至于接近操作本身的开销。
线程切换的开销主要有以下两点:
- 恢复现场成本。
cpu缓存中的资源需要从一个线程更新到另一个线程。(在java中,这块内容也称为工作区) - 保护现场成本。
操作系统切换线程需要使用系统中断,保留现场也需要消耗一定资源。
使用协程,虽然也不可能完全避免这两点开销,但是由于协程不再是交给操作系统控制的,而是直接由开发者在用户空间控制。
四.优劣势:
- 优势
由于不需要操作系统干预,因此所有操作完全可以在用户空间实现,更加轻量。 - 劣势
所有原先作用于线程的操作,用户都需要自己去处理,如:协程的创建、销毁、切换、调度等。

浙公网安备 33010602011771号