浏览器、操作系统与JavaScript语言的一些知识
进程与线程
参考文章:
阮一峰的网络日志--进程与线程的简单解释
进程的介绍
进程(process): 当有应用程序需要启动时,操作系统就会自动启动一个或多个进程来维持整个应用程序的运行,应用程序是运行在进程的线程中的
进程中的数据是不能够直接共享的
线程的介绍
线程(thread): 是进程内的最小单位,同时也是CPU最小的调度单元
一个进程中, 多个线程内的数据可以共享,但是为了数据的一致性和防止同时操作内存,就会涉及各种锁的概念,这里不过多介绍(其实因为我不会...)
进程与线程的关系:
- 一个进程必然有一个线程, 这个线程成为主线程
- 一个进程可以有多个线程
这里还要简单介绍一个概念: 线程池(thread pool),它作为一个容器用于保存多个线程,实现线程的反复利用
比较单线程与多线程
单线程优点: 代码编写相对简单,不轻易涉及到锁的概念
单线程缺点: 执行效率低
多线程优点: 有效地提升CPU的利用率
多线程缺点:
- 创建多线程需要有额外的开销
- 线程间的转换也需要有额外的开销
- 维持线程同步容易遇到死锁与状态同步问题
JavaScript是单线程语言
JavaScript是单线程语言,但是在HTML5中的Web Workers可以多线程运行,但是Web Workers中的子线程不能操作DOM,同时子线程必须受控于主线程,所以本质上JavaScript仍然是一门单线程语言
浏览器内核
不同浏览器会使用不同的内核(引擎),内核的好快直接影响的就是浏览器的运行速度
内核是由多个模块组成的:
- JS引擎模块: 负责js程序的编译与运行
- html,css文档解析模块
- DOM/CSS 模块: 负责DOM/CSS 在内存中的相关处理
- 布局与渲染模块: 负责将解析好的文档树和效果绘制到浏览器页面中
- 定时器模块: 负责定时器的管理
- 事件相应模块: 负责各种事件的管理
- 网络请求模块: 负责http、ajax等网络请求