zoukankan      html  css  js  c++  java
  • 再次学习线程概念

    开个QQ,开了一个进程;开了迅雷,开了一个进程。
    在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。

    所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一个线程。

    所以一个进程管着多个线程。

    通俗的讲:“进程是爹妈,管着众多的线程儿子”...



    作者:南理汉子
    链接:https://www.zhihu.com/question/25532384/answer/131906596
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     
     
    ===========================================
    一句概括的总论:进程和线程都是一个时间段的描述,是CPU工作时间段的描述。
     
    作者:zhonyong
    链接:https://www.zhihu.com/question/25532384/answer/81152571
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    不请自来。
    看见上面几位的回答我真的是醉了。说几句我的理解。
    首先来一句概括的总论:进程和线程都是一个时间段的描述,是CPU工作时间段的描述。

    下面细说背景
    CPU+RAM+各种资源(比如显卡,光驱,键盘,GPS, 等等外设)构成我们的电脑,但是电脑的运行,实际就是CPU和相关寄存器以及RAM之间的事情。

    一个最最基础的事实:CPU太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备完全是望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高谁来?不管怎么样的策略,一句话就是在CPU看来就是轮流着来。

    一个必须知道的事实:执行一段程序代码,实现一个功能的过程介绍 ,当得到CPU的时候,相关的资源必须也已经就位,就是显卡啊,GPS啊什么的必须就位,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。

    串联起来的事实:前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。。。

    ========= 重要的东西出现了========
    进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。
    • 进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文

    线程是什么呢?
    进程的颗粒度太大,每次都要有上下的调入,保存,调出。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:

    程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。

    这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。

    到此全文结束,再一个总结:

    进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
     
    ================================================
    标题:进程与线程的一个简单解释
    阮一峰老师的文章:
    地址:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
     
    ===============================
     

    Q: 为什么都说「进程切换」是个比较昂贵的操作,它昂贵在哪呢?

    A:

    首先,就是由用户态向内核态的切换。因为我们需要保存旧的进程的状态。其次,我们可能需要执行一个比较复杂的「调度算法」,挑选出一个合适的候选进程。除此之外,每一次进程的切换都会伴随着 CPU 高速缓存的失效。在新的进程被切换到 CPU 上开始运行之后,高速缓存需要从内存中动态装入一些和新的进程运行有关的信息。

     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    [导入]CodeSmith基础(六)
    [导入]CodeSmith基础(五)
    POJ 2229 Sumsets(经典2次幂和问题)
    UVa 10820 Send a Table(欧拉函数)
    UVa 571 Jugs(经典倒水问题)
    UVa 10717 Mint(LCM)
    UVa 10791 Minimum Sum LCM(素因子分解)
    汇编的艺术(01)sizeof operator
    UVa 11121 Base 2(负数进制)
    UVa 106 Fermat vs. Pythagoras(毕达哥拉斯定理)
  • 原文地址:https://www.cnblogs.com/Tpf386/p/12105938.html
Copyright © 2011-2022 走看看