- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题不仅仅适用于 C# 和 Asp.net,但更具体地问对我来说更容易。
当一个 Asp.net 请求等待一个异步 IO 操作时,线程基本上进入线程池以供其他请求重用。为什么这比在 IO 操作完成之前让线程休眠更有效?毕竟当线程返回到线程池时,它的栈需要保存在内存中才能完成原来的请求。我的假设是我们不能重用分配给线程的内存,除非我们在其他地方复制使用过的堆栈内存,并且复制数据可能会引入额外的开销,这可能是不合理的。
我错过了什么吗?我的假设错了吗?请解释。
编辑:jlew 指出的答案缺少一点。当线程返回到池中时,请求使用的堆栈内存会发生什么变化?如果我们不能重用内存,那么重用线程有什么意义呢?如果我们想重用堆栈中未使用的部分,那么我们将不得不移动一些内存。如果是这样,移动内存并重用未使用的堆栈内存是否会提高整体效率?
最佳答案
Why is this more efficient than just sleeping the thread until the IO operation is finished?
将线程视为 worker 。 worker 很贵。你想付钱给 worker sleep 吗?不。你想付钱让 worker 做尽可能多的工作;如果他们被阻塞,您可以让他们处理其他事情,而不是 sleep ,直到阻塞被清除。
线程非常昂贵。如果线程很便宜,那么可以肯定的是,我们可以做很多。您只对昂贵的资源使用池化策略。
线程主要在两个方面很昂贵:您提到堆栈的大小,即每个线程保留 1MB 的虚拟内存。但是OS层面的开销也很大,没有针对千线程场景进行优化。确定下一个要运行的线程、上下文切换到它以及从它切换出去,所有这些都具有非零成本,并且随着线程数量的增加而增加。理想情况下,您需要 n 个处理器机器中的 n 个独立线程,不多也不少。
After all, when the thread is returned to the thread pool, its stack needs to be kept in memory to finish the original request.
我无法理解这句话的正反面。当线程回到池中时,它的堆栈指针又回到底部。
My assumption is that we cannot reuse the memory allocated to the thread unless we copy used stack memory somewhere else and copying data may introduce additional overhead that may not be justified.
我开始理解它了。你的心智模型是:
这种心智模型看似合理,但却是错误的。异步工作流构建状态机并将延续捆绑为该机器中的状态,然后将对状态机的引用存储在任务中。激活信息从堆栈槽提升到闭包类的字段中。这会将继续/激活信息从堆栈中取出并放入堆中。
现在请记住,任务的延续并不包含堆栈中的所有信息;它不是“调用当前延续”意义上的真正延续,它捕获当前方法完成时发生的事情。它捕获当前等待的任务 完成时发生的情况,这就足够了。
请记住,堆栈只能用作“下一步我要做什么?”时的延续的具体化。工作流在逻辑上是一个堆栈 -- 您接下来要做的事情是堆栈顶部的事情。但是异步工作流形成了一个等待连接点的依赖树;它首先不是堆栈,因此将延续表示为堆栈是行不通的。
What happens to the stack memory used by the request when the thread is returned to the pool?
只要线程继续存在,为线程堆栈保留的百万字节虚拟内存就会保留。意识到这一点很重要!这就是线程在 .NET 中如此昂贵的原因之一。就操作系统内存管理器而言,这 1MB 的虚拟内存已 100% 使用,无论堆栈中有多少已被压入。这 1MB 中的大部分在其生命周期的大部分时间里都是垃圾。
当线程返回池时,指向该堆栈高水位线的指针被移回开头,超出它的所有内容现在都是垃圾。
If we cannot reuse the memory, then what is the point of reusing the thread?
我们可以重用内存;堆栈指针被重置。
If so, does moving memory around and reusing unused stack memory improve overall efficiency?
我没有理解这个问题的主旨;我怀疑这是基于错误的前提。你能改一下吗?
关于c# - 异步编程、线程和效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41173279/
第一个 .on 函数比第二个更有效吗? $( "div.container" ).on( "click", "p", function(){ }); $( "body" ).on( "click",
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 7 年前。 Improve
我有这样的查询: $('#tabContainer li'); JetBrains WebStorm IDE 将其突出显示为低效查询。它建议我改用这个: $('#tabContainer').find
我刚刚在 coursera ( https://www.coursera.org/saas/) 上听了一个讲座,教授说 Ruby 中的一切都是对象,每个方法调用都是在对象上调用发送方法,将一些参数传递
这可能是用户“不喜欢”的另一个问题,因为它更多的是与建议相关而不是与问题相关。 我有一个在保存和工作簿打开时触发的代码。 它在 f(白天与夜晚,日期与实际日期)中选择正确的工作表。 周一到周三我的情况
这只是我的好奇心,但是更有效的是递归还是循环? 给定两个功能(使用通用lisp): (defun factorial_recursion (x) (if (> x 0) (*
这可能是一个愚蠢的问题,但是while循环的效率与for循环的效率相比如何?我一直被教导,如果可以使用for循环,那我应该这样做。但是,实际上之间的区别是什么: $i = 0; while($i <
我有一个Elasticsearch索引,其中包含几百万条记录。 (基于时间戳的日志记录) 我需要首先显示最新记录(即,按时间戳降序排列的记录) 在时间戳上排序desc是否比使用时间戳的函数计分功能更有
使用Point2D而不是double x和y值时,效率有很大差异吗? 我正在开发一个程序,该程序有许多圆圈在屏幕上移动。他们各自从一个点出发,并越来越接近目的地(最后,他们停下来)。 使用 .getC
我正在编写一个游戏,并且有一个名为 GameObject 的抽象类和三个扩展它的类(Player、Wall 和 Enemy)。 我有一个定义为包含游戏中所有对象的列表。 List objects; 当
我是 Backbone 的初学者,想知道两者中哪一个更有效以及预期的做事方式。 A 型:创建一个新集合,接受先前操作的结果并从新集合中提取 key result = new Backbone.Coll
最近,关于使用 LIKE 和通配符搜索 MS SQL 数据库的最有效方法存在争论。我们正在使用 %abc%、%abc 和 abc% 进行比较。有人说过,术语末尾应该始终有通配符 (abc%)。因此,根
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想知道,这样做会更有效率吗: setVisible(false) // if the component is invisible 或者像这样: if(isVisible()){
我有一个静态方法可以打开到 SQL Server 的连接、写入日志消息并关闭连接。我在整个代码中多次调用此方法(平均每 2 秒一次)。 问题是 - 它有效率吗?我想也许积累一些日志并用一个连接插入它们
这个问题在这里已经有了答案: Best practice to avoid memory or performance issues related to binding a large numbe
我为我的 CS 课(高中四年级)制作了一个石头剪刀布游戏,我的老师给我的 shell 文件指出我必须将 do while 循环放入运行者中,但我不明白为什么?我的代码可以工作,但她说最好把它写在运行者
我正在编写一个需要通用列表的 Java 应用程序。该列表需要能够经常动态地调整大小,对此的明显答案是通用的Linkedlist。不幸的是,它还需要像通过调用索引添加/删除值一样频繁地获取/设置值。 A
我的 Mysql 语句遇到了真正的问题,我需要将几个表连接在一起,查询它们并按另一个表中值的平均值进行排序。这就是我所拥有的... SELECT ROUND(avg(re.rating
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is there a difference between i==0 and 0==i? 以下编码风格有什么
我是一名优秀的程序员,十分优秀!