一、进程与线程

 进程:正在执行的程序为一个进程。程序的一次运行,它会占用一片独立的内存空间。称为进程线程:线程是进程内一个独立的执行单元。1、一个进程中至少一个运行的线程,称为主线程。进程启动后自动创建。2、应用程序的代码必须运行线程中。3、在一个进程内同时有多个线程运行。   4、线程池(Thread pool):保存多个线程对象的容器,实现线程对象的反复使用。

1.1 单线程与多线程区别

在一个进程内至少有一个线程运行,也可以同时有多个线程运行。

     多线程:优点:能有效提高CPU的利用率缺点:1、线程并发问题2、线程切换、线程创建的时间开销  单线程:优点:顺序编码比较简单缺点: 效率低

1.2 浏览器是单进程还是多进程?

浏览器是单进程运行还是多进程运行?1、有的是单进程:火狐、老版IE2、有的是多进程:谷歌、新版IE
>>>>>> 查看应用程序是多进程还是单进程

JS是单线程运行。
但是使用H5中的Web Workers可以多线程运行。

二、浏览器内核

浏览器内核:支持浏览器运行的最核心的程序。

2.1 浏览器内核

 不同浏览器的内核可能不一样:Chrome、Safari:webkit内核firefox:GeckoIE:Trident360、国内其他浏览器:Trident+webkit

2.2 浏览器内核模块组成部分

内核有很多模块组成主线程:1、js引擎模块:负责js的编译与运行2、html、css文档解析模块:负责页面文本的解析3、DOM、CSS模块:负责dom、css在内存中的处理,解析为DOM树4、布局和渲染模块:参照DOM中对象,负责页面的布局和渲染分线程:1、定时器管理模块:负责定时器的管理2、DOM事件管理模块:负责事件的管理3、Ajax管理模块:负责ajax请求

三、事件循环模型(JS单线程运行原理)

3.1 定时器

 1、定时器真的是定时执行的么?定时器并不是真正的定时执行。一般会延时一丁点时间运行。2、定时器回调函数是哪一个线程在执行?在主线程中执行的,    js是单线程的。3、定时器是如何实现的?事件循环模型
1)JS是单线程执行的
 1、我们将代码分为初始化代码和回调代码。初始化代码就是主函数代码,包括绑定事件、开启定时任务等。回调代码指回调函数。2、JS引擎执行代码流程:1) 先执行初始化代码,即主函数代码(包含设置定时器、绑定监听、Ajax调用等)2) 在初始化代码执行完毕后,后面在某个时刻才会触发回调函数。
3、JS是单线程运行,只在主线程执行。1) JS是单线程运行,但是浏览器是多线程运行。2) JS引擎执行主函数代码,会将回调函数交给浏览器的事件模块处理。当回调函数被触发时,浏览器事件模块会将回调函数放入到队列中等待执行。当主函数代码执行完毕后,JS引擎会从队列中取出回调函数在栈中执行。
>>>>>> 证明js是单线程运行
     alert("xx")  // 暂停当前主线程的运行,同时暂停计时// 点击确定后,恢复程序执行和计时
     如下案例,先会执行alert("main"),不点击弹窗确定,则延时函数一直不会执行。点击弹窗确定后,延时函数才会恢复计时执行。
        console.log("123")setTimeout(function(){alert("123")},0);alert("main")

>>>>>> JS为什么设置为单线程执行,而不是多线程执行
 作为浏览器脚本语言,JS的主要用途就是与用户交互,以及操作DOM。这决定了它只能是单线程。如果设置为多线程,就会带来很复杂的同步问题。

3.2 事件循环模型(JS单线程运行原理)

 +++ 事件循环模型由两部分组成1、事件管理模块(定时器/DOM事件/Ajax管理模块)2、回调队列
+++ 流程        1、执行初始化代码,将绑定的回调函数交给事件管理模块管理1) 定时器回调函数交给定时器管理模块2) DOM事件回调函数交给DOM事件管理模块3) Ajax回调函数交给Ajax事件管理模块2、事件执行时,管理模块会将回调函数添加到队列中3、只有当初始化代码执行完毕后(可能要一定的时间),JS引擎才会从任务队列中循环取出回调函数放入执行栈中执行。【事件循环模型处理流程指的是定时函数、事件绑定函数、Ajax的执行流程】
>>>>>> JS运行流程

 1、JS引擎执行主函数代码,在stack中执行,即在执行上下文栈执行。由于JS是单线程,所以只有一个执行上下文栈。2、JS引擎执行主代码,将绑定的回调函数交给事件管理模块管理。            事件管理模块主要包括:定时器管理模块、事件管理模块、Ajax管理模块3、当回调函数被触发时,事件管理模块会将回调函数放入到队列中等待执行。4、当主函数代码执行完毕,JS引擎会从任务队列中取出回调函数放入到栈中执行(一个接一个)

3.3 JS线程

 1、JS是单线程执行的。回调函数也是在主线程执行。2、H5提出了多线程方案:Web Workers3、只能在主线程更新界面,即操作DOM。

三、Web Workers

 H5规范提供了JS分线程的实现,取名为Web Worksers相关APIWorker:构造函数,加载分线程执行的js文件Worker.prototype.postMeaasge:开启线程,并另外一个线程发送信息Worker.prototype.onmessage:用于接收另一个线程的回调函数不足:Worker内代码不能操作DOM,即Worker内代码看不到window对象。不能跨域加载JS不是每个浏览器都支持分线程。
>>>>>> index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script type="text/javascript" src="a.js" ></script><script>function show(){//加载线程JS文件var worker=new Worker("a.js");//绑定接收分线程的数据的监听worker.onmessage=function(event){console.log("主线程接收数据:"+event.data)}//向分线程发送数据worker.postMessage(123);}</script></head>
<body><button onclick="show()">点击</button></body>
</html>
>>>>>> a.js

Worker内代码看不到window对象,所以不能操作DOM


function  tt(){console.log("123")
}var onmessage=function(event){console.log("分线程接收数据:"+event.data);tt();//向主线程发送数据postMessage("111")
}
>>>>>> 测试

五、JS单线程运行原理与多线程相关推荐

  1. Sea.Js的运行原理

    Sea.Js的运行原理 1.CMD(Common Module Definition)规范 Sea.js采用了和Node相似的CMD规范,使用require.exports和module来组织模块.但 ...

  2. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

    最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料,从浏览器 ...

  3. js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...

    前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...

  4. js 多个定时器_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(二)

    作者:撒网要见鱼   https://segmentfault.com/a/1190000012925872 本文接上篇 <从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(一)> ...

  5. Java程序的运行原理及JVM的启动是多线程的吗?

    Java程序的运行原理及JVM的启动是多线程的吗? A:Java程序的运行原理 Java通过java命令会启动java虚拟机.启动JVM,等于启动了一个应用程序,也就是启动了一个进程. 该进程会自动启 ...

  6. js为什么设置为单线程,怎么实现多线程

    js为什么设置为单线程,怎么实现多线程 进程和线程的区别 进程是cpu分配资源的最小单位(比如运行一个qq程序进程),是能拥有资源和独立运行的最小单位. 而线程是cpu调度的最小单位,一个进程中含有多 ...

  7. 23.多线程(进程的概述和多进程的意义,线程的概述和多线程的意义,JVM运行原理以及JVM启动的线程探讨,实现多线程 线程调度,线程控制,Lock锁,死锁现象)

    1.进程概述及多进程的意义 1.线程和进程     要想说线程,首先必须得聊聊进程,因为线程是依赖于进程存在的. 2.进程概述     什么是进程呢?通过任务管理器我们就可以看到进程的存在.      ...

  8. JS运行原理与机制(乾坤未定,你我皆是黑马4-5)

    上一篇讲的是js小游戏 实践了面向对象编程----------易于理解 我们记得小鸟.天空.管子就能记得这个游戏是怎么写出来的 js原理与运行机制 浏览器的渲染进程 进程与线程 进程是cpu资源分配的 ...

  9. 浏览器多线程和js单线程

    0.前言 开发过程中遇到js线程和ui渲染线程互斥问题.导致ui无法正常更新等问题.这些问题的根源就是因为浏览器的多线程和js的单线程引起的. 看本篇博客之前,应该充分理解消息队列,事件循环,同步异步 ...

最新文章

  1. 官方 | TensorFlow 2.0分布式训练教程
  2. fj怎么样_一朝中毒普拉多,万能解药FJ酷路泽
  3. Linux:echo、read、cat命令
  4. SAP用户权限相关操作
  5. Mozilla网站安全分析工具Observatory已发布
  6. Qt学习笔记之路径问题(window与linux下)
  7. 细说Linux 系统优化
  8. mysql yintint类型_MySQL服务器2 被嫌弃的胖子
  9. PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)
  10. css-阴影和超链接伪类
  11. c# Aspose.Words插入饼图PieChart
  12. NSNotFound
  13. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合
  14. 5.1傅里叶展开,傅里叶级数推导--非常棒
  15. 拓端tecdat|Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化
  16. 开发基于CXF的 RESTful WebService web 项目 webservice发布
  17. GitHub下载加速
  18. 教你快速打粤语正字 讯飞输入法语音输入1分钟400字
  19. Unix时间戳一天是多少?
  20. win10html网页运行空白,win10系统Ie浏览器无法打开HTML格式的网页文件的处理秒方...

热门文章

  1. Linux环境下,通过shell脚本实现一键部署MySQL,并支持多种类型
  2. 考研英语 - word-list-6
  3. NLP自然语言处理——文本分类(CNN卷积神经网络)
  4. Rust+物联网智能报警方案、Rust腐蚀智能电路教程
  5. 如何设置compileSdkVersion, minSdkVersion, and targetSdkVersion
  6. Unity-资源异步加载
  7. 在MyBatis中使用log4j
  8. 用Python查找关键字
  9. 最优化理论c语言代码,《统计学习导论基于R应用》PDF代码导图+《最优化理论与算法第2版》PDF习题指导...
  10. 云服务器镜像是什么?