系统调用
,那么此时进程就是正运行在内核态,而内核态的进程是不可被抢占的。
你说的这种情况,属于编译内核的时候开启了“内核可抢占”这个特性,这种情况下,即使进程正在内核态
执行系统
调用,也可以被其他进程抢占,这时,首先系统会在进程
结构体
中记录下这个进程当前是在内核态运行,然后,每个进程都有专属于自己的内核栈,系统会把当前的执行上下文信息都记录到这个进程的内核堆栈上。
以后这个进程恢复运行的时候,内核会从它的结构体中读到被打断前它处于内核态,进而从它的内核栈中读取当时的上下文信息并进行恢复,这样,进程就得以重新运行了。
有问题请追问
内核态抢占(KernelPreemption)
在2.6
kernel以前,kernelcode(中断和系统调用属于kernel
code)会一直运行,直到code被完成或者被阻塞(系统调用可以被阻塞)。在
2.6kernel里,Linuxkernel变成可抢占式。当从中断处理例程返回到内核态(kernel-space)时,kernel会检查是否可以抢占和是否需要重新调度。kernel可以在任何时间点上抢占一个任务(因为中断可以发生在任何时间点上),只要在这个时间点上kernel的状态是安全的、可重新调度的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)