如何理解php的进程,线程,协程?

一.概念

  • 进程:操作系统分配和管理资源的最基本单位。

  • 线程:进程中的单一顺序流。

  • 协程:由用户,模拟线程操作。


二.区别

线程之间资源共享,而进程间资源独立。

如何实现资源共享:
同一个进程中的多个线程。
这些线程所以对应的是同一个进程描述符。
通过同一个进程中多个线程指向同一个进程描述符,实现了线程间的资源共享。


三.使用场景

在很多场景下,其实用户是期望资源本身就可以共享的。

  • 我们玩游戏的时候,期望一边能继续玩,一边能后台加载后续的内容。
  • 我们在使用视频软件的时候,我们期望视频能一边下载,一边播放已经下载完的内容。

线程之间的资源可以共享,在这些场景下使用就非常合适。

有了线程,为啥还要有协程?

如今出现了一种场景:

  • 开发者在每个线程中只做非常轻量的操作,比如访问一个极小的文件,下载一张极小的图片,加载一段极小的文本等。但是,这样”轻量的操作“的量却非常多。
  • 在有大量这样的轻量操作的场景下,即使可以通过使用线程池来避免创建与销毁的开销,但是线程切换的开销也会非常大,甚至于接近操作本身的开销。

线程切换的开销主要有以下两点:

  • 恢复现场成本。
    cpu缓存中的资源需要从一个线程更新到另一个线程。(在java中,这块内容也称为工作区)
  • 保护现场成本。
    操作系统切换线程需要使用系统中断,保留现场也需要消耗一定资源。

使用协程,虽然也不可能完全避免这两点开销,但是由于协程不再是交给操作系统控制的,而是直接由开发者在用户空间控制。


四.优劣势:

  1. 优势
    由于不需要操作系统干预,因此所有操作完全可以在用户空间实现,更加轻量。
  2. 劣势
    所有原先作用于线程的操作,用户都需要自己去处理,如:协程的创建、销毁、切换、调度等。
posted @ 2021-06-16 11:55  告别婆娑  阅读(488)  评论(0)    收藏  举报