堆为何如此之慢?

合集 · 直观理解计算机技术【CoreDumped】 (68)

  1. 11:03
    代码中指定变量类型为何如此重要?
  2. 13:46
    栈为何如此之快?
  3. 17:53
    堆为何如此之慢?
  4. 19:56
    动态数组的内部机制(ArrayList VS LinkedList)
  5. 15:37
    探索计算机并发与多任务处理的历史
  6. 12:54
    晶体管是如何运行代码的?
  7. 16:12
    晶体管是如何记忆数据的?
  8. 18:47
    制作一个CPU来运行程序
  9. 11:23
    计算机如何将字符串转换为数字
  10. 17:18
    动态随机存取存储器(DRAM)的工作原理
  11. 16:05
    计算机处理器是如何运行条件和循环的?
  12. 6:51
    一个程序不是一个进程
  13. 14:52
    深入理解进程,如何进行上下文切换?计算机科学中最深刻和最成功的想法之一。
  14. 20:20
    处理器内部的单个位如何保护操作系统的完整性?
  15. 13:14
    计算的心跳:时钟如何推动 CPU 前进?
  16. 14:22
    英语原声版-计算的心跳:时钟如何推动 CPU 前进?
  17. 14:15
    (英语原声)进程间通信:共享内存或发送消息
  18. 12:29
    (中文配音)进程间通信:共享内存或发送消息
  19. 14:59
    (中文配音)为什么单核处理器需要线程?
  20. 16:07
    (英语原声)为什么单核处理器需要线程?
  21. 9:26
    (中文配音)多核系统上的线程
  22. 11:27
    (英语原声)多核系统上的线程
  23. 11:52
    (中文配音)为什么应用程序是特定于操作系统的?
  24. 13:09
    (英语原声)为什么应用程序是特定于操作系统的?
  25. 13:15
    (英语原声)硬件如何在多任务处理中协助软件?
  26. 11:29
    (中文配音)硬件如何在多任务处理中协助软件?
  27. 20:34
    链表的一个实际应用
  28. 45:02
    让你的电脑运行更流畅的奇妙算法
  29. 43:38
    (流畅中文配音)让你的电脑运行更流畅的奇妙算法
  30. 19:41
    (原声双语字幕)当程序调用 sleep() 时会发生什么?
  31. 17:57
    (流畅中文配音)当程序调用 sleep() 时会发生什么?
  32. 20:40
    这个简单算法驱动了真正的解释器:Pratt Parsing
  33. 18:19
    (双语字幕)编程中最难以捉摸的Bug:竞态条件
  34. 19:23
    (流畅中文配音)编程中最难以捉摸的Bug:竞态条件
  35. 16:02
    (中文配音)阻止内存攻击的底层电路
  36. 14:51
    (英语原声)阻止内存攻击的底层电路
  37. 18:04
    为什么有些项目会使用多种编程语言?
  38. 19:32
    为什么有些项目会使用多种编程语言?
  39. 17:15
    别再杀进程了!让 Ctrl+C 变成“喵”……(用信号实现)
  40. 19:23
    别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)
  41. 19:05
    80 年代避免竞态条件的算法(以及它为何失败)
  42. 19:43
    80 年代避免竞态条件的算法(以及它为何失败)
  43. 22:10
    CPU如何与众多不同设备交互?
  44. 23:52
    (中文配音)CPU如何与众多不同设备交互?
  45. 14:04
    (中文配音)你每天都在用的奇特CPU操作
  46. 13:04
    你每天都在用的奇特CPU操作
  47. 18:04
    (中文配音)历史如何塑造了我们今天仍在使用的编程术语?
  48. 17:42
    (英语原声)历史如何塑造了我们今天仍在使用的编程术语?
  49. 16:41
    为什么有些底层项目里会充满这种奇怪的代码?
  50. 16:39
    (中文配音)为什么有些底层项目里会充满这种奇怪的代码?
  51. 21:35
    编译与解释代码如何共处同一程序中?
  52. 21:30
    (英语原声)编译与解释代码如何共处同一程序中?
  53. 17:09
    【双语字幕】Core Dumped 常见问题的集中回答
  54. 13:36
    【双语字幕】90年代的设计决策阻碍了Python并行化
  55. 12:01
    【中文配音】90年代的设计决策阻碍了Python并行化
  56. 17:51
    Linux创建进程的奇怪方式
  57. 18:14
    【中文配音】Linux创建进程的奇怪方式
  58. 19:49
    CPU如何运行函数?
  59. 19:38
    【中文配音】CPU如何运行函数?
  60. 17:15
    没有人解释的问题:内核的边界在哪里?
  61. 19:36
    【英语原声】没有人解释的问题:内核的边界在哪里?
  62. 35:49
    硬件如何让线程问题不再那么棘手?
  63. 19:47
    为什么在macOS、Windows和Linux上安装应用程序如此不同?
  64. 24:00
    游戏公司真的能破坏你的电脑吗?
  65. 10:43
    一个视频说透“架构”:为什么你的程序换个CPU就可能跑不了?
  66. 14:45
    CPU如何执行有符号和无符号运算?
  67. 19:11
    简单指令, 奇妙算法
  68. 9:26
    当CPU遇到它不认识的指令,会发生什么?😱【底层原理】
Description
在这个视频中,我们深入探讨了计算机内存管理的两个核心概念:栈和堆。首先,我们回顾了栈的优势和局限,解释了为什么栈适合存储小且固定大小的数据,但不适合动态大小的数据。接着,我们介绍了堆的概念,这是一个可以动态分配和释放内存的区域,非常适合处理大型或变化的数据结构。

我们详细讨论了系统调用的原理,以及它们对性能的影响。系统调用是程序请求操作系统资源的方式,但它们可能会引入显著的性能开销。此外,我们解释了内存分配策略,包括首次适应、最佳适应和最差适应,以及它们如何影响内存碎片化。

视频还介绍了如何使用指针在堆上存储数据,以及如何管理内存子区域,以区分已占用和空闲的区域。我们探讨了链表和数组列表(通常称为向量)作为解决栈限制的动态数据结构,并讨论了它们在内存中的存储方式。

最后,我们讨论了为什么堆管理比栈管理更复杂,以及如何负责任地使用堆来避免常见的内存管理错误。我们强调了,尽管堆分配可能看起来慢,但一旦分配完成,访问堆内存可以和栈一样快。

如果你对深入理解计算机内存管理感兴趣,或者你是一名程序员想要优化你的程序性能,这个视频将为你提供宝贵的知识。别忘了点赞和订阅,以获取更多关于编程和计算机科学的深入解析!

Comments

豆哥写系统 2024-06-03

实际上堆的速度和栈是一样的,说堆的速度慢并不正确,应该说堆内存申请慢 这才正确

♥ 202 ↩ 46

花火-火 2024-06-09

根据视频内容小小的总结: 栈比堆“快”的地方在于 1.栈由于是块数据连续的区域,在CPU的策略上更容易被缓存命中一些 2.栈的内存空间在一开始就分配好了,而堆的内存空间是实时分配与回收,在操作系统层来说要执行更多的步骤,相对比较“费” 对于动态数组: 1.堆并没有解决导致数组越界的风险,因为一个数组,无论在堆还是栈上,分配的内存空间都是固定的 2.有一种可行的方案就是使用合理的数据结构,比如链表

♥ 82 ↩ 1

魅影南山 2024-06-03

建议传两份 一份原声 一份配音 这样观众有更多选择

♥ 44 ↩ 9

先阿呆 2024-06-03

快速看了讲堆和讲栈的视频,总体感觉作为一个讲述基础知识的技术性视频,部分内容不严谨,会让初学者误会。比如虽然在讲栈的视频里说明了栈的大小是可调整的,但在讲堆的视频里却说栈永远无法改变大小。还有就是视频标题与内容不是完全匹配的。比如讲堆的视频里有大量的时间在讲内存的管理机制,感觉是在凑时间。

♥ 29 ↩ 3

离霜_mk 2024-08-27

实际上堆分配内存的速度很大程度上和标准库使用的算法相关。在早期的Linux系统中使用了ptmalloc,它具有良好的线程并发的支持;后来Linux更换了slab的分配算法性能有所提升(或者我们应该说这是glibc中的malloc的算法)。还有许多知名的分配算法如Chrome和Safari中使用的tcmalloc,Facebook和Firefox使用的jemalloc,这些算法使用复杂的数据结构而非简单的链表管理空闲内存,使得堆内存分配的速度大大提升,即便动态内存分配的速度仍然不能够和栈上内存分配的速度相当,但是在小规模场景下已经变得可以忽略不计了。此外,值得一提的是,不管什么内存分配算法,通常在兼容posix标准的操作系统中,内存分配算法会先通过brk和sbrk系统调用先从操作系统申请大块内存,然后再根据需求将内存分配给用户。

♥ 24

究极广告哥 2024-06-04

实际上要考虑的还有内存命中率,堆的分配比较散,需要重复去内存同步数据

♥ 15

ylcao_ 2024-06-03

最近这种ai配音的越来越多了,注意力更集中,是趋势

♥ 12 ↩ 4

xiaoxiaoyuer 2024-06-04

我觉得up要讲操作系统原理[doge]

♥ 8

是多少十五 2024-06-14

因为经历了两个call 申请堆内存,释放堆内存,而栈就不一样了, 一种是操作esp,一种操作ebp,但是栈空间很小大概15000字节左右好像编译器就开始说栈太大有风险,这是我最近遇到的[doge]

♥ 7

是四季sama 2024-06-03

AI配音有点听不惯,建议up加个中文字幕就好

♥ 6 ↩ 3

湮花惹人怜 2024-06-04

hi,朋友们,我叫乔治[doge]绷不住了 但是内容挺好[脱单doge]

♥ 5 ↩ 6

账号已注销 2024-06-03

有点混淆了,比如说嵌入式操作系统FreeRTOS中它的任务使用的是栈的概念嘛?是不是它没有用到堆的概念啊?那是不是可以再开发的过程中把堆大小设置为零呢?有大佬解答嘛?

♥ 5 ↩ 6

求知无坦途_ 2024-09-01

请问一个极端场景,比如把系统的最大栈空间强行设置为15GB,倘若该设备的内存只有16GB,对于15GB的数据而言,此时栈和堆的速度还有明显差距嘛?

♥ 4 ↩ 8

Happy的大番薯 2024-06-29

堆是因为要申请内存,只是申请内存慢。

♥ 4 ↩ 1

ayayaya_dot_org 2024-06-04

难绷,Java 之类的语言,堆分配很多时候只需要把 arena 指针移一下,是很快的

♥ 4 ↩ 11

shita09 2024-10-30

1.os分配堆空间这个过程耗时。这个涉及到os内存动态分配的整个流程。栈直接在编译阶段就完成了,没有额外的消耗。 2.一般的对内存都是比较大的,如果出现页对齐问题,会出现内存访问时间抖动,这个涉及到cache、tlb和DDR的加速机制。一般栈比较小,除非人为一般都能利用好这个加速机制。甚至编译器直接你安排好寄存器直接运算。 3.CPU的总线机制、内核处理器后端流水线的问题和解码宽度总体的问题。这个涉及到汇编器和具体CPU内核微架构的。可能会出现,解码指令等待甚至取消,也涉及命中问题。会导致运行速度的间歇性偶发性延迟,特别是负载高的情况下。 4.还有的就是swap机制,对于休眠或者功耗调度,内存访问可能导致触发swap机制,这个就会出现肉眼可见的慢。 5.单片机没有mmu类的,这个问题没啥好讨论的。dsp那种哈佛架构的只能说是专用化大力出奇迹,硬件架构上针对性优化有比没有的好不少。 实际上主要两个问题,CPU存储外设访问速度的金字塔结构以及OS内存机制。

♥ 3

PandaEngine 2024-06-10

没看视频。不过我觉得堆之所以“慢”是因为大多数堆操作都是CPU高速缓存不友好。一个作用域内栈数据都是靠在一起的缓存友好。而访问多个堆数据它们可能离得很远!缓存不友好[doge]

♥ 2

21065002753_bili 2024-06-03

爽爽爽!又有新视频啦!

♥ 2

银白渡己 2024-06-03

这个系列,我每个都会投币

♥ 2 ↩ 1