• 多线程/多进程/协程


    占用的资源:进程>线程>协程


    进程:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文

    进程的颗粒度太大,每次都要有上下的调入,保存,调出。

    线程:一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成;这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段

    https://www.zhihu.com/question/25532384/answer/81152571--zhonyong的回答

    进程只是资源分配的单位,线程才是cpu执行的单位

    所以一般情况下,线程是可以用到多核的

    只不过,在python中就比较特殊,本来创建了多个线程,但python解释器对外声称每个时间片只有一个线程要运行,所以对cpu来讲,只能看到一个线程,就变成单线程了;都是GIL搞的鬼

    (GIL锁原因:刚开始单线程够用了,而且完美解决线程安全问题;现在就苦逼了。。。)

    基于这种情况,出现了补救措施:multiprocessing

    python解释器给multiprocessing.Process的每个对象都给了一把锁玩,所以是真的多任务


    并发/并行:多个任务,一个核执行就是并发;每个任务都有一个核执行,就是并行

    python中的多线程就是并发,多进程才是并行

    即并行/并发与是不是线程没关系,只和任务数/核心数有关系;如果没有GIL,多线程也能实现并行

    (之前以为只要是多线程就一定是并发,即单个cpu手忙脚乱一会执行这个一下,一会又去执行那个一下;实际上,cpu的眼里只有线程,所以才说线程是cpu调度的单位)


    单线程/多线程:

    代码是计算密集型的,单线程比多线程快,多线程执行1000命令后就会被GIL切换掉,而切换是要消耗资源的;

    计算密集型的多任务:multiprocessing创建多进程,真的多任务,每个进程有各自的GIL

    代码是io密集型的,多线程更快,因为有的切换,单线程都没得切换,只能等

    io密集型的线程与协程:协程更快,因为是在线程内切换,线程层面都不切的

    但一般程序并不是纯io,也是有计算的,所以这就是协程的缺点,毕竟是单线程的;所以线程的优势就又体现出来了


    只能这么比较通俗的讲,底层还有用户线程/内核线程什么的 (这篇看着还不错,基本清晰),即该开始只有进程,没有线程,但进程太麻烦了,所以应用级搞了个线程,但内核不支持线程这个东西,依旧按进程来调;后来内核支持了线程,即调的是线程了

    最根本的还是要看一本操作系统原理的书,才能理解透彻了

  • 相关阅读:
    ios开发学习视图切换(View Transition)效果源码分享系列教程
    ios开发学习cocos2d(cocos2d)效果源码分享系列教程
    C++类模板定义放在cpp里报错:LNK2019无法解析的外部符号
    std::string学习
    C++之ODB框架
    C++虚析构函数
    Windows编译GRPC
    Qt信号与槽原理
    GRPC环境配置
    C++传入指针并在内部new失败
  • 原文地址:https://www.cnblogs.com/justaman/p/11479963.html
Copyright © 2020-2023  润新知