学习内核锁之前,我们先了解一下关于内核的基础知识,以便更好的学习内核锁的使用!
下面我们先学习一下进程调度:
一、进程调度
调度什么时候发生?即:schedule()函数什么时候被调用?
调度的发生有两种方式:
1、主动式
在内核中直接调用schedule()。当进程需要等待资源等而暂时停止运行时,会把状态置于挂起(睡眠),并主动请求调度,让出CPU。
主动放弃cpu例:
1. current->state = TASK_INTERRUPTIBLE;
2. schedule();
2、被动式(抢占)
用户抢占(Linux2.4、Linux2.6)
内核抢占(Linux2.6)
用户抢占发生在:
* 从系统调用返回用户空间。
* 从中断处理程序返回用户空间。
内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占.
* ENTRY(ret_from_exception) //异常返回 get_thread_info tsk mov why, #0 b ret_to_user * __irq_usr: //在用户态收到中断 usr_entry kuser_cmpxchg_check …… …… …… b ret_to_user ENTRY(ret_to_user) ret_slow_syscall: disable_irq @ disab