进程与线程
进程:程序的一次执行,它占有一片独有的内存空间;可以通过windows任务管理器查看进程
线程:是进程内的一个独立执行单元;是程序执行的一个完整流程;是cpu的最小的调度单元
图解:
相关知识:
1.应用程序必须运行在某个进程的某个线程上
2.一个进程中至少有一个运行的线程:主线程,进程启动后自动创建
3.一个进程中也可以同时运行多个线程,我们会说程序是多线程运行的
4.一个进程内的数据可以供其中的多个线程直接共享
5.多个进程之间的数据是不能直接共享的
6.线程池(thread pool):保存多个线程对象的容器,实现线程对象的反复利用
相关问题:
1.何为多进程与多线程
多进程:一应用程序可以同时启动多个实例运行
多线程:在一个进程内,同时有多个线程运行
2.何为单线程与多线程
多线程:
优点:能有效提升CPU的利用率;
缺点:创建多线程开销;线程间切换开销;死锁与状态同步问题
单线程:
优点:顺序编程简单易懂
缺点:效率低
3.JS是单线程运行的;但使用H5中的Web Workers可以多线程(主线程、分线程)运行
4.浏览器运行是多线程的
5.浏览器运行有多进程的(chrome、新版IE),也单进程的(firefox、老版IE)
浏览器内核
1.支撑浏览器运行的最核心的程序
2.不同浏览器内核可能不一样
Chrome,Safari: webkit
firefox: Gecko
IE : Trident
360/搜狗灯国内浏览器:Trident + webkit
3.内核由很多模块组成
主线程:
JS引擎模块:负责js程序的编译与运行
HTML,CSS文档解析:负责页面文本的解析
DOM/CSS模块:负责dom/css在内存内中的相关处理
布局和渲染模块:负责页面的布局和效果的绘制(内存中的对象)
分线程:
定时器模块:负责定时器的管理
DOM事件响应模块:负责事件的管理
网络请求模块:负责ajax请求
定时器引发的思考
1.定时器真的是定时执行的吗?
定时器并不是真正定时执行
一般会延迟一小会,也可能延迟很长时间
2.定时器回调函数是分线程执行的吗?
在主线程执行的,JS是单线程
3.定时器是如何实现的?
事件循环模型
JS是单线程执行的
1.如何证明JS执行是单线程的?
setTimeout()的回调函数是在主线程执行的
定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行
2.为什么JS要用单线程模式?
与它的用途有关
作为浏览器脚本语言,JS主要用途是与用户交互,以及操作DOM
这决定了它只能是单线程,否则会带来复杂的同步问题
3.代码分类
初始化代码
回调代码
4.JS引擎执行代码的基本流程
先执行初始化代码,包含一些特别的代码 回调函数(异步执行)
-设置定时器
-绑定事件监听
-发送ajax请求
后面在某个时刻才会执行回调代码