当前位置: 技术问答>linux和unix
线程切换的问题
来源: 互联网 发布时间:2016-08-26
本文导语: 假设有2个线程:A和B。开始时A一直运行,并且进入内核,运行在内核态。经过一段时间以后,发生线程切换,并且在这段时间之内,A一直运行在内核态。当切换至B时,我的理解是需要将当前EAX,EIP等寄存器的...
假设有2个线程:A和B。开始时A一直运行,并且进入内核,运行在内核态。经过一段时间以后,发生线程切换,并且在这段时间之内,A一直运行在内核态。当切换至B时,我的理解是需要将当前EAX,EIP等寄存器的值保存到A的系统堆栈中,以备A再次被调度运行时使用。
奇怪的是好像没有发现在线程切换时保存了这些寄存器的值。很困惑,难道运行在内核态时不需要用到EAX,EIP这些寄存器?望各位指点一下。
奇怪的是好像没有发现在线程切换时保存了这些寄存器的值。很困惑,难道运行在内核态时不需要用到EAX,EIP这些寄存器?望各位指点一下。
|
1、A 和 B除非在clone是指定共享内存,否则线程切换必须保存上下文环境
2、switch宏中有保存上下文,Lz没有找对地方
#define switch_to(prev, next, last)
asm volatile(SAVE_CONTEXT......)
#define SAVE_CONTEXT "pushf ; pushq %%rbp ; movq %%rsi,%%rbpnt"
3、上下文切换是和系统调度分不开的,是在schedule函数中间接调用的,
而schedule函数不只在一个地方调用比如进程或线程阻塞或退出主动让出CPU、时间片用完在时钟中断调用、新进程或线程产生,而新线程的优先级高于当前线程也会调用。
|
上下文切换:
在Linux操作系统中,上下文是指处理器运行代码的寄存器环境,上下文切换必然进行寄存器保存和恢复。每个线程都处于各自的线程上下文环境、每个中断都处于各自的中断上下文环境。线程调度引发的是线程与线程之间的上下文切换,中断可能引发线程到中断之间的上下文切换,也可能引发中断到中断之间的上下文切换。
线程与线程上下文件切换的核心为:宏switch_to和例程__switch_to(),包括了将寄存器esp保存到thread.esp中,并加载新的值。
在Linux操作系统中,上下文是指处理器运行代码的寄存器环境,上下文切换必然进行寄存器保存和恢复。每个线程都处于各自的线程上下文环境、每个中断都处于各自的中断上下文环境。线程调度引发的是线程与线程之间的上下文切换,中断可能引发线程到中断之间的上下文切换,也可能引发中断到中断之间的上下文切换。
线程与线程上下文件切换的核心为:宏switch_to和例程__switch_to(),包括了将寄存器esp保存到thread.esp中,并加载新的值。