19.进程和线程归纳

来源:http://www.chinese-glasses.com 作者:Web前端 人气:87 发布时间:2020-03-31
摘要:时间: 2019-10-30阅读: 84标签: 机制 1.线程与进程的区别? 2.线程和进程的关系、通性 3.既然,线程和进程是存在通性的,那么为什么操作系统还要设置线程这个单位,那就说说线程的几点好

时间: 2019-10-30阅读: 84标签: 机制

1.线程与进程的区别?
2.线程和进程的关系、通性
3.既然,线程和进程是存在通性的,那么为什么操作系统还要设置线程这个单位,那就说说线程的几点好处?
4.什么是多进程和多线程?
5.浏览器内核是多线程
6.javaScript单线程执行机制
7.Node.js单线程执行机制

js是单线程的,为什么可以执行异步操作呢?

1.线程与进程的区别?

1.进程是操作系统分配资源的最小单位,拥有独立的地址空间。计算机就像工厂,进程是个大车间,计算机内部有很多个这样的大车间;线程是程序执行的最小单位。同一个进程下的所有线程,共享进程的地址空间。线程是工人,每一个车间里的工人至少有一个。
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。
3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号)。
4.线程上下文切换比进程上下文切换要快得多。

这归结与浏览器(js的宿主环境)通过某种方式使得js具备了异步的属性。

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阻塞页面加载
10bet,从上面我们可以推理出,由于GUI渲染线程与JavaScript执行线程是互斥的关系,当浏览器在执行JavaScript程序的时候,GUI渲染线程会被保存在一个队列中,直到JS程序执行完成,才会接着执行。因此如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。比如渲染页面,而是直到js下载并执行完毕。
关于JavaScript的阻塞,要对其优化,注意:先让页面渲染完,再加载js。
a、将<script>内嵌和外链,在可以的情况下,放在<body>底部。注:对于css,浏览器是并行下载
b、在页面onload后,加载js
c、html5 <script>标签的defer属性,在页面加载完成后下载
d、使用创建<script>标签的方式,在页面加载完成后添加进去。

本文由10bet发布于Web前端,转载请注明出处:19.进程和线程归纳

关键词:

最火资讯