【Javascript】探究javascript中的堆/栈/任务队列与并发模型 event loop的关系
栏目: JavaScript · 发布时间: 5年前
内容简介:在javascript中,存在调用栈 (call stack):CallStack是用来处理函数调用与返回的。特点是先进后出,每次调用一个函数,Javascript运行时会生成一个新的调用结构压入CallStack。而函数调用结束返回时,JavaScript运行时会将栈顶的调用结构弹出。由于栈的LIFO特性,每次弹出的必然是最新调用的那个函数的结构。内存堆(memory head):
在javascript中,存在 调用栈 (call stack)
和 内存堆(memory heap)
,程序中函数依次进入栈中等待执行,若执行时遇到异步方法,该异步方法会被添加到用于回调的 任务队列(task queue)
中,【即JavaScript执行引擎的单线程拥有一个调用栈、内存堆和一个任务队列】
调用栈 (call stack):CallStack是用来处理函数调用与返回的。特点是先进后出,每次调用一个函数,Javascript运行时会生成一个新的调用结构压入CallStack。而函数调用结束返回时,JavaScript运行时会将栈顶的调用结构弹出。由于栈的LIFO特性,每次弹出的必然是最新调用的那个函数的结构。 函数调用会形成了一个堆栈帧,存放基本数据类型的变量
内存堆(memory head): 引用数据类型被存放在堆中 ,在我们进行浅复制时,我们改变的只是引用数据类型在栈内存中的引用地址,实际上它在堆内存中的引用地址仍然没有发生变化
任务队列(task queue):javaScript 运行时包含了一个待处理的任务队列。
并发模型 与 EventLoop
javascript引擎是单线程的,它的并发模型基于 Event Loop(事件循环)
当线程中的同步任务执行完, 执行栈
为空时,则从 任务队列(task queue)
中取出异步任务进行处理。这个处理过程包含了调用与这个任务相关联的函数(以及因而创建了一个初始堆栈帧)。当 执行栈
再次为空的时候,也就意味着该任务处理结束,从任务队列中取出下一个异步任务进行处理,不断重复,这个过程是循环不断的, 所以整个的这种运行机制又称为 Event Loop(事件循环)
.
以上所述就是小编给大家介绍的《【Javascript】探究javascript中的堆/栈/任务队列与并发模型 event loop的关系》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- GCD(一) 队列、任务、串行、并发
- 并发编程(十)—— Java 并发队列 BlockingQueue 实现之 SynchronousQueue源码分析
- 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析
- 并发编程(八)—— Java 并发队列 BlockingQueue 实现之 ArrayBlockingQueue 源码分析
- 【高并发】为何高并发系统中都要使用消息队列?这次彻底懂了!
- Golang实现简单爬虫框架(4)——队列实现并发任务调度
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出Rust
范长春 / 机械工业出版社 / 2018-8-21 / 89.00元
本书详细描述了Rust语言的基本语法,穿插讲解一部分高级使用技巧,并以更容易理解的方式解释其背后的设计思想。全书总共分五个部分。 第一部分介绍Rust基本语法,因为对任何程序设计语言来说,语法都是基础,学习这部分是理解其他部分的前提。 第二部分介绍属于Rust独一无二的内存管理方式。它设计了一组全新的机制,既保证了安全性,又保持了强大的内存布局控制力,而且没有额外性能损失。这部分是本书......一起来看看 《深入浅出Rust》 这本书的介绍吧!