目录
- 一、线程与进程
- 1. 进程
- 2. 线程
- 3. 进程与线程的关系
- 二、浏览器内核
- 三、JavaScript的单线程
一、线程与进程
1. 进程
(1)概念:进程是指程序的一次执行,它占有一片独立的内存空间,在Windows操作系统下,我们可以通过任务管理器查看进程。
(2)分类:同一时间内,当计算机有两个或两个以上进程处于并行状态,则就是对进程;只有一个进程时,则就是单进程。
2. 线程
(1)概念:线程是进程内一个独立的执行单元,是cpu的基本调度单位,是程序执行的一个完整流程。
(2)多线程:多线程是指在一个进程内,同时有多个线程运行(浏览器的运行就是多线程的)。
(3)单线程与多线程:
- 单线程优点:简单易懂,编码简单
- 单线程缺点:效率低
- 多线程优点:有效提高cpu的利用率
- 多线程缺点:创建多线程开销大,线程间切换开销大
3. 进程与线程的关系
(1)一个进程至少有一个运行的线程,即主线程,进程启动后会自动创建。
(2)一个进程内的数据可以供多个线程直接共享使用,多个进程之间的数据不能直接共享使用。
(3)应用程序必须运行在某个进程的某个线程上面。
二、浏览器内核
- 概念:浏览器的内核是支持浏览器运行最核心的部分。浏览器内核可以分为两部分:渲染引擎和JS引擎。
- 主流浏览器的内核
(1)IE浏览器:Trident
(2)Firefox浏览器:Gecko
(3)Chrome浏览器:以前是Webkit,现在是Blink
(4)Safari浏览器:Webkit - 内核的模块及功能
- JS引擎模块:负责JS程序的编译与运行
- HTML,CSS文档解析模块 : 负责页面文本的解析
- DOM/CSS模块 : 负责dom/css在内存中的相关处理
- 布局和渲染模块 : 负责页面的布局和效果的绘制
- 定时器模块 : 负责定时器的管理
- 网络请求模块 : 负责服务器请求(常规/Ajax)
- 事件响应模块 : 负责事件的管理
三、JavaScript的单线程
- JavaScript的一大特点就是单线程,这主要和它的用途有关,作为一种浏览器的脚本语言,JavaScript的主要作用就是与用户的交互,以及操作DOM元素。
- 为了提高CPU的效率,在HTML5中,提出了Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。
- 任务队列
因为JavaScript的单线程的,所以任务在执行时很多时候CPU都会是空闲状态,所以就把任务分为了两种:同步任务和异步任务
- 同步任务:在主线程上排队执行的任务,只有当一个任务执行完毕,才会执行下一个任务。
- 异步任务:异步任务不进入主线程,而是进入任务队列,只有当任务队列通知主线程,异步任务可以执行时,该任务才会进入主线程执行。
- 异步任务的执行机制:
(1)所有的同步任务都在主线程执行,形成一个执行栈
(2)在主线程之外有一个任务队列,在同步任务执行过程中,异步任务会被放入任务队列中,成为等待状态
(3)等执行栈中所有的同步任务都执行完毕,系统就会读取任务队列,任务队列中的异步任务就结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上述步骤