进程
程序的一次执行,它占有一片独有的内存空间。可以通过windows任务管理器查看进程。
线程
线程是进程内的一个独立的执行单元。是程序执行的一个完整流程。是CPU最小的调度单元。
应用程序必须运行在某个进程的某个线程上。
一个进程中至少有一个运行的线程:主线程,进程启动后自动创建。
一个进程也可以运行多个线程。我们会说程序是多线程运行的。
一个进程中的数据可以供其中的多个线程直接共享。
多个进程间的数据是不能直接共享的。
线程池(Thread Pool):保存多个线程对象的容器,实现线程对象的反复利用。
单线程和多线程的区别:
多线程:
优点:有效的提高CPU的利用率。
缺点:
创建多线程会增大开销。
线程间的切换开销。
死锁与状态同步的问题。
单线程:
优点:顺序编程简单易懂。
缺点:效率低。
JS程序是单线程运行的。但使用HTML5中的Web Workers可以多线程运行。浏览器是多线程运行的。浏览器有单进程,也有多进程的。
浏览器内核
支撑浏览器运行最核心的程序。不同的浏览器内核可能不一样。内核是由很多模块组成的。
浏览器模块构成:
主线程:
- JS引擎模块:负责JS程序的编译与运行。
- HTML, CSS文档解析模块:负责页面文本的解析。
- DOM/CSS模块:负责dom/css在内存中的相关处理。
- 布局和渲染模块:负责页面的布局和效果的绘制(内存中的对象)。
分线程:
- 定时器模块:负责定时器的管理。
- 事件响应模块:负责事件的管理。
- 网络请求模块:负责ajax请求。
定时器
定时器真的是定时执行的吗?
定时器并不能保证真正的定时执行。一般会延迟一点,但是可以接受。也可能是延迟很长时间,不能接受。
原因是JS是单线程的。定时器的回调函数是在主线程执行的。所以回调函数的开始执行时间受主线程的影响。
定时器回调函数是在分线程执行的吗?
是在主线程执行的,因为JS是单线程的。
定时器是如何实现的?
事件循环模型
JS单线程
如何证明JS执行是单线程的?
setTimeOut的回调函数是在主线程中执行的。定时器的回调函数必须在运行栈中的代码全部执行完之后才可以执行。
代码分类:
- 初始化代码
- 回调代码
JS引擎执行代码的基本流程:
先执行初始化代码,包含一些特别的代码(设置定时器,绑定监听,发送ajax请求)。
后面某个时刻执行回调代码。
为什么JS要设计成单线程模式?
如果JS使用多线程,此时程序中有两个线程P1和P2。P1负责修改字段,P2负责删除字段。它们同时作用于字段P。假设刚开始是P1抢到了资源但是在修改操作执行之前,P2抢到了资源,将P的内容删除了,此时P1的修改操作会失败。而且多线程间的切换也会浪费系统的资源。
网友评论