抢断调度,是调度机制对实时系统需要的支持,是一种快速响应的重调度机制。既然与重调度有关,那么就先回顾一下调度和重调度。

调度分两种情况,

1. 一种是自愿调度,由代码主动调用schedule来让度cpu,例如sleep,mutex,sema等阻塞等待。另外,当一个进程(或线程)走到尽头(do_exit)时,也会调用schedule,但是却永远不再恢复执行了,否则就是BUG了。

2. 另一种是重调度,非自愿的。当前线程被设置重调度后,当有中断发生或系统调用时,在entry.S的返回路径上就会被动调用schedule。而抢断调度,也是重调度,却不必等待到中断发生或系统调用,在处理结束后离开entry.S才进行调度。而是在离开抢断临界区就马上进行调度。

一般地,在自愿调度之前,当前线程都会将自身的task_struct挂接在某一等待队列上,如wait_queue_t。并且将自身的state设置为INTERRPUTABLE或UNINTERRUTABLE(允许信号唤醒或不允许),最后才调用schedule。在这种情况下,schedule的执行会将当前的task_struct移除出它所在的运行队列。

而重调度或都抢断的重调度,schedule是不会将当前的task_struct移除出它所在运行队列。

重调度分两步:

1. 将当前运行线程的设置为TIF_NEED_RESCHED,当前线程可能在抢断保护的临界区中。通常wakeup的目标线程在当前cpu上,则设置可以直接设置重调度。

2. a. 当离开抢断保护的临界区,马上检查是否需要重调度,是否立即进行调度。

b. 中断处理结束,软中断处理结束,或系统调用结束,恢复到原来的代码之前,进行重调度。

简单地说:

先在某处调用resched_curr对当前线程所在的调度策略的队列进行重调度的评判,可以则标记需要重调度,但并不进行实质的调用。

当要切换上下文,如中断处理结束,系统调用结束时,再调用schedule进行实质的调度工作 。

或者直接在离开抢断保护的临界区就马上调用preempt_schedule进行调度。

我们熟知的wakeup以及时间片轮转调度实际就是调用resched_curr。

resched_curr 重调度当前cpu的某一调度策略的运行队列

有三步工作:

1. 当前线程是否已经设为重调度

2. 重调度的目标的运行队列所属cpu是否也当前运行的cpu?

如果是则进行下面两步:

a. 设置重调度标记 TIF_NEED_RESCHED

b. 向当前CPU的preempt_count设置重调度 PREEMPT_NEED_RESCHED。

3. 向远端CPU发送重调度IPI(Inter-processor interrupt)。

抢断保护“锁”,是一个保护临界区内不被重调度需求而抢断进行调度。这个锁独立保护每一个cpu(当前运行的线程),而不是保护线程并发临界区。它是可递归,没有竞争状态,不会阻塞,不存在竞态条件。每一个cpu都有一个抢断保护锁。这个锁只是一个32位名为__preempt_count整形变量。它为中断,软中断,普通抢断保护提供嵌套深度,同时也用作为软中断锁,保护软中断处理不递归进入。中断处理,软中断处理同样是抢断保护的临界区,不允许被重调度抢断。

抢断保护"锁",除了保护了临界区不被重调度推断外,同时也为快速响应重调度提供了响应的时机,那就是抢断临界区离开的时候。因为entry.S上对重调度的响应,往往是被动的,必须等待有中断发生或系统调用等不确定的事件,使内核经过entry.S并离开时才会响应重调度。而抢断调度则是代码在离开临界区的时候主动去响应重调度。如果没有了抢断保护锁__preempt_count,代码就不清楚什么时候才合适去响应重调度。只好被动延后到经过entry.S,从而不能及时最快地去响应重调度。

抢断调度,由函数preempt_schedule进行,必须主动调用。这个函数嵌入到了每一处离开抢断临界区的代码中,比如内核无处不在的同步锁释放,spin_unlock, rwlock_unlock, rcu_read_unlock, spin_trylock, 以及pagefault_enable等。这些函数都会嵌入preempt_enable。

在抢占调度中,CPU的__preempt_count被设置PREEMPT_ACTIVE 用来提示 __schedule() ,我们是从preempt path 进来的。PREEMPT_ACTIVE 用来保护重调度不嵌套抢断。当前被抢断的线程在恢复运行之前,运行在当前cpu的其它线程不可以再进行抢断。

这里必须要清楚这样一个事实,软件中断保护锁也是在使用抢断保护锁,当离开软中断处理的同时,也等同于离开一层抢断临界区,这时只要不存在嵌套临界区的话,就可以进行抢断调试。__local_bh_enable_ip嵌入了preempt_check_enable。

原文:http://www.cnblogs.com/bbqzsl/p/6842460.html

linux内核抢占加锁,linux内核的preempt抢占调度,preempt_count抢占保护“锁”相关推荐

  1. Linux内核:了解Linux内核抢占

    目录 无强制抢占 可抢占内核 自愿内核抢占 完全实时抢占 在配置Linux内核时,我们可以设置一些影响系统行为的参数.您可以使用不同的优先级,调度类和抢占模型.了解并选择正确的参数非常重要. 在这篇文 ...

  2. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单. 2. 高 ...

  3. Linux内核设计与实现---内核同步方法

    内核同步方法 1 原子操作 原子整数操作 原子性与顺序性的比较 原子位操作 2 自旋锁 自旋锁是不可递归的 其他针对自旋锁的操作 自旋锁和下半部 3 读-写自旋锁 4 信号量 创建和初始化信号量 使用 ...

  4. 初探内核之《Linux内核设计与实现》笔记下

    定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...

  5. [转]Linux 2.6.19.x 内核编译配置选项简介

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国,转载地址:http://lamp.linux.gov.cn/Linux/kernel_options.html 版权声明 本文作者是一 ...

  6. Linux 2.6.19.x 内核编译配置选项简介(内核裁剪)

    Linux 2.6.19.x 内核编译配置选项简介 Code maturity level options 代码成熟度选项 Prompt for development and/or incomple ...

  7. [Linux]Linux 2.6.19.x 内核编译配置选项简介

    Linux 2.6.19.x 内核编译配置选项简介 Code maturity level options 代码成熟度选项 Prompt for development and/or incomple ...

  8. (转载) Linux 2.6.19.x 内核编译配置选项简介

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

  9. Linux 2.6.19.x 内核编译配置选项简介(转)

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

  10. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】...

    原文地址:Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinauni ...

最新文章

  1. 用法 stl_51Nod 2160 数字游戏 STL基本用法
  2. imu oracle,问一个关于IMU REDO的问题~
  3. SSLGET ×××综合实验题
  4. Android开发:第四日番外——Assets文件夹和RAW文件夹区别
  5. 图像超分辨率也能改善天气预报?没错!
  6. 力荐!计算机视觉开源工具中的瑞士军刀—Dlib最新高级特性教程
  7. PostgreSQL的实践一:数据类型(一)
  8. 05-简单的输入输出
  9. Pytorch——用50行代码搭建ResNet
  10. 微软发布.NET 6,NET Framework的最新版本现已推出
  11. (一)DSP28335
  12. java中随机抽取三人名字_JS实现随机抽取三人
  13. 离散度计算公式 python_Python实现熵值法确定权重
  14. 看完一篇论文,如何写该论文研究思路?
  15. css3图片上下浮动动画
  16. 最优投资组合的确定matlab,最优投资组合问题的数学模型
  17. 山西大同大学教务处教师端——可在PC端,手机端操作
  18. hiber泛型 spring
  19. 2021年全球与中国手动微操纵器行业市场规模及发展前景分析
  20. 防火墙日志及日志分析

热门文章

  1. python3使用蓝本Blueprint
  2. jQuery ajax 文件下载
  3. 【Python】Python网络爬虫-电视剧《平凡的荣耀》数据爬取与分析
  4. USB转换PS2接线原理
  5. UY_ELI, EL社区app
  6. 华为eNSP模拟器中两个路由器IP互联
  7. 计算机管理器用户怎么打开,win10无法使用内置管理员账户打开计算器如何设置...
  8. Jetpack Compose的Modifier顺序问题
  9. 用python画一个机器猫歌词_用Python语言模型和LSTM做一个Drake饶舌歌词生成器!自己蒙了!...
  10. c 获取本地计算机ip,C++获取本机IP地址