电脑的进程科普
开机
- • 主板通电
- • 读取固件
- • 开机程序找操作系统
- • 将操作的系统加载到内存中
操作系统
- • 启动操作系统内核
- • 启动一个进程编号为1
- • 编号为1的进程再启动系统服务
- • 等待用户输入密码登录
- • 用户双击Chrome便会启动Chrome的进程
打开Chrome
- • 双击Chrome图标,运行Chrome.exe文件
- • 开启Chrome进程作为主进程
- • 主进程会开启一些辅助进程
- • 每开启一个网页就可能会开启一个子进程
浏览器的功能
- • 发起请求,下载HTML,解析HTML,下载CSS,解析CSS,渲染界面,下载JS,解析JS,执行JS等
- • 功能模块: 用户界面,渲染引擎,JS引擎,储存等,每个模块一个线程
- • 上面功能模块一般各处于不同的线程
举例 : 互联网创业公司分为各个行业可以称为进程,而每个公司里面的每个小组可以称为线程。 DOM操作慢是因为跨线程通信
图解
JS引擎
Js引擎举例
- • Chrome用的是V8引擎,c++编写
- • 网景用的SpiderMonkey,后来被Firefox使用,C++编写
- • Safari用的是JavaScriptCore
- • Node Js用的是V8引擎 平时默认的就是V8引擎
主要功能
1. 编译 : 把js代码翻译为机器能执行的字节码或机器码
2. 优化 : 改写代码,使其更高效
3. 执行 : 执行上面的字节码和机器码
执行js代码准备工作
-
• 提供API : Window/Document/setTimeout
-
• 上面这些东西不是JS自身具备的,是浏览器为我们提供的东西
-
• 我们将这些功能称为运行环境runtime env
-
• 一旦把js放进页面,就开始执行js
关于一些问题:
-
Js代码在哪里运行?
答:内存
- Js代码加载到哪里的内存?
答: 内存被所有系统的瓜分 首先是操作系统 其次有Chrome(Crown里面有辅助进程和各种页面) 每个页面又分三个线程(分别是 渲染线程,用户界面线程,js引擎线程) 主要是js引擎线程(一部分为代码区,一部分为环境区,一部分为数据区Stack和heap)
红色区域介绍
作用
- • 红色专门用来存放数据,我们目前只研究该区域
- • 红色区域并不存变量名
- • 每种浏览器的分配规则并不一样
- • 上图的区域并不完整
Stack和heap
- • 红色区域分为stack栈和Heap堆
- • Stack区特点 : 每数据顺序存放(后续补充效率很低)
- • Heap区特点 : 每个数据随机存放(便于后期补充)
Stack和heap举例
- • 代码
var a = 1
var b = a
var person = {name:'tang',child:{name:'Jack'}}
var person2 = person
当a=1时,b=a=1
当P name=tang 地址108 时,则p2=p= tang=108
P2 修改name='x'后,则P1 name='x'
- • 规律 数据分两种 : 非对象和对象 非对象都存在Stack 对象都存在Heap(数组和函数都是对象) = 号总是会把右边的东西复制到左边(不存在什么传值和传址)
4. 垃圾回收 : 把JS用完的内存回收,方便之后再次使用
浏览器为我们提供了运行环境Window
同时还要有以下这些:
因为方便,挂在window上的东西可以在任何地方直接用
Window在内存里面的实际存放方式如图
抽象一点的Windows里的面内存图
细节
JS的三座大山
1. this
2. 原型链
3. AJAX
关于原型链的问题
注 : JS在创立时已经在内存里存了Object.prototgpe对应的对象和Arrag.prototgpe对应的对象,这两个放在内存里就是给你创建一个对象时来引用的,当我们创建一个对象就引用#409,创建一个数组就引用9527
#409存的是所有普通对象所共有的属性
在篡改时,一层可以,两层不行
每一个对象都有一个隐藏属性
我们只关心首字母小写对象的隐藏属性
隐藏属性叫:
__proto__
区别:
总结图
注:资料内容来自饥人谷