进程与线程

今天学习的内容是进程和线程,光看文字你们可能以为会很陌生,不理解这两个词语是什么意思,尤为是线程,看起来会更为抽象,而进程可能你们会在不少地方多看获得他们存在的身影。前端

好比说,在任务管理器中浏览器

 

 

从上面两个图中,咱们能够清楚的认识到,什么是进程,从第一张图能够看到,映像名称下每一条都是一个进程,后面是每一条进程的cpu占有率以及内存占用。服务器

进程定义:进程就是在系统内存中加载运行的程序;多线程

通俗来说:异步

  计算机的核心是CPU,它承担了全部的计算任务。它就像一座工厂,时刻在运行。 
  假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其余车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。进程就比如工厂的车间,它表明CPU所能处理的单个任务。任一时刻,CPU老是运行一个进程,其余进程处于非运行状态。函数

2.线程oop

  图接上文,一个车间(进程)里,能够有不少工人(线程)。他们协同完成一个任务。车间的空间是工人们共享的,好比许多房间是每一个工人均可以进出的。这象征一个进程的内存空间是共享的,每一个线程均可以使用这些共享内存。 
     但是,每间房间的大小不一样,有些房间最多只能容纳一我的,好比厕所。里面有人的时候,其余人就不能进去了。这表明一个线程使用某些共享内存时,其余线程必须等它结束,才能使用这一块内存。一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫”互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。 
  还有些房间,能够同时容纳n我的,好比厨房。也就是说,若是人数大于n,多出来的人只能在外面等着。这比如某些内存区域,只能供给固定数目的线程使用。这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种作法叫作”信号量”(Semaphore),用来保证多个线程不会互相冲突。不难看出,mutex是semaphore的一种特殊状况(n=1时)。也就是说,彻底能够用后者替代前者。可是,由于mutex较为简单,且效率高,因此在必须保证资源独占的状况下,仍是采用这种设计。布局

  这样看来,线程是否是就不难以理解了,线程能够说是进程的实体化,线程之间相互配合,完成进程分配下来的任务。性能

  线程是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源。学习

3.进程与线程之间的区别

除此以外,进程与线程之间的区别还有:

  • 进程是由系统建立的,而且会为它分配独立地址空间,加载(复制)所须要的存在硬盘中的数

    据到内存,进程建立时候会建立一个主线程;

  • 线程是进程建立的,直接可以使用进程的资源,而且同个进程中的线程共享进程的地址空间

    资源,所以建立进程会比建立线程要耗费资源;

  • 进程和线程都可以独立完成任务,进程完成的任务要比线程完成的任务复杂;

  • 进程控制不了兄弟进程,只能控制子进程,同个进程中的线程能够控制兄弟线程

 4.浏览器进程

  • Browser进程:浏览器的主进程(负责协调、主控),只有一个
  • 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才建立
  • GPU进程:最多一个,用于3D绘制
  • 浏览器渲染进程(内核):默认每一个Tab页面一个进程,互不影响,控制页面渲染,脚本执行,事件处理等(有时候会优化,如多个空白tab会合并成一个进程)

  在这几个进程中,咱们主要了解浏览器渲染进程。它是对咱们前端操做来讲最重要的一个进程,由于里面包含了js引擎进程。这一章,咱们大概了解一下渲染进程中中的这几个线程,对咱们下一章了解

js Event-Loop事件机制作个铺垫。

  浏览器渲染进程包含的几个线程:

  1. GUI渲染线程

    • 负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。
    • 当界面须要重绘(Repaint)或因为某种操做引起回流(reflow)时,该线程就会执行
    • 注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(至关于被冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时当即被执行。
  2. JS引擎线程

    • 也称为JS内核,负责处理Javascript脚本程序。(例如V8引擎)
    • JS引擎线程负责解析Javascript脚本,运行代码。
    • JS引擎一直等待着任务队列中任务的到来,而后加以处理,一个Tab页(renderer进程)中不管何时都只有一个JS线程在运行JS程序
    • 一样注意,GUI渲染线程与JS引擎线程是互斥的,因此若是JS执行的时间过长,这样就会形成页面的渲染不连贯,致使页面渲染加载阻塞。
  3. 事件触发线程

    • 归属于浏览器而不是JS引擎,用来控制事件循环(能够理解,JS引擎本身都忙不过来,须要浏览器另开线程协助)
    • 当JS引擎执行代码块如setTimeOut时(也可来自浏览器内核的其余线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件线程中
    • 当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理
    • 注意,因为JS的单线程关系,因此这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)

  4. 定时触发器线程

    • 传说中的setIntervalsetTimeout所在线程
    • 浏览器定时计数器并非由JavaScript引擎计数的,(由于JavaScript引擎是单线程的, 若是处于阻塞线程状态就会影响记计时的准确)
    • 所以经过单独线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行)
    • 注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms。
  5. 异步http请求线程

    • 在XMLHttpRequest在链接后是经过浏览器新开一个线程请求
    • 将检测到状态变动时,若是设置有回调函数,异步线程就产生状态变动事件,将这个回调再放入事件队列中。再由JavaScript引擎执行。

   

  在这里,咱们其实能够找到一个问题,为什JavaScript是单线程而不是多线程语言,单线程同一个时间只能作一件事。若是JavaScript是多线程,不是能够提升效率吗。

  其实,js单线程是被开发时就决定的,js一开始是做为一门辅助语言存在的,它的主要做用就是与用户互动,减小客户端向服务器的请求次数,设想一下,若是有一个简单的表单有效性验证,用户填完一个表单,点击提交按钮,客户端向服务器发送请求,等待了 30 秒的处理后,看到的倒是一条告诉你忘记填写密码的提示,这样不是大大的浪费了服务器性能,也下降了用户体验吗。因此它存在的用途就决定了它只能是单线程,不然会带来很复杂的同步问题。好比,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另外一个线程删除了这个节点,这时浏览器应该以哪一个线程为准?

  因此,为了不复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,未来也不会改变。

  为了利用多核CPU的计算能力,HTML5提出Web Worker标准,容许JavaScript脚本建立多个线程,可是子线程彻底受主线程控制,且不得操做DOM。因此,这个新标准并无改变JavaScript单线程的本质。

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息