我们经常使用多线程提升程序执行速度,那是不是线程越多越好,显然答案是否定的。因为线程本身也会有不小的开销。开销主要体现在两方面:1、空间开销,2、时间开销
空间开销
空间开销主要体现在以下四方面:
- 线程内核对象(thread kernel object);
- 线程环境块(thread environment block,TEB);
- 用户模式栈(user-mode stack);
- 内核模式栈(kernel-mode stack);
空间开销-线程内核对象
1.定义:OS为系统中创建的每个线程都会分配并初始化这种数据结构之一
2.内容:
- 数据结构包含一组对线程进行描述的属性
- 数据结构还包括所谓的线程上下文。上下文是包含CPU寄存器集合的内存块
3.空间:不同的CPU架构,线上上下文的大小不同,如下图所示:
空间开销-线程环境块
1.定义:TEB是用户模式(应用程序能快速访问的地址空间)中分配和初始化的内存块
2.内容:
- TEB包含线程异常处理链首
- TEB还包含线程的“线程本地存储”数据,以及由GDI(Graphics Device Interface,图形设备接口)和OpenGL图形使用的一些数据结构