From bce3b4e8c42853e25b7ef588499aa2eb8aceba4a Mon Sep 17 00:00:00 2001 From: gatieme Date: Thu, 23 Jun 2016 23:51:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E8=B0=83=E5=BA=A6=E4=B9=8B?= =?UTF-8?q?=E4=BC=98=E5=85=88=E7=BA=A7=E8=AF=A6=E8=A7=A3...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../05-schedule/06-preempt/README.md | 175 ++++++++++++++++++ .../06-preempt/images/NonPreemptiveKernel.png | Bin 0 -> 15099 bytes .../06-preempt/images/PreemptiveKernel.png | Bin 0 -> 12690 bytes 3 files changed, 175 insertions(+) create mode 100644 study/kernel/01-process/05-schedule/06-preempt/images/NonPreemptiveKernel.png create mode 100644 study/kernel/01-process/05-schedule/06-preempt/images/PreemptiveKernel.png diff --git a/study/kernel/01-process/05-schedule/06-preempt/README.md b/study/kernel/01-process/05-schedule/06-preempt/README.md index 259f170..50900c6 100644 --- a/study/kernel/01-process/05-schedule/06-preempt/README.md +++ b/study/kernel/01-process/05-schedule/06-preempt/README.md @@ -60,6 +60,7 @@ linux内核目前实现了6中调度策略(即调度算法), 用于对不同类 stop_sched_class -> dl_sched_class -> rt_sched_class -> fair_sched_class -> idle_sched_class ``` + **3个调度实体** 调度器不限于调度进程, 还可以调度更大的实体, 比如实现组调度. @@ -105,3 +106,177 @@ linux中针对当前可调度的实时和非实时进程, 定义了类型为sech + + +#非抢占式和可抢占式内核 +------- + +为了简化问题,我使用嵌入式实时系统uC/OS作为例子 + +首先要指出的是,uC/OS只有内核态,没有用户态,这和Linux不一样 + +多任务系统中, 内核负责管理各个任务, 或者说为每个任务分配CPU时间, 并且负责任务之间的通讯. + +内核提供的基本服务是任务切换. 调度(Scheduler),英文还有一词叫dispatcher, 也是调度的意思. + +这是内核的主要职责之一, 就是要决定该轮到哪个任务运行了. 多数实时内核是基于优先级调度法的, 每个任务根据其重要程度的不同被赋予一定的优先级. 基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行. 然而, 究竟何时让高优先级任务掌握CPU的使用权, 有两种不同的情况, 这要看用的是什么类型的内核, 是**不可剥夺型**的还是**可剥夺型内核** + +##非抢占式内核 +------- + +**非抢占式内核**是由任务主动放弃CPU的使用权 + +非抢占式调度法也称作合作型多任务, 各个任务彼此合作共享一个CPU. 异步事件还是由中断服务来处理. 中断服务可以使一个高优先级的任务由挂起状态变为就绪状态. + +但中断服务以后控制权还是回到原来被中断了的那个任务, 直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。非抢占式内核如下图所示. + +![非抢占式内核](./images/NonPreemptiveKernel.png) + +非抢占式内核的优点有 + +* 中断响应快(与抢占式内核比较); + +* 允许使用不可重入函数; + +* 几乎不需要使用信号量保护共享数据, 运行的任务占有CPU,不必担心被别的任务抢占。这不是绝对的,在打印机的使用上,仍需要满足互斥条件。 + +非抢占式内核的缺点有 + +* 任务响应时间慢。高优先级的任务已经进入就绪态,但还不能运行,要等到当前运行着的任务释放CPU。 +* 非抢占式内核的任务级响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决于应用程序什么时候释放CPU。 + +##抢占式内核 +------- + +使用抢占式内核可以保证系统响应时间. 最高优先级的任务一旦就绪, 总能得到CPU的使用权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态, 当前任务的CPU使用权就会被剥夺,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。 + +抢占式内核如下图所示 + +![抢占式内核](./images/PreemptiveKernel.png) + +抢占式内核的优点有 + +* 使用抢占式内核,最高优先级的任务什么时候可以执行,可以得到CPU的使用权是可知的。使用抢占式内核使得任务级响应时间得以最优化。 +抢占式内核的缺点有: + +* 不能直接使用不可重入型函数。调用不可重入函数时,要满足互斥条件,这点可以使用互斥型信号量来实现。如果调用不可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。 + + + +#Linux下的用户态抢占和内核态抢占 +------- + + +CPU抢占分两种情况, **用户抢占**, **内核抢占** + +其中内核抢占是在Linux2.5.4版本发布时加入, 同SMP(Symmetrical Multi-Processing, 对称多处理器), 作为内核的可选配置。 + + +##用户抢占 +------- + +###用户抢占的概念 +------- + +当内核即将返回用户空间时, 内核会检查need_resched是否设置, 如果设置, 则调用schedule(),此时,发生用户抢占. + + +###用户抢占的发生时机 + +一般来说,用户抢占发生几下情况: + +1. 从系统调用返回用户空间; + +2. 从中断(异常)处理程序返回用户空间 + +从这里我们可以看到, 用户抢占是发生在用户空间的抢占现象. + +###need_resched标识 +------- + +内核如何检查一个进程是否需要被调度呢? + +内核在即将返回用户空间时检查进程是否需要重新调度,如果设置了,就会发生调度, 这被称为**用户抢占**, 因此**内核在thread_info的flag中设置了一个标识来标志进程是否需要重新调度, 即重新调度need_resched标识TIF_NEED_RESCHED** + +并提供了一些设置可检测的函数 + + +| 函数 | 描述 | 定义 | +| ------- |:-------:|:-------:| +| set_tsk_need_resched | 设置指定进程中的need_resched标志 | [include/linux/sched.h, L2920](http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.6#L2920) | +| clear_tsk_need_resched | 清除指定进程中的need_resched标志 | [include/linux/sched.h, L2926](http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.6#L2931) | +| test_tsk_need_resched | 检查指定进程need_resched标志 | [include/linux/sched.h, L2931](http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.6#L2931) | + +而我们内核中调度时常用的need_resched()函数检查进程是否需要被重新调度其实就是通过test_tsk_need_resched实现的, 其定义如下所示 + +```c +// http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.6#L3093 +static __always_inline bool need_resched(void) +{ + return unlikely(tif_need_resched()); +} + +// http://lxr.free-electrons.com/source/include/linux/thread_info.h?v=4.6#L106 +#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) +``` + + +##内核抢占 +------- + +###内核抢占的概念 +------- + +对比用户抢占, 顾名思义, 内核抢占就是指一个在内核态运行的进程, 可能在执行内核函数期间被另一个进程取代. + + +###为什么linux需要内核抢占 +------- + +linux系统中, 进程在系统调用后返回用户态之前, 或者是内核中某些特定的点上, 都会调用调度器. 这确保除了一些明确指定的情况之外, 内核是无法中断的, 这不同于用户进程. + +如果内核处于相对耗时的操作中, 比如文件系统或者内存管理相关的任务, 这种行为可能会带来问题. 这种情况下, 内核代替特定的进程执行相当长的时间, 而其他进程无法执行, 无法调度 +== ====================================== + + +内核抢占主要是为实时系统来设计的, 当然在非实时系统中的确也能提高系统的响应速度, 但也不是在所有情况下都是最优的,因为抢占也需要调度和同步开销,在某些情况下甚至要关闭内核抢占, 比如前面我们将主调度器的时候, linux内核在完成调度的过程中是关闭了内核抢占的. + + +##内核抢占的发生时机 +------- + +内核抢占发生的时机,一般发生在: + +1. 当从中断处理程序正在执行,且返回内核空间之前。 + +2. 当内核代码再一次具有可抢占性的时候,如解锁(spin_unlock_bh)及使能软中断(local_bh_enable)等。 + +3. 如果内核中的任务显式的调用schedule()。 + +4. 如果内核中的任务阻塞(这同样也会导致调用schedule()) + +内核抢占,并不是在任何一个地方都可以发生,以下情况不能发生 + +1. 内核正进行中断处理。在Linux内核中进程不能抢占中断(中断只能被其他中断中止、抢占,进程不能中止、抢占中断),在中断例程中不允许进行进程调度。进程调度函数schedule()会对此作出判断,如果是在中断中调用,会打印出错信息。 + +2. 内核正在进行中断上下文的Bottom Half(中断下半部,即软中断)处理。硬件中断返回前会执行软中断,此时仍然处于中断上下文中。如果此时正在执行其它软中断,则不再执行该软中断。 + +3. 内核的代码段正持有spinlock自旋锁、writelock/readlock读写锁等锁,处干这些锁的保护状态中。内核中的这些锁是为了在SMP系统中短时间内保证不同CPU上运行的进程并发执行的正确性。当持有这些锁时,内核不应该被抢占。 + +4. 内核正在执行调度程序Scheduler。抢占的原因就是为了进行新的调度,没有理由将调度程序抢占掉再运行调度程序。 + +5. 内核正在对每个CPU“私有”的数据结构操作(Per-CPU date structures)。在SMP中,对于per-CPU数据结构未用spinlocks保护,因为这些数据结构隐含地被保护了(不同的CPU有不一样的per-CPU数据,其他CPU上运行的进程不会用到另一个CPU的per-CPU数据)。但是如果允许抢占,但一个进程被抢占后重新调度,有可能调度到其他的CPU上去,这时定义的Per-CPU变量就会有问题,这时应禁抢占。 + + +##内核抢占的实现 +------- + + + +http://blog.csdn.net/li4850729/article/details/28136643 +http://blog.csdn.net/xiaofei0859/article/details/8113211 +http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html +http://www.cnblogs.com/hustcat/archive/2009/08/31/1557507.html + + + diff --git a/study/kernel/01-process/05-schedule/06-preempt/images/NonPreemptiveKernel.png b/study/kernel/01-process/05-schedule/06-preempt/images/NonPreemptiveKernel.png new file mode 100644 index 0000000000000000000000000000000000000000..74ee9e2348ff02054a57533ed619be81818c8369 GIT binary patch literal 15099 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 literal 0 HcmV?d00001 diff --git a/study/kernel/01-process/05-schedule/06-preempt/images/PreemptiveKernel.png b/study/kernel/01-process/05-schedule/06-preempt/images/PreemptiveKernel.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb8062b482f782d5582969b24e0774e350614c9 GIT binary patch literal 12690 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 B-ah~U literal 0 HcmV?d00001