进程:
程序的一次执行,他占有一片独有的内存空间,可以通过windows任务管理器查看进程
线程:
是进程的一个独立执行单元,是程序执行的一个完整流程,是cpu最小的调度单元
相关知识:应用程序必须运行在某个进程的某个线程上
一个进程中至少有一个运行的线程,主线程,进程启动后自动创建
一个进程中也可以同时运行多个线程,我们会说程序是多线程运行的
一个进程内的数据可以供其中的多个线程直接共享
多个线程之间的数据是不能直接共享的
线程池:保存多个线程对象的容器,实现线程对象的反复利用
多进程与多线程
多进程:一应用程序可以同时启动多个实例运行
多线程:在一个进程内同时有多个线程运行
问题1:定时器是不是定时执行?(经典面试题)
* 定时器并不能保证真正定时执行
* 一般会延迟一点(可以接受),也有可能延迟很长时间(不能接受)
console.log('执行定时器前');
setTimeout(function (){
console.log('定时器执行');
},2000)
console.log('执行定时器后');
结果是:并不像所设想的在定时器执行后才console.log('执行定时器后')
实际上该时间是将该回调函数推到任务队列的时间。如果队列中没有其他任务则执行,否则会将向后延长
问题2:定时器是不是在分线程执行?
* 在主线程执行的,JS是单线程的
* setTimeout()的回调函数是在主线程执行的
* 定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行
* JS为什么采用单线程模式,而不用多线程模式
* JavaScript的单线程,与他的用途有关
* 作为浏览器脚本语言,JavaScript的主要用途是与用户互动的,以及操作DOM
* 这决定他是可以是单线程的,否则会带来很复杂的同步问题
问题3:定时器是如何执行的?
* 事件循环模型
同步任务:同步任务都在主线程上执行,形成一个执行栈
异步任务:JS的异步是通过回调函数实现的
一般来说,异步任务有以下类型:
1.普通事件,如click,resize等
2.资源加载,如load,error等
3.定时器,包括setInterval,setTimeout等
异步任务相关回调函数添加到任务队列中(任务队列也称为消息队列)
JS执行机制
1.先执行执行栈中的同步任务
2.异步任务(回调函数)放入任务队列中
3.一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行
在异步模式下,创建异步任务主要分为宏任务与微任务两种。ES6 规范中,宏任务(Macrotask) 称为 Task, 微任务(Microtask) 称为 Jobs。宏任务是由宿主(浏览器、Node)发起的,而微任务由 JS 自身发起。
下面是一个文章的链接,详细介绍了宏任务与微任务的执行顺序并且有执行图,必看
http://events.jianshu.io/p/fd15db94a034