浏览器中进程与线程

一,首先使用快捷键Shift+Esc打开浏览器Chrome任务管理器,看到如下图界面:

可以看到浏览器默认有三个进程:

1,浏览器主进程(Browser进程)

浏览器主进程只有一个,作用有:

  • 负责浏览器界面显示,用户交互(前进、后退,关闭等)
  • 负责各个页面的管理,如创建和销毁其它进程
  • 将Render进程中得到的内存中的bitmap,绘制到用户界面上
  • 网络资源的管理,如下载

2,GPU进程

用于3d绘制等,如为dom元素添加css3样式-webkit-transform:translateZ(0),将使浏览器的渲染从cup转向gpu,开启gpu加速。

3,浏览器渲染进程(Render进程)

也被称为浏览器内核。

浏览器渲染进程的主要作用是页面渲染、脚本执行、事件处理等。

每一个标签页的打开都会创建一个浏览器渲染进程,默认打开的标签页根据域名划分在不同的进程中,不同域名之间的进程互不影响。

二,Browser进程,Render进程,GPU进程三者是如何协作的呢?

下面是一张关系图:

可以看到用户打开一个页面,首先控制的还是Browser主进程,然后我们再看一下chromium多线程模型:

基本工作方式如下:
Browser进程收到用户的请求,首先由UI线程处理,而且将相应的任务转给IO线程,他随机将该任务传递给Render进程;
Render进程的IO线程经过简单解释后交给渲染线程,渲染线程接收请求,加载网页并渲染网页,这其中可能需要Browser进程获取资源和需要GPU进程来帮助渲染,最后Render进程将结果由IO线程传递给Browser进程;
Browser进程接收到结果并将结果绘制出来;

三,浏览器渲染进程(Render进程)有哪些线程?

  • GUI渲染线程

负责浏览器界面渲染,解析HTML和CSS,构建Dom树和RenderObject树,布局、绘制等。

如果用户的操作引发了回流(reflow),或者界面发生重绘(repaint)时都会启动该线程。

  • JS引擎线程

也称为JS内核,主要负责JS脚本的解析执行,如Chrome的V8引擎。

JS引擎一直等待着任务队列中任务的到来,然后加以处理,一个Render进程中无论什么时候都只有一个JS引擎线程。

需要注意:GUI渲染线程和JS引擎线程是互斥的,如果JS脚本执行时间过长就会造成页面的渲染不连贯。

  • 事件触发线程

当JS引擎执行代码块如点击事件document.οnclick=function(){}或者$.ajax({})或者setTimeout(function(){},1000)等等代码块时,会将对应的任务添加到事件线程中,当符合条件的任务被触发时,事件触发线程会将该任务添加到待处理任务队列的末尾,等待JS引擎的处理。

  • 定时触发器线程

setInterval和setTimeout所在线程。

计时完毕后,添加到事件队列中,等待JS引擎的处理。

  • 异步http请求线程

在异步http请求触发后,浏览器会新打开一个线程请求。

该线程检测到状态变更时,如果设置有回调函数,异步线程就会产生事件变更,就会将该回调函数添加到事件队列,等待JS引起的处理。

四,JS为什么是单线程?

众所周知进程之间相互隔离互补影响,线程之间资源共享相互影响,试想一下如果JS是多线程,假如有thread1和thread2两个线程同时操作同一个Dom元素,thread1删除该Dom元素,thread2修改该Dom元素,同时下达两个矛盾任务让浏览器怎么执行呢,这就是为什么JS被设计成单线程。

参考链接:https://blog.csdn.net/it_rod/article/details/79880745

发布了54 篇原创文章 · 获赞 0 · 访问量 7700

猜你喜欢

转载自blog.csdn.net/yuyongkun4519/article/details/90375578