zoukankan      html  css  js  c++  java
  • 进程与线程

    1. 进程:程序的一次执行, 它占有一片独有的内存空间
    2. 线程: CPU的基本调度单位, 是程序执行的一个完整流程,是一个进程中代码的不同执行路线
    3. 进程与线程
      * 一个进程中一般至少有一个运行的线程: 主线程,进程启动后自动创建
      * 一个进程中也可以同时运行多个线程, 我们会说程序是多线程运行的
      * 一个进程内的数据可以供其中的多个线程直接共享
      * 多个进程之间的数据是不能直接共享的,进程间的内存是独立的
      * 线程池(thread pool):保存多个线程对象的容器,实现线程对象的反复利用
    4. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
        而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
        多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
    5. 一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。
        而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。
        线程ID:每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程
        寄存器组的值:由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便        将来该线程在被重新切换到时能得以恢复。
        :是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。
        操作系统在切换线程的时候会自动的切换栈,就是切换 SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
      * 何为多进程与多线程?
        多进程运行:一个应用程序可以同时启动多个实例运行;多线程:在一个进程中,同时有多个线程运行。
      * 比较单线程与多线程:
        多线程:优点,能有效提升CPU的利用率;缺点,创建多线程开销,线程间切换开销,死锁与状态同步问题。
        单线程:优点,顺序编程简单易懂;缺点,效率低。
      * JS是单线程还是多线程?
        JS是单线程运行的,但使用H5中的Web Workers可以多线程运行。
      * 浏览器运行是单线程还是多线程?
        都是多线程运行的。
      * 浏览器运行是单进程还是多进程?
        有的是单进程:firefox,老版的IE;有的是多进程:chrome,新版IE等。
    4. 浏览器运行是单进程还是多进程?
      * 有的是单进程
        * firefox
        * 老版IE
      * 有的是多进程
        * chrome
        * 新版IE
    5. 如何查看浏览器是否是多进程运行的呢?
      * 任务管理器==>进程
    6. 浏览器运行是单线程还是多线程?
      * 都是多线程运行的
     
    某乎的精彩回答:

    进程和线程都是一个时间段的描述,是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工作时间段的描述,不过是颗粒大小不同。
    不积跬步无以至千里
  • 相关阅读:
    android Edittext自定义输入字符和类型
    让android webView使用系统默认浏览器内核直接解析,不弹出选择浏览器选项
    java对象中继承和变量初始化顺序浅析
    android判断pad还是手机
    我不知道自己想要什么
    计算机网络概述
    2020/2/27-28
    操作系统概述
    数据模型
    数据库系统概述
  • 原文地址:https://www.cnblogs.com/lyt0207/p/12023554.html
Copyright © 2011-2022 走看看