1.线程与进程的区别?
2.线程和进程的关系、通性
3.既然,线程和进程是存在通性的,那么为什么操作系统还要设置线程这个单位,那就说说线程的几点好处?
4.什么是多进程和多线程?
5.浏览器内核是多线程
6.javaScript单线程执行机制
7.Node.js单线程执行机制
1.线程与进程的区别?
1.进程是操作系统分配资源的最小单位,拥有独立的地址空间。计算机就像工厂,进程是个大车间,计算机内部有很多个这样的大车间;线程是程序执行的最小单位。同一个进程下的所有线程,共享进程的地址空间。线程是工人,每一个车间里的工人至少有一个。
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。
3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号)。
4.线程上下文切换比进程上下文切换要快得多。
2.线程和进程的关系、通性
关系:进程中包含着至少一个线程。在进程创建之初,就会包含一个线程,这个线程会根据需要,调用系统库函数去创建其他线程。注意的是,这些线程之间是没有层级关系的,他们之间协同完成工作。在整个进程完成工作之后,其中的线程会被销毁,释放资源。
通性:都包含三个状态,就绪、阻塞、运行。通俗的讲,阻塞就是资源未到位,等待资源中。就绪,就是资源到位了,但是CPU未到位,还在运行其他。
3.既然,线程和进程是存在通性的,那么为什么操作系统还要设置线程这个单位,那就说说线程的几点好处?
线程微观并行。但是,在一个进程内部,一个线程阻塞后,会执行这个进程内部的其他线程,而不是整体阻塞。从某种意义上,提高了CPU的利用率。
4.什么是多进程和多线程?
多进程:多进程指的是在同一个时间里,同一个计算机系统中两个或两个以上的进程处于运行状态。多进程带来的好处是明显的,比如你可以听歌的同时,打开编辑器敲代码,编辑器和听歌软件的进程之间丝毫不会相互干扰。
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
5.浏览器内核是多线程(涉及到执行栈和事件队列)
浏览器内核是多线程,在内核控制下各线程相互配合以保持同步,常驻线程有:GUI 渲染线程、JavaScript引擎线程、定时触发器线程、事件触发线程、异步http请求线程
1.GUI渲染线程:负责渲染浏览器界面HTML元素,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。在Javascript引擎运行脚本期间,GUI渲染线程都是处于挂起状态的,也就是说被”冻结”了。
2.Javascript引擎线程:Javascript引擎,也可以称为JS内核,主要负责解析Javascript脚本,运行代码。
3.定时触发器线程:浏览器定时计数器不由JavaScript引擎计数的, 因为JavaScript引擎是单线程的, 就会处于阻塞线程状态, 因此通过单独的线程来计时并触发定时。
4.事件触发线程:当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可以是当前执行的代码块如定时任务、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。
5.异步http请求线程:在XMLHttpRequest在连接后是通过浏览器新开一个线程请求, 将检测到状态变更时,异步线程就产生状态变更事件放到 JavaScript引擎的处理队列中等待处理。
GUI 渲染线程 与 JavaScript引擎线程互斥!
由于JavaScript是可操纵DOM的,如果在修改这些元素属性同时渲染界面(即JavaScript线程和UI线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。因此为了防止渲染出现不可预期的结果,浏览器设置GUI渲染线程与JavaScript引擎为互斥的关系,当JavaScript引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到引擎线程空闲时立即被执行。
JS阻塞页面加载
从上面我们可以推理出,由于GUI渲染线程与JavaScript执行线程是互斥的关系,当浏览器在执行JavaScript程序的时候,GUI渲染线程会被保存在一个队列中,直到JS程序执行完成,才会接着执行。因此如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。比如渲染页面,而是直到js下载并执行完毕。
关于JavaScript的阻塞,要对其优化,注意:先让页面渲染完,再加载js。
a、将<script>内嵌和外链,在可以的情况下,放在<body>底部。注:对于css,浏览器是并行下载
b、在页面onload后,加载js
c、html5 <script>标签的defer属性,在页面加载完成后下载
d、使用创建<script>标签的方式,在页面加载完成后添加进去。
6.javaScript单线程执行机制
那么为什么Javascript要是单线程的?这是因为Javascript这门脚本语言诞生的使命所致:假设存在两个线程同时操作一个DOM,一个负责修改一个负责删除,那么这个时候就需要浏览器来裁决如何生效哪个线程的执行结果。
从哪里可以得出javaScript是单线程?比如你页面一上来就alert(“hello world~”);只要你不关闭这个对话框,后续的js代码就不会再执行。因为,单线程就是这样一步一步的顺次执行,前面不执行完,后面不会执行。
JavaScript明明可以处理各种触发事件,感觉上是异步多线程?其实,JavaScript单线程的执行浏览器的一个事件队列。浏览器是事件驱动的、异步多线程的。浏览器内部有一个事件轮询(event loop),也就是js要处理的事件队列。
7.Node.js单线程执行机制
Node.js其实还不是真正意义上的js,是借用了js语法实现的,达到真正意义的非阻塞服务端语言。但是他的运行机制,也是事件轮询 (Event Loop)。
网友评论