欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

浅谈进程和线程

最编程 2024-02-09 12:56:09
...

什么是进程

进程是对运行时的程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;

每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成

当我们启动一个应用,计算机会至少创建一个进程,cpu会为进程分配一部分内存,应用产生的所有状态都会保存在这块内存中,应用也许还会创建多个线程来辅助工作,这些线程可以共享这部分内存中的数据。如果应用关闭,进程会被终结,操作系统会释放相关内存。

浏览器进程(以chrome为例)

  • Browser Process 浏览器的主进程(负责协调、主控) (1)负责包括地址栏,书签栏,前进后退按钮等部分的工作 (2)负责处理浏览器的一些不可见的底层操作,比如网络请求和文件访问 (3)负责各个页面的管理,创建和销毁其他进程

  • Renderer Process 负责一个 tab 内关于网页呈现的所有事情,页面渲染,脚本执行,事件处理等

  • Plugin Process 负责控制一个网页用到的所有插件,如 flash 每种类型的插件对应一个进程,仅当使用该插件时才创建

  • GPU Process 负责处理 GPU 相关的任务

什么是线程

线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。

而由于多个线程共享着相同的地址空间和资源,所以会存在线程之间有可能会恶意修改或者获取非授权数据等复杂的安全问题。

浏览器线程

GUI 渲染线程 负责渲染浏览器界面HTML元素,当界面需要重绘或回流时,该线程就会执行。

JS 引擎线程 负责处理Javascript脚本程序。一直等待着任务队列中任务的到来,然后解析Javascript脚本,运行代码。一个Tab页(renderer进程)中无论什么时候都只有一个JS线程在运行JS程序。 JS 引擎不是单独运行的 —— 它运行在一个宿主环境中,对于大多数开发者来说就是典型的浏览器和 Node.js

GUI 渲染线程 与 JavaScript引擎线程互斥!

定时器触发线程 (setTimeout) 浏览器定时计数器并不是由JavaScript引擎计数的 因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确, 因此通过单独线程来计时并触发定时是更为合理的方案。

浏览器事件线程 (onclick等事件)

  • 用来控制事件轮询,JS引擎自己忙不过来,需要浏览器另开线程协助
  • 当JS引擎执行代码块如鼠标点击、AJAX异步请求等,会将对应任务添加到事件触发线程中
  • 当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理任务队列的队尾,等待JS引擎的处理
  • 由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)

http 异步线程在XMLHttpRequest在连接后是通过浏览器新开一个线程请求, 将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理。 6. EventLoop轮询处理线程 其中,1、2、4为常驻线程

js线程

JS是单线程的,即JS只能在一个线程上执行代码,意味着所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。作为浏览器脚本语言,JavaScript的主要用途是与用户互动、操作DOM,单线程也是保证用户的操作具有顺序性;

但是当我们遇到setTimeout或者ajax异步时我们发现,异步结果未返回时并未阻塞,这是因为浏览器及node是多线程的,浏览器其他线程会辅助JS引擎线程的运行

WebWorker,JS的多线程?

  • 创建Worker时,JS引擎向浏览器申请开一个子线程(子线程是浏览器开的,完全受主线程控制,而且不能操作DOM
  • JS引擎线程与worker线程间通过特定的方式通信(postMessage API,需要通过序列化对象来与线程交互特定的数据)

Web Worker 可以为 JavaScript 脚本创建多个线程,让我们可以将一些复杂的计算任务交给worker线程运行,避免主线程阻塞,等到Worker线程计算完毕再把结果返回主线程。所以,Web Worker并没有改变js单线程的本质,可以理解为js的外挂