CLR via C# 读书笔记 1-2 创建线程的成本

在clr中创建线程的代价还是比较高的 ,他需要两个部分

内存:

  1. 线程核心对象, 存放描述线程的一些内容和上下文 . (内存消耗:700B-2500B)
  2. 线程环境,存放例如异常处理链之类. (内存消耗 1Page  4k-8k)
  3. 用户模式堆栈, 存放 参数 变量等  ,这也就是平时我们说的堆栈和堆的区别中的堆栈  (内存消耗:1MB)
  4. 核心模式堆栈, (内存消耗12KB-24KB)

基本上看来好像就消耗了1MB多一些的内存....不过如果你知道你的机器上一般都运行着数百个线程....可能就觉得这个数字太大了

 

CPU调度和上下文切换.

  CPU在不同线程中切换的时候,需要卸载掉前一个线程的上下文,并加载后一个线程的上下文.

  这也是一个非常消耗资源的操作

 

考虑到这两个原因,一般在非必要情况下,尽可能的不创建线程,或者优先使用线程池

 

PS1:每个普通的windows线程 (不是.net线程)也需要消耗1M的堆栈

PS2:widnows线程和.net线程 现在是1对1的,不过不保证在将来的实现中也是一对一的

PS3:运行在SYSTEM下的线程可能做了特殊的处理并没有消耗那么多的内存

PS4:书中提到每次切换上下文的时间是30MS,但是我个人觉得这个数字有点问题,似乎粒度不够细

PS5:考虑到线程创建的成本,尽可能的复用它,就像线程池一样

PS6:线程的成本低只是相对于进程而言,其实线程还是非常消耗资源的动作

PS7:真正创建和分配内存的动作在:Thread.Start, 而不在构造函数的时候

posted on   听说读写  阅读(2892)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下

导航

< 2010年11月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示