首页 > 其他分享 >事件循环

事件循环

时间:2023-10-14 17:55:08浏览次数:25  
标签:浏览器 渲染 队列 主线 任务 循环 线程 事件

事件循环与浏览器有关,需要先了解其进程模型。

浏览器的进程模型

进程

程序运行需要其专属的内存空间,用于存储变量、执行函数等操作,可以将这块内存空间简单地理解为进程。

每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。

process_thread

线程

有了进程后,就可以运行程序的代码了,由线程运行代码。

一个进程至少有一个线程,在进程开启后会自动创建一个线程来执行代码,称为主线程

如果主线程结束了,那么进程就结束了。

如果程序需要同时执行多块代码,主线程就会启动更多的线程来执行代码,所以一个进程中可以包含多个线程。

浏览器的进程和线程

浏览器是一个多进程多线程的应用程序。

为了避免相互影响,为了减少连环崩溃的几率,当启动浏览器后,它会自动启动多个进程。

现代浏览器已经非常复杂了,复杂程度在向操作系统靠近。

image-20231012141200080

启动chrome浏览器,打开其任务管理器:

image-20231012141407647

可以发现尽管没有访问任何网页,也有一些进程是自动启动的

打开一个新的标签页,这里打开了百度,可以发现不同的标签页属于不同的进程

image-20231012142226444

其中,最主要的进程有:

  1. 浏览器进程

    浏览器进程是最先启动的进程,其它进程由它启动。

    主要负责界面显示、用户交互、子进程管理等。浏览器进程内部会启动多个线程处理不同的任务。

    这里的界面显示不是指网页的内容渲染,而是指浏览器的界面,比如浏览器的头部:

    image-20231012142510968

    用户交互是指用户在浏览器上的点击、键盘、滚轮等操作,浏览器需要监听这些用户交互操作。

    子进程管理包含网络进程、渲染进程等等。

  2. 网络进程

    负责加载网络资源。网络进程内部会启动多个线程来处理不同的网络任务。

  3. 渲染进程

    渲染进程启动后,会开启一个渲染主线程,主线程负责执行HTML、CSS、JS代码。

    默认情况下,浏览器会为每个标签页开启一个新的渲染进程,以保证不同的标签页之间不相互影响。

    这种模式可能会在以后的版本被替换掉,因为每个标签页都开启一个新渲染进程会导致chrome成为“内存杀手”。——2023.10

    Chromium Docs - Process Model and Site Isolation (googlesource.com)

    标签:浏览器,渲染,队列,主线,任务,循环,线程,事件
    From: https://www.cnblogs.com/feixianxing/p/frontend-message-loop-process-thread-in-browser.html

相关文章

  • lesson13-键盘监听事件
      packagecom.zym.lesson13;importjavax.swing.*;importjava.awt.*;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;publicclassTestKeyboardListener{publicstaticvoidmain(String[]args){newKeyWinFrame("lesso......
  • lesson12-窗口监听事件
      packagecom.zym.lesson12;importjavax.swing.*;importjava.awt.*;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassTestWindowListener{publicstaticvoidmain(String[]args){newWinFrame("less......
  • cefsharp 循环从多个页面提取数据
    foreach(varurlinurls){varloaded=false;Action<object,FrameLoadEndEventArgs>frameLoadEndProc=(s,args)=>{if(args.Frame.IsMain&&args.Frame.Url==url.Value){loaded=true;......
  • lesson11:鼠标监听事件-绘点
      packagecom.zym.lesson11;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.util.ArrayList;importjava.util.Iterator;//测试鼠标监听事件publicclassTestMouseListener{publicstaticvoidmain(String[]args){......
  • Vue学习笔记(十):全局事件总线
      之前博客中介绍了prop和调用事件的方式在父-子组件之间进行数据,这种方式在只有一层嵌套层时可以使用,但是路过存在多层嵌套,多层多个“兄弟”组件之间传递数据,就非常麻烦。对此,vue中提供了一种全局事件总线机制,数据传递是通过一个空的Vue实例作为中央事件总线,通过它......
  • 循环增删 ArrayList ,小心有坑
    编程过程中常常需要使用到集合,比如:ArrayList,当我们在for循环增删的时候,一不小心就会踩坑。如下代码List<String>arrayList1=newArrayList<String>();arrayList1.add("1");arrayList1.add("2");for(Strings:arrayList1){if("1".equals(s)){......
  • Python 循环用法
    序言在当今信息时代,高效编程已成为程序员必备的技能之一。而Python作为一种流行的编程语言,以其简洁、优美的语法和丰富的库而闻名。在Python中,循环语句是一种非常实用的编程技巧,可以帮助我们简化代码,提高效率。本文将介绍Python中的循环语句,并探讨如何打造高效编程利器。一、......
  • 常见等待事件oracle
    概念描述在Oracle数据库中,等待事件是指在数据库操作过程中,进程因等待某些资源或条件而产生的等待状态。例如,当一个进程正在等待某种工作,或正在诊断和优化数据库时,就会出现等待事件。具体来说,当一个Oracle进程连接到数据库后,它将会经历一系列的等待事件,这些等待事件可以被分类为空闲......
  • JS堆、栈以及事件循环的概念
    前言其实一开始对栈、堆的概念特别模糊,只知道好像跟内存有关,又好像事件循环也沾一点边。面试薄荷的时候,面试官正好也问到了这个问题,当时只能大方的承认不会。痛定思痛,回去好好的研究一番。我们将从JS的内存机制以及事件机制和大量的(例子)来了解栈、堆究竟是个什么玩意。概念比较多......
  • 笨办法学Python3 习题33 while 循环
    while循环只要循环语句中的条件布尔值为True,就会不停的执行下面的代码块命令。while循环是无边界循环,forin循环是有边界循环和if语句的相似点都是检查一个布尔表达式的真假,if语句是执行一次,while循环是执行完跳回到while顶部,如此重复,直到布尔值为假False尽量少用w......