线程
原生线程
操作系统管理的线程,N个寄存器
- CPU各个寄存器的值的数据结构,上下文切换
- 单个逻辑核心,执行一个线程(轮流)
线程切换
- 主动切换
- 被动切换,强制切换==抢占(硬件计时器),最大时间时间片
线程调度
线程栈空间
- 托管线程,.NET Core 基于原生线程模型.NET管理的线程托管线程
一个托管线程==一个原生线程 0:1 1:1的关系,一个Thread对象关联一个原生线程
托管代码创建、Start方法后,创建新的原生线程关联线程对象
.NET运行时内部使用同时创建
线程本地存储、托管函数/非托管函数、分配上下文、执行下文……
标准的线程操作接口,最终也是调用系统函数(c++),来操作原生线程
运行时:管理托管线程对象(调用系统API操作)关联原生线程
两种模式
GC *z找出所有存活对象,清理没有引用的对象
负责执行扫描与清理对象的GC线程 需要停止其他线程的运行
负责分配对象或者改变对象引用关系的其他线程
为了线程更安全配合GC工作,防止死锁的发生
.NET引入两种模式
- 抢占模式:不能访问托管堆上的对象,等待GC结束,切换到合作模式
- 合作模式:可以自由访问托管堆上的对象
托管代码必须在合作模式上运行,非托管代码没有限制
切换方式:
- 主动切换:自己切换自己,托管代码通过P/Invoke调用非托管代码
- 被动切换:一个线程切换其他线程的模式,GC线程切换其他线程到抢占模式
合作模式->抢占模式,即挂起线程,必须让线程停在GC安全点,jit编译器元数据(GC信息*线程运行到某条指令时,哪些位置有引用类型的对象,这些对象会作为根扫描对象)