首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

最细最有条理解析:事件循环(消息循环)是什么?为什么JS需要异步

2.1、浏览器的主要进程 浏览器内部工作极其复杂,为了避免相互影响,为了减少连环崩溃的几率,当启动浏览器后,它会自动启动多个进程。...③渲染进程 渲染进程启动后,会开启⼀个渲染主线程,主线程负责执行 HTML、CSS、JS 代码。...那渲染主线程如何执行和调度这些任务呢?总要有个章法去有序执行这些步骤,同时兼顾这些步骤的因果顺序和中途插入的步骤。...在添加新任务时,如果主线程是休眠状态,则会将其唤醒以继续循环拿取任务 简而言之,渲染主线程的消息队列就是渲染主线程的任务管家,负责给渲染主线程要执行的任务进行排序、管理、调度。...4.2、如何理解JS的异步 代码在执行过程中,会遇到一些无法立即处理的任务,比如: 计时完成后需要执行的任务 —— setTimeout、setInterval 网络通信完成后需要执行的任务

12301

windows 线程

另外可以使用Sleep函数使线程休眠一段时间后再启动,这个填入的时间只是一个参考值,并不是填入多少,就让线程暂停多久,比如说我们填入10ms,这个时候当线程真正陷入到休眠状态时CPU可能执行其他线程去了...然后运行调度程序,调度下一个线程,所以说线程休眠的时间理论上最少也有20ms,通常会比我们设置的时间长。...,也有可能在返回前执行,所以推荐使用这个标志,创建完成后,进行想干的初始化操作,并在必要的时候调用ResumeThread启动它。...,并用这个环境加载并执行新的函数,当这个函数执行完成后,再恢复线程环境,继续执行线程接下来的代码。...,一般调用GetTickCount计算调用前时间然后在算法函数调用完成后再次调用GetTickCount再次得到时间,这两个时间详相减则得到具体算法的时间,一般这种算法没有问题,但是需要考虑的时,如果在多任务环境下

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【操作系统】进程管理(二)「建议收藏」

    二、进程的基本概念   在未配置OS的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完成后,才允许另外一个程序执行;在多道程序环境下,则允许多个程序并发执行。...如当某个程序占用了处理机资源后,另外一个程序必须等待。   ③ 不可再现性,程序在并发执行时,由于失去了封闭性,也将导致其再失去可再现性。可能由于不同的操作顺序产生不同的结果。...② 父进程请求,有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。   ...② 启动某种操作,当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则必须先使该进程阻塞,以等待该操作完成。   ...,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。

    96520

    终究还是拿下字节!强度拉满!

    一致性就是要求上述步骤操作后,最后的结果是用户 A 还有 600 元,用户 B 有 800 元,总共 1400 元,而不会出现用户 A 扣除了 200 元,但用户 B 未增加的情况(该情况,用户 A 和...MySQL 如何保证原子性? 通过 undo log 来保证原子性的。 undo log 是一种用于撤销回退的日志。...thread.start(); // 启动线程 // 休眠 100ms,等待 thread 线程运行起来 Thread.sleep(100); System.out.println...RR 调度算法 每个进程被分配一个时间段,称为时间片(*Quantum*),即允许该进程在该时间段中运行。...如果进程运行时,有新进程进入较高优先级的队列,则停止当前运行的进程并将其移入到原队列末尾,接着让较高优先级的进程运行; 可以发现,对于短作业可能可以在第一级队列很快被处理完。

    18610

    浏览器原理 - 事件循环

    最近在抖音上刷到很多次 袁进老师 的前端视频,然后就听了一下他的前端大师课,感觉了解一些浏览器原理后,原来工作中的一些疑问也自然解开了。 浏览器的进程模型 何为进程?...为了避免相互影响,为了减少连环崩溃的几率,当启动浏览器后,它会自动启动多个进程。...我正在执行一个 JS 函数,执行到一半的时候某个计时器到达了时间,我该立即去执行它的回调吗? 浏览器进程通知我“用户点击了按钮”,与此同时,某个计时器也到达了时间,我应该处理哪一个呢?...在添加新任务时,如果主线程是休眠状态,则会将其唤醒以继续循环拿取任务 这样一来,就可以让每个任务有条不紊的、持续的进行下去了。整个过程,被称之为事件循环(消息循环)。 若干解释 何为异步?...代码在执行过程中,会遇到一些无法立即处理的任务,比如: 计时完成后需要执行的任务 —— setTimeout、setInterval 网络通信完成后需要执行的任务 – XHR、Fetch 用户操作后需要执行的任务

    1.8K30

    速读原著-TCPIP(TCP定时器示例)

    第22章 TCP的坚持定时器 一个例子 为了观察到实际中的坚持定时器,我们启动一个接收进程。它监听来自客户的连接请求,接受该连接请求,然后在从网上读取数据前休眠很长一段时间。...s o c k程序可以通过指定一个暂停选项 - P使服务器在接受连接和进行第一次读动作之间进入休眠。...在报文段1 3中,服务器确认了前面 4个数据报文段,然后通告窗口为 0,从而使客户停止发送任何其他的数据。这就引起客户设置其坚持定时器。...如果在该定时器时间到时客户还没有接收到一个窗口更新,它就探查这个空的窗口以决定窗口更新是否丢失。由于服务器进程处于休眠状态,所以T C P缓存9 2 1 6字节的数据并等待应用进程读取。...接收到应答使得定时器被重新启动,但到下一个时钟滴答之间的时间则约为5 0 0减4 ms。 计算坚持定时器时使用了普通的 T C P指数退避。

    43710

    进程管理及相关概念

    所以,在转入就绪队列之前就是创建状态。 终止状态:进程的终止要通过两个步骤:首先等待操作系统进行善后处理,然后将其PCB清零,并将PCB 空间返还系统。...创建原语:创建一个就绪状态的进程,使进程从创建状态变迁为就绪状态; 撤销原语:使进程从执行状态变迁为完成状态; 阻塞原语:使进程从运行状态变迁为阻塞状态,如:block; 唤醒原语:使进程从阻塞状态变迁为就绪状态...为使多个进程能互斥地访问某临界资源,只须为该资源设置一互斥信号量mutex,并设其初始值为1,然后将各进程访问该资源的临界区CS置于wait(mutex)和signal(mutex)操作之间即可。...解决方案: 让生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。 让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。...系统开销:在进程创建、撤销时,操作系统要创建和回收PCB,分配和回收各种资源;在进程切换时,涉及当前进程CPU环境的保存而新进程CPU环境的设置。

    63520

    事件循环的秘密,竟然影响着浏览器的一切!

    为了避免相互影响,为了减少连环崩溃的几率,当启动浏览器后,它会自动启动多个进程。 可以在浏览器的任务管理器中查看当前的所有进程。...网络进程内部会启动多个线程来处理不同的网络任务。 渲染进程:渲染进程启动后,会开启一个渲染主线程,主线程负责执行 html、css、js代码。...我正在执行一个JS 函数,执行到一半的时候某个计时器到达了时间,我该立即去执行它的回调吗? 浏览器进程通知我"用户点击了按钮",与此同时,某个计时器也到达了时间,我应该处理哪一个呢? .. ....在添加新任务时,如果主线程是休眠状态,则会将其唤醒以继续循环拿取任务。 这样一来,就可以让每个任务有条不紊的、持续的进行下去了。...代码在执行过程中,会遇到一些无法立即处理的任务,比如: 计时完成后需要执行的任务 -- setTimeout、setInterval 网络通信完成后需要执行的任务 -- XHR、Fetch 用户操作后需要执行的任务

    15510

    浏览器事件循环

    为了避免相互影响,为了减少连环崩溃的几率,当启动浏览器后,它会自动启动多个进程。...网络进程内部会启动多个线程来处理不同的网络任务。 渲染进程(本节课重点讲解的进程) 渲染进程启动后,会开启一个渲染主线程,主线程负责执行 HTML、CSS、JS 代码。...比如: 我正在执行一个 JS 函数,执行到一半的时候用户点击了按钮,我该立即去执行点击事件的处理函数吗? 我正在执行一个 JS 函数,执行到一半的时候某个计时器到达了时间,我该立即去执行它的回调吗?...在添加新任务时,如果主线程是休眠状态,则会将其唤醒以继续循环拿取任务 这样一来,就可以让每个任务有条不紊的、持续的进行下去了。 整个过程,被称之为事件循环(消息循环) 若干解释 何为异步?...代码在执行过程中,会遇到一些无法立即处理的任务,比如: 计时完成后需要执行的任务 —— setTimeout、setInterval 网络通信完成后需要执行的任务 -- XHR、Fetch 用户操作后需要执行的任务

    20520

    MIT 6.S081 教材第七章内容 -- 调度 --下

    一种常见的方法是,通过将进程多路复用到硬件CPU上,使每个进程产生一种错觉,即它有自己的虚拟CPU。本章解释了XV6如何实现这种多路复用。...Xv6使用了一种称为sleep和wakeup的方法,它允许一个进程在等待事件时休眠,而另一个进程在事件发生后将其唤醒。...其基本思想是让sleep将当前进程标记为SLEEPING,然后调用sched释放CPU;wakeup查找在给定等待通道上休眠的进程,并将其标记为RUNNABLE。...然后wakeup将看到睡眠进程并将其唤醒(除非有其他东西首先将其唤醒)。 有时,多个进程在同一个通道上睡眠: 例如,多个进程读取同一个管道。一个单独的wakeup调用就能把他们全部唤醒。...在子进程死亡时,父进程可能已经在wait中休眠,或者正在做其他事情;在后一种情况下,随后的wait调用必须观察到子进程的死亡,可能是在子进程调用exit后很久。

    36631

    xv6(17) 进程三:代码部分

    *chan, struct spinlock *lk); $sleep$ 使进程休眠在某个对象 $chan$ 上面,$lk$ 是管理这个对象的锁,但不一定归 $chan$ 所有,比如 sleep(curproc...; //将其状态更改为RUNNABLE } 唤醒操作就更简单了,挨个查询任务结构体,寻找状态为 $SLEEPING$ 且休眠对象为参数 $chan$ 的进程,然后将其状态更改为 $RUNNABLE$...休眠唤醒 休眠是休眠在某个对象上,唤醒是唤醒休眠在某个对象上的进程,所以想当然的可以这样来声明 $sleep$ 和 $wakeup$: void sleep(void *obj); void wakeup...我们需要在“进入休眠后释放该锁”,如果在这之前释放锁,可能会出现 $sleep$ 错过 $wakeup$ 的情况,原因同前。 但是都进入休眠状态了,怎么可能释放锁呢?...首先对这个头部做了对齐设计,使它满足最受限的类型,然后规定所有块的大小必须是这个头部的整数倍。因此在 malloc 分配内存的时候只要块大小满足,那么对齐要求肯定也是满足的。

    43410

    linux top命令 详解「建议收藏」

    休眠(被阻塞)的进程处于一个特殊的不可执行状态。进程休眠由多种原因,但肯定都是为了等待一些事件。事件可能是一段时间从文件I/O读取更多数据,或者是某个硬件事件。...还有,进程在获取键盘输入的时候也需要等待。无论哪种情况,内核的操作都相同:进程把自己标记成休眠状态,从可执行红黑树中移出,放入等待队列,然后调用schedule()选择和执行一个其他进程。...僵尸进程,一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它 的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程...,并不能将其完全销毁)。...top界面按i键,可以只显示状态为R的进程。 top界面按c键,可以显示进程的完整的名称。 top -s以安全模式启动top界面,可以防止在top界面对进程进行修改操作。

    1.7K20

    详解高级PHP工程师面试题

    在多人的团队中,我们应该在 master 分支上直接开发吗? 如果线上产生了bug该通过什么样方式的分支去修复? 当有多个分支的时候,测试如何有效的参与进来每一个分支的测试?...完成后合并到 develop 分支。 什么时候要预发分支? 这个分支是为预发准备的,测试的介入,也只应该在该分支产生时才介入。当我们不管是新功能开发,还是一般的bug修改都差不多了。...全部完成后,合并回develop,并且合并到master。 关于这个分支我得再多说几句。...它与release 很像,都需要完成后,同时合并到:master与develop。不同的是,它需要从master 上开一个分支出来。...通常我们用的kill命令就是发送某个信号给某个进程的。具体有哪些信号可以在liunx/mac中运行kill -l查看。下面这个例子中,父进程等待5秒钟,向子进程发送sigint信号。

    58320

    Java多线程与并发

    所有与进程相关的资源,都被记录在PCB(进程控制块)中。 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源。 线程只由堆栈寄存器、程序计数器和TCB组成。...B、C线程在进入对象的 synchronized方法(或者块)之前必须先获得该对象锁的拥有权,而恰巧该对象的锁目前正被线程A所占用,此时B、C线程就会被阻塞,进入一个地方去等待锁的释放,这个地方便是该对象的锁池...等待池(Object.wait( )): 假设线程A调用了某个对象的wat()方法,线程A就会释放该对象的锁,同时线程A就进入到了该对象的等待池中,进入到等待池中的线程不会去竞争该对象的锁。...300ms,然后主线程给t1发“中断”指令。...300ms,然后查看t1的状态。

    19430

    Java多线程基础

    进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间。...线程应用案例2-实现Runnable 接口 java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然不可能了。...java设计者们提供了另外一个方式创建线程,就是通过实现Runnable接口来创建线程 应用案例 请编写程序,该程序可以每隔1秒。在控制台输出“hi!”,当输出10次后,自动退出。...所以一般用于中断正在休眠线程。 sleep:线程的静态方法,使当前线程休眠。...当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。 同步的局限性:导致程序的执行效率要降低。

    29710

    多线程(一):NSThread

    因为 run loop 在没有任何事件处理的时候会把它的线程置于休眠状态,它消除了消耗 CPU 周期轮询,并防止处理器本身进入休眠状态并节省电源。...也就是说一个普通线程的自动释放池在线程结束时才会把drain pool,而开启了run loop的线程会每次循环后释放并且重新建立。 线程同步 线程编程的危害之一是在多个线程之间的资源争夺。...如果多个线程在同一个时间 试图使用或者修改同一个资源,就会出现问题。缓解该问题的方法之一是消除共享资 源,并确保每个线程都有在它操作的资源上面的独特设置。...2、NSThread线程操作 //取消线程,并不是停止线程,这个只是一个标志位,对应isCanceled - (void)cancel; //启动线程 - (void)start; //判断某个线程的状态的属性...使用的方式为接收线程中注册NSMachPort,在另外的线程中使用此port发送消息,则被注册线程会收到相应消息,然后最终在主线程里调用某个回调函数。

    36620

    Linux设备驱动程序(五)——并发和竞态

    当一个 Linux 进程到达某个时间点,此时它不能进行任何处理时,它将进人休眠(或“阻塞”)状态,这将把处理器让给其他执行线程直到将来它能够继续完成自己的处理为止。...在等待 I/O 完成时,进程经常会进入休眠状态。 我们可以使用一种锁定机制,当进程在等待对临界区的访问时,此机制可让进程进人休眠状态。...当一个线程成功调用上述 down 的某个版本之后,就称为该线程“拥有”(或“拿到”、“获取”)了该信号量。这样,该线程就被赋予访问由该信号量保护的临界区的权利。当互斥操作完成后,必须返回该信号量。...四、Completions 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束。...在需要修改该数据结构时,写入线程首先复制,然后修改副本,之后用新的版本替代相关指针,这也是该算法名称的由来。 作为 RCU 的实际使用示例,可考虑网络路由表。

    43731
    领券