| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux抢占是如何发生的? -> 正文阅读 |
|
[系统运维]Linux抢占是如何发生的? |
参考博客: 0. 问题背景我们都知道自旋锁spinlock中有关/开抢占的操作,前面我有一篇文章也分析了为什么spinlock内部要关闭抢占,但是对于什么是抢占,抢占的机理是什么,一直都是模模糊糊的概念,所以需要在这里浅析一下 其实对于Linux内核的抢占机制,阅读参考博客就够了,本篇文章也是基于它的一个总结与概括 1. 非抢占与抢占非抢占式内核有实时性上的缺点,高优先级的任务即使处于就绪状态,也不一定能够得到及时的调度,而什么时候调度高优先级的任务完全取决于当前在CPU上的任务什么时候主动让出CPU,这一点就对实时性非常不友好 ? 抢占式内核对Linux的实时性支持就很友好,最高优先级的任务什么时候可以执行,可以得到CPU的使用权是可知的。使用抢占式内核使得任务级响应时间得以最优化 但是抢占式内核必须小心抢占任务和被抢占任务之间的竞态问题(Race Condition) 用<深入Linux设备驱动内核机制>中的话说,调度器的可抢占性也是并发的来源之一 ? 2. 抢占式调度机制用博客中总结的图来描述 ?抢占式调度主要分为两步,第一步就是设置进程的TIF_NEED_RESCHED标志,此时进程还没有被抢占,仍然继续运行,在到达某些调度点的时候,抢占才会实际发生 ./include/linux/sched.h ./include/linux/thread_info.h ?可以看到,TIF_NEED_RESCHED的设置就是将当前进程的flag成员某位置1,TIF表示Thread InFo,置位的时机在周期性调度处理器与唤醒进程的操作中 进程抢占的时机指的是什么时候检查TIF_NEED_RESCHED标志进而进行抢占调度,内核中抢占的时机有两处,第一处是从中断返回内核态的时候,第二处是抢占使能的时候 ./arch/arm64/kernel/entry.S ?可以看到如果满足抢占的条件(抢占开启,TIF置位),那么在中断返回内核态的抢占点,会调用__schedule()将被中断的进程换出处理器运行队列,再从处理器的运行队列中选择一个进程运行从而完成抢占,从另一个方面来说,虽然中断返回内核态是一个抢占点,但如果条件不满足,抢占不会成功 ? ? ? ? 同理,在抢占开启的时候,也会检查一系列条件,如果条件满足,才会调用 __schedule()完成抢占 以上便是Linux内核抢占的大概机制,在这里需要明确以下几点:
?3.一个思考题上面浅析了抢占式如何发生的,spin lock irq中既然关闭了CPU响应中断的能力,那么在拥有自旋锁的上下文中,即使当前进程的TIF_NEED_RESCHED标志被置位了,也不可能有中断来临触发抢占点,那么为什么spin lock irq中要显示地关闭抢占呢? StackOverflow中举出了内核文档中的话:./Documentation/preemt-locking.txt ?一个比较靠谱的说法是,下列情形可能会出问题: ? ?? local_irq_save(); ...... _cond_resched(); local_irq_restore(); 假如在CONFIG_PREEMPT_VOLUNTARY=y的情况下,很有可能当前任务被别的任务设置了TIF_NEED_RESCHED标志位并且当前没有显示关闭抢占(preempt_count==0),这时候便会调用preempt_schedule_common()->__schedule()将当前进程从运行队列中移除,而这个时候是获取到锁的,便有可能别的任务得不到锁而卡滞,甚至有死锁风险 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 1:39:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |