zoukankan      html  css  js  c++  java
  • 快速理解进程、线程、协程的概念,它们的区别和共同点,以及应用场景。

    一、进程、线程、协程的概念

      1、进程:

          教科书上最经典的一句话解释:——进程是资源分配的最小单位

          实质上的理解:——先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。进程的生命周期有调入,执行,保存的过程。

      2、线程:

          教科书上最经典的一句话解释:——线程是CPU调度的最小单位

          实质上理解:——一个应用程序的执行可能有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块;这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,单核任务中划分更为细小的CPU时间段

      3、协程:

        教科书上最经典的一句话解释:——协程是线程的一种表现形式。

        实质上理解:——协程又称微线程。在单线程上执行的多个任务,用函数切换,开销极小。

        深入理解:子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断

    二、进程、线程、协程的区别

      1、多进程/多线程
        共同点 :表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。

        区别:     

          进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。

          线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小。共享意味着竞争,导致数据不安全,为了保护内存空间的数据安全,引入"互斥锁"。一个线程在访问内存空间的时候,其他线程不允许访问,必须等待之前的线程访问结束,才能使用这个内存空间。

          互斥锁:一种安全有序的让多个线程访问内存空间的机制。

          python的多线程:由于有GIL锁的存在,一个线程需要执行任务,必须获取GIL,好处:直接杜绝了多个线程访问内存空间的安全问题。坏处:Python的多线程不是真正多线程,不能充分利用多核CPU的资源。

      2、多线程和协程之间的共同点和区别:

      共同点:

        都是并发操作,多线程同一时间点只能有一个线程在执行,协程同一时间点只能有一个任务在执行;

      不同点:

        多线程,是在I/O阻塞时通过切换线程来达到并发的效果,在什么情况下做线程切换是由操作系统来决定的,开发者不用操心,但会造成竞争条件。协程是用函数切换,开销极小。不通过操作系统调度,没有进程、线程的切换开销。


    三、应用场景
      如果是 I/O 密集型,且 I/O 请求比较耗时的话,使用协程。
        函数切换,占用资源少
      如果是 I/O 密集型,且 I/O 请求比较快的话,使用多线程。
        由操作系统切换,占用资源大,越快处理完越好
      如果是 计算 密集型,考虑可以使用多核 CPU,使用多进程。
        进程之间资源不共享,还可以用到多个CPU,如果使用线程的话,还要考虑到数据的安全性,使用互斥锁。
  • 相关阅读:
    HashMap了解吗?
    阻塞队列知道吗
    深入理解Java枚举类型(enum)
    CountDownLatch/CyclicBarrier/Semaphore 使用过吗?
    Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等…
    选择排序算法
    Node版本管理器NVM常用命令
    希尔排序算法
    插入排序算法
    mybatis与hibernate的区别持久层对比【面试题】
  • 原文地址:https://www.cnblogs.com/youhongliang/p/12198897.html
Copyright © 2011-2022 走看看