一切都运行在内存中
操作系统(OperatingSystem)
-
开机:操作系统在C盘中,当按下开机键时,主板通电,开始读取固件,(固件就是固定在主板上的储存设备,里面有开机程序)开机程序会将文件里的操作系统加载到内存中运行。
-
操作系统:首先加载操作系统内核,然后启动初始化进程,编号为1,每个进程都有编号!
-
启动系统服务:文件、安全、联网;
-
等待用户登录:输入密码登录/ssh登录;
-
登录后,运行shell,用户就可以和操作系统对话了;
打开浏览器
以Chrome浏览器为例
-
当你双击Chrome图标时,就会运行chrome.exe文件,开启Chrome进程,作为主进程;
-
主进程会开启一些辅助进程,如网络服务、CPU加速;
-
浏览器之所以能够运行,是因为系统给它的进程分配了资源(cpu、内存)
浏览器是是多进程的
你每新建一个网页,就可能开启一个子进程;(但有时相同域名会变成一个进程)
可以在更多工具——>任务管理器中查看进程,也可以在浏览器中使用快捷键 Shift+ESC
浏览器的功能
-
发起请求、下载HTML、解析HTML,下载CSS、解析CSS,渲染界面,下载JS、解析JS、执行JS等。
-
功能模块:用户界面、渲染引擎、JS引擎、存储等。
-
上面功能模块一般处于不同线程。
-
如果进程是车间,那么线程就是车间里的流水线。
线程是比进程更小的一个单位;
每个页面都会开两个线程,分别是
-
渲染引擎(渲染线程)
-
JS引擎(JS线程)
第一个:渲染引擎中,包括了HTML与CSS,首先下载HTML与CSS,之后去解析HTML与CSS,最后将HTML和CSS合起来显示到屏幕上的这个过程叫做渲染。
第二个:JS引擎,他是独立的,那他是怎么渲染的?答:线程通信。(JS引擎他不能直接去修改HTMl和CSS,他如果需要修改,得通知渲染引擎,这叫做跨线程通信。)
由于JS引擎跨线程通信了,所以DOM操作慢,这里的操作慢指的是 JS去操作渲染引擎用的时间,比执行JS线程内部(如遍历数组、字符串相加)任务用的时间长。
JS是单线程的
所谓单线程,就是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个,一次只能完成一件任务。
那为啥 js是单线程的呢?
主要与它的用途有关。作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。
比如,假定JavaScript 同时有两个线程,一个线程在某个 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript 就是单线程,这已经成了这门语言的核心特征,将来也不会改变。
为了利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程,但是子线程完全受主线程控制,且不得操作 DOM。所以,这个新标准并没有改变 JavaScript 单线程的本质。
JS引擎主要功能
- 编译 :把JS代码翻译为机器能执行的字节码或机器码;
- 优化 :改写代码,使其更高效;
- 执行 :执行上面的字节码或者机器码;
- 垃圾回收 :把JS用完的内存回收,方便之后再次使用;
JS引擎举例
- Chrome用的是V8引擎,C++编写
- 网景用的是SpiderMonkey,后被Firefox使用,C++
- Safari用的是JavaScriptCore
- IE 用的是Chakra(JScript9)
- Edge用的是Chakra (JavaScript)
- Node.js用的是V8引擎