本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址:www.dtdishui.com 论坛地址:www.dtdebug.com QQ交流 :49759272
内容回顾 在之前课程里面讲到了线程的等待链表和调度链表 这节课我们开始学习Windows的线程切换,线程切换比较复杂 为了更好的学习,我们要先读一份代码: 模拟Windows线程切换(ThreadSwitch)
1、关键结构体 //线程结构体(仿EHREAD) typedef struct { char *name; //线程名 相当于线程TID int Flags; //线程状态 int SleepMillisecondDot; //休眠时间 void *InitialStack; //线程堆栈起始位置 void *StackLimit; //线程堆栈界限 void *KernelStack; //线程堆栈当前位置,也就是ESP void *lpParameter; //线程函数的参数 void (*func)(void *lpParameter); //线程函数 } GMThread_t;
2、调度链表 //线程结构体数组 extern GMThread_t GMThreadList[MAXGMTHREAD]; name Flags ... 所谓创建线程,就是创建一个 结构体,并且挂到这个数组中 此时的线程状态为:创建
3、初始化线程堆栈 StackLimit eax edx ecx ebx esi edi ebp Startup 9 GMThreadp name Flags ... 低 KernelStack 高 InitialStack
4、线程切换 当前线程 目标线程 ... eax edx ecx ebx esi edi eax edx ... ebp Startup 9 GMThreadp 保留ESP 切换ESP
5、线程的第一次运行: (参见课堂演示)
6、模拟线程切换总结: 1) 线程不是被动切换的,而是主动让出CPU. 2) 线程切换并没有使用TSS来保存寄存器,而是使用堆栈. 3) 线程切换的过程就是堆栈切换的过程.
7、课后练习: VIP会员可见