相比较学过后端语言的小伙伴,前端小伙伴对进程和线程了解的并不多,但实际上JS是单线程的,浏览器是多线程的,了解这些对前端编程还是很有帮助的。
进程与线程
首先还是聊一聊进程和线程,好多地方习惯性的会先说线程,我们这里先聊聊进程:
进程
程序的一次执行,就是一个进程,比如打开一个word,执行一次helloword脚本,这里一定要理解,程序的一次执行,进程是用来描述程序执行的,而不是程序代码本身。在window下ctrl+alt+delete查看进程管理器,在linux的ps命令都可以看到当前系统当中运行的进程。
进程拥有自己的进程id,独立的内存地址,相互之间如果想实现通信是很困难的,当然为了执行的效率,开发者也可以通过多进程来执行程序(就好比一个人收割庄稼,效率不够,那么多几个人一起来收割庄稼,这样就是多进程)。
线程
线程是进程的一部分,刚才聊进程的时候,好多小伙伴会疑惑,进程是程序的一次运行,那么当我打开一款游戏,通过进程管理器看到他只有一个进程,但是里面可以实现同时放音乐,响应玩家操作等等多种功能,这是这么回事呢,那就是线程,线程是进程的一部分,一个进程当中可以有多个线程,他们共享进程的内存空间,负责进程执行过程当中的功能,当然多线程也是可以提高执行效率的。
JS单线程
js本身研发出来就是为了和html交互,页面交互过程当中,有很明显的执行顺序色彩,如果采用多线程,线程之间的抢占和切换很同意导致JS的执行顺序发生变化,或者执行发生冲突,所以JS是单线程的,所以,编写JS代码之前,写执行的流程对编写代码是非常有帮助的,这里要知道的是由于JS单线程,所以有意向的特点:
1、单线程意味着不可能出现两个线程,或者并发,那么只有一个任务执行结束,才会执行另外一个任务,这个是编写JS代码一定要清醒认知的。
2、单线程事件轮训,导致一个事件执行完成,才会执行另外的事件,所以,当网速慢或者页面图片大的时候,我们可以清楚的看到页面上的JS事件一一执行。也这是因为这个,JS有了同步和异步的说法:
(1)同步,就是上面我们描述的JS轮训,一件事一件事的执行。
(2)异步,发起任务之后,并不将线程放到轮训当中等待任务执行完成,而是执行其他任务,等之前的任务执行完成,再次切换回来接受结果,比如现在留下的异步请求技术:ajax,axios等等。
浏览器多进程
作为解析html,css,js的软件,浏览器是多进程的,那chrome浏览器来说,当一个页面被加载,chrome浏览器至少需要4种进程:
1、浏览器进程,负责浏览器的启动和运行
2、网络进程,浏览器需要通过解析网络地址来获取要解析的内容
3、渲染进程,用来将html的内容结合css,js渲染出来,也就是之前聊过的渲染树(renderDOM)
4、插件进程,运行用户安装的chrome官方或者三方的插件,比如:postman
当然仔细的聊的话还是有很多细节,比如渲染进程当中的JS引擎进程等等,我们之后具体每一块的细聊,还是请给位大佬多多指点吧。