什么是协程?以及进程,线程,协程的区别

作者: 怀老师 | 来源:发表于2020-06-23 18:31 被阅读0次

    1.进程

    1.1什么是进程?

    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。常见的如PHP-FPM进程,Nginx进程。

    1.2进程间通信

    每个进程有自己的独立内存空间,不同进程之间的通信即IPC(Inter-Process Communication) 可以通过 Unix Socket套接字进行通信共享,例如php-fcgi.sock文件就是fpm和nginx通信的UDS(Unix Domain Socket)。

    1.3优劣

    优势:稳定安全
    劣势:切换开销大

    1.4进程关闭

    每个进程都有一个父进程,进程号叫PID。可使用ps -axjf树形显示进程。当进程死亡时,会自动关闭已打开的文件,舍弃占用的内存、交换空间等系统资源。向父进程返回一个退出状态值。

    顶级进程init(pid为1,PPID为0)

    1.5进程状态

    当我们使用Top命令时,其中的STAT字段就是进程当前的状态。比如top进程就是R,运行态,nginx进程是S,等待事件执行。偶尔会看到Ss状态,或者S+状态,这时S还是等待事件执行,后面的是描述当前进程的子状态。Ss表示包含子进程的Sleep进程。S+表示后台运行的Sleep进程。

    //主状态,在第一位
    D 等待IO不可中断
    R Running
    S Sleep等待事件执行
    T Stopped
    
    //子状态,在第二位
    < 高优先级
    N 低优先级
    s 主进程,包含子进程
    + 位于后台的进程
    | 多线程,clone线程。
    

    1.6进程切换

    1.切换页目录使用新的地址空间
    2.切换内核栈
    3.切换硬件上下文

    2.线程

    2.1什么是线程?

    线程是进程的一个实体,是CPU调度和分派的基本单位。

    2.2 线程间通信

    它可与同一进程内的其他线程共享进程资源,线程通信靠共享内存。

    2.3 优劣

    优势:上下文切换快。
    劣势:不够稳定容易丢失数据。

    一个进程必然包括一个线程。线程比单纯的协程性能好,能利用多核达到真正的并行计算。

    2.4多线程

    多线程会涉及到读写同一个地址变量的问题,引入了锁的概念(如互斥锁)。

    2.5线程切换

    1.切换内核栈
    2.切换硬件上下文

    3.协程

    3.1 什么是协程?

    协程即用户态线程。

    3.2 说人话!

    协程并不是多任务并行,而是多任务串行,只是这些代码可以交叉运行。单线程的程序通过条件语句去模拟多线程的实现,使各个函数交叉运行,最终结果看起来像是并发执行。因为用户可控制且像线程,所以说是用户态线程。

    3.3优劣

    优势:上下文切换非常快,抗并发能力强。
    劣势:变量容易污染

    3.4 协程调度

    1.因为协程不加锁,会导致多任务时间不能公平分享。所以协程是抢占式调度。
    2.协程切换因为在线程内,所以无需切换上下文。

    分时调度:所有线程轮流使用CPU使用权,平均分配每个线程的时间
    抢占式调度:优先让nice值高的线程使用CPU,如果优先级一样,随机分配。(可通过nice命令增加)

    3.5 协程为什么能抗并发

    协程性能优势在于IO并发上。协程在遇到IO时就会挂起,切换到别的进程继续计算。然而协程本身并不是解决一切性能问题的万能灵药,背后的统一任务调度框架才是性能优异的核心原因。
    PHP的Swoole和Python的asyncio之所以能处理并发,是因为它们都是epoll模型+事件循环来驱动协程。由于IO操作非常耗时,经常使程序处于等待状态,有了背后的任务调度框架为我们自动切换协程,就保证总有协程在运行,而不是在等待IO。

    epoll (event poll)事件驱动模型

    3.6协程实现

    协程实现依赖迭代器和生成器yield
    foreach可以使用curent,next模拟操作。

    相关文章

      网友评论

        本文标题:什么是协程?以及进程,线程,协程的区别

        本文链接:https://www.haomeiwen.com/subject/wxehfktx.html