抢占式内核中,线程在系统调用过程中被抢占,然后又被重新调度时,如何返回至被中断的系统调用的

抢占式内核中,线程在系统调用过程中被抢占,然后又被重新调度时,如何返回至被中断的系统调用的,第1张

首先,一般配置的linux,如果进程正在进行

系统调用

,那么此时进程就是正运行在内核态,而内核态的进程是不可被抢占的。

你说的这种情况,属于编译内核的时候开启了“内核可抢占”这个特性,这种情况下,即使进程正在内核态

执行系统

调用,也可以被其他进程抢占,这时,首先系统会在进程

结构体

中记录下这个进程当前是在内核态运行,然后,每个进程都有专属于自己的内核栈,系统会把当前的执行上下文信息都记录到这个进程的内核堆栈上。

以后这个进程恢复运行的时候,内核会从它的结构体中读到被打断前它处于内核态,进而从它的内核栈中读取当时的上下文信息并进行恢复,这样,进程就得以重新运行了。

有问题请追问

内核态抢占(Kernel

Preemption)

在2.6

kernel以前,kernelcode(中断和系统调用属于kernel

code)会一直运行,直到code被完成或者被阻塞(系统调用可以被阻塞)。在

2.6kernel里,Linuxkernel变成可抢占式。当从中断处理例程返回到内核态(kernel-space)时,kernel会检查是否可以抢占和是否需要重新调度。kernel可以在任何时间点上抢占一个任务(因为中断可以发生在任何时间点上),只要在这个时间点上kernel的状态是安全的、可重新调度的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8606330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-18
下一篇 2023-04-18

发表评论

登录后才能评论

评论列表(0条)

保存