《深入Linux内核架构》第2章 进程管理和调度 (6)

news2024/9/25 15:29:52

目录

2.8 调度器增强

2.8.1 SMP调度

2.8.2 调度域和控制组

2.8.3 内核抢占和低延迟相关工作

2.9 小结


2.8 调度器增强

2.8.1 SMP调度

进程迁移:

        含义:把进程从一个CPU就绪队列迁移至另一个CPU就绪队列。

        作用:CPU负荷均衡。

        缺点:缓存失效,危害性能。

设置进程的亲和力affinity,控制进程可在哪些CPU上运行。

对应系统调用:

        long sched_setaffinity(pid_t pid, const struct cpumask *in_mask)

                最终设置task_struct->cpus_allowed成员

CPU就绪队列中SMP部分:

struct rq {

#ifdef CONFIG_SMP

    struct sched_domain *sd; 调度域

    int active_balance;     是否正在进行负载均衡

    int push_cpu;         迁移目标CPU

    int cpu;             当前就绪队列所在CPU

    struct task_struct *migration_thread; 执行迁移的线程

    struct list_head migration_queue;     迁移请求链表

#endif

}

调度类中SMP相关函数指针:

struct sched_class {  
    
    void (*set_cpus_allowed)(struct task_struct *p, struct cpumask *newmask);
        
        设置进程CPU 亲和力(affinity),即确定进程可运行在哪些CPU。
       
    
    void (*migrate_task_rq)(struct task_struct *p, int next_cpu);     迁移
        
        将进程迁移到指定的CPU上运行。

     
    int (*select_task_rq)(struct task_struct *p, int sd_flag, int flags);
        
        根据进程亲和性,系统负载平衡策略等为进程选择一个合适的CPU运行队列。

}

周期调度中关于SMP部分:

void scheduler_tick(void)

{

#ifdef CONFIG_SMP

    rq->idle_balance = idle_cpu(cpu);

    trigger_load_balance(rq, cpu);     每次时钟中断都进行CPU负载均衡

#endif

}


void trigger_load_balance(struct rq *rq, int cpu)

{

    raise_softirq(SCHED_SOFTIRQ);

}


open_softirq(SCHED_SOFTIRQ, run_rebalance_domains);

    SCHED_SOFTIRQ软中断处理函数run_rebalance_domains:


static void run_rebalance_domains(struct softirq_action *h)
{
	

	rebalance_domains(this_cpu, idle);

	
}

    进行调度域内部CPU之间的负载均衡。

然后调用rebalance_domains -> load_balance,进行负载均衡操作。

load_balance:

        比较struct rq的进程总负荷,寻找最忙CPU,执行对应调度类的load_balance函数。

刚exec启动新进程时,适合跨CPU迁移,此时缓存影响小。

已运行的进程不适合迁移,因为刚准备的缓存立马失效,降低性能。

根据进程的亲和力决定迁移目标CPU。

2.8.2 调度域和控制组

调度域:

        含义:将所有CPU分为若干调度域,每个调度域管理一组CPU。

        特点:同一调度域的所有CPU具有相同属性和调度策略。

调度域分组依据:物理距离,共享cache,拓扑结构,亲和性等。

        如物理临近或共享cache的CPU组成一个调度域。

不同调度域是树状结构,顶层调度域包含所有CPU,而下层调度域是对CPU子集的分组。

五个调度域层级:

        All NUMA Domain

        NUMA Domain

        Phy Domain

        Core Domain

        CPU Domain(SMT Domain)

 对应树形结构:

如一个CPU被分到两个调度域,每个调度域有自己的调度策略。

对应有两个目录:

        /proc/sys/kernel/sched_domain/cpuX/domain0/

        /proc/sys/kernel/sched_domain/cpuX/domain1/

       两个目录下有多个参数,包括:

                两次负载均衡最大/最小间隔, 调度域是否繁忙,最小不平衡值等

#cat /proc/sys/kernel/sched_domain/cpu9/domain0/name

        MC //MC域,即Multi-Core

#cat /proc/sys/kernel/sched_domain/cpu9/domain1/name

        NUMA //NUMA域

进程迁移时,优先在调度域内部迁移,应减少跨NUMA迁移。

控制组:cgroup

        管理一组进程的使用资源。如CPU,内存,磁盘IO,网络带宽等。

        cgroup可把进程按用户分组, 也可任意进程组合分组。

2.8.3 内核抢占和低延迟相关工作

内核抢占:

        内核任务执行时被更高优先级的任务打断,从而允许更高优先级的任务立即执行。

并不是任意时候都可以抢占当前内核任务。

禁止内核抢占时机:

        当前任务处于关键时机,不能被中断。如:

        ​1、访问 Per-CPU数据时 。(防止smp_processor_id改变)

        ​2、访问CPU state。

        3、持有spinlock时。(如果允许内核抢占可能造成死锁。)

内核中如何判断当前任务是否可被抢占?

        进程struct thread_info中preempt_count:

                等于0,可被抢占。(退出最后一个临界区后为0)

                大于0,禁止抢占。(可嵌套递归进入多个临界区)

static inline void __raw_spin_lock(raw_spinlock_t *lock)

{

        preempt_disable(); //进入临界区后,将preempt_count+1,实现禁止内核抢占。

        ...

}

static inline void __raw_spin_unlock(raw_spinlock_t *lock)

{

        ...

        preempt_enable(); //释放锁后,将preempt_count-1,允许内核抢占。

}

#define preempt_enable() \

do { \

    preempt_enable_no_resched(); //将preempt_count - 1

    barrier(); \

    preempt_check_resched(); \ 定义如下

} while (0)


#define preempt_check_resched() \

do { \

    if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) \

    preempt_schedule(); \      执行抢占,让出CPU,调度其他进程。

} while (0)

thread_info中flag的TIF_NEED_RESCHED标志:

        用于指示当前进程需要被抢占,让出CPU,让其他进程执行。

什么时候设置当前进程的TIF_NEED_RESCHED标志?

        1、进程被唤醒时,若有更高优先级进程需要执行。

        ​2、创建新进程时,若新进程优先级高于当前进程。

        ​3、进程修改进程的nice值时,导致优先级高于当前进程。

执行内核抢占前,都检查TIF_NEED_RESCHED标志。若置位,调用对应适用的抢占函数。

抢占时机总结:

        ​ 1. 中断处理程序返回内核态时:

                preempt_schedule_irq执行抢占。

        2. ​调用preempt_enable允许抢占时。

                调用preempt_schedule()执行抢占。

        ​3. 显式调用schedule函数。

        ​4. 阻塞/睡眠时。

preempt_schedule_irq和preempt_schedule函数都最终调用_schedule()

访问per-CPU变量时,也需要禁止内核抢占,防止一个CPU读时,另一个CPU写。

#define get_cpu()         ({ preempt_disable(); __smp_processor_id(); })

#define put_cpu()         preempt_enable()

获取当前运行进程所在CPU

#define raw_smp_processor_id()  (current_thread_info()->cpu)

int preempt_count,32位。

preempt_count中的bit 27就是PREEMPT_ACTIVE值。

PREEMPT_ACTIVE:

        表明内核抢占已被激活。即使preempt_count的其他部分大于0。(例如,进入一个不可抢占的区域),内核仍然可以响应更高优先级的任务或信号。

2.9 小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1533789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【评分标准】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷 无线网络勘测设计

第一部分:无线网络勘测设计评分标准 序号评分项评分细项评分点说明评分方式分值1点位设计图AP编号AP编号符合“AP型号位置编号”完全匹配5AP型号独立办公室、小型会议室选用WALL AP110完全匹配5员工寝室选用智分,其他用放装完全匹配5其它区域选用放装AP…

【原创】JDK17获取CPU占用率、内存占用率以及堆内存使用情况

前言 我之前一篇文章: 【原创】Java获取CPU占用率、内存占用率最简单的方式_java获取cpu使用率-CSDN博客 这篇文章虽然简单,但是只能针对JDK8,换成现在模块化的JDK后,OperatingSystemMXBean类就无法反射获取其中的信息了&#…

代码随想录 动态规划-股票问题

目录 121.买卖股票的最佳时机 122买卖股票的最佳时机II 123. 买卖股票的最佳时机III 188.买卖股票的最佳时机IV 309.买卖股票的最佳时机含冷冻期 714.买卖股票的最佳时机含手续费 121.买卖股票的最佳时机 121. 买卖股票的最佳时机 简单 给定一个数组 prices &…

【FLOOD FILL专题】【蓝桥杯备考训练】:扫雷、动态网格、走迷宫、画图、山峰和山谷【已更新完成】

目录 1、扫雷(Google Kickstart2014 Round C Problem A) 2、动态网格(Google Kickstart2015 Round D Problem A) 3、走迷宫(模板) 4、画图(第六次CCF计算机软件能力认证) 5、山…

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中,应用性能监控(Application Performance Monitoring, APM)扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking,通过对其功能特性和工作原理的详细介绍&am…

cocos(困扰了我一晚上的代码)地图适配不同手机屏幕

Creator 版本:3.8.2 目标平台: 微信小游戏 有人反馈我的小游戏没有做屏幕适配。其实我是做了的。但是在不同手机分辨率的情况下。 适配出了问题。然后我改了一晚上的代码终于做好了。 设计的分辨率是960*640.也就是白色区域。 但是大部分手机是…

2024全国水科技大会:【协办单位】山东文远环保科技股份有限公司

山东文远环保科技股份有限公司坐落于千年古城齐国故都--临淄。初始成立于2011年,是淄博市首批国有资本参股的混合改制企业。 公司着力打造环保设备制造、环保工程及服务、环保水务/固废处理/新能源项目投资及运营管理、固废循环经济产业园等四大板块。是一家集投资、…

【spring】@Conditional注解学习

Conditional介绍 Conditional注解用于按照设定的条件进行判断,从而决定是否将某个bean注册到Spring容器中。 Conditional注解是在Spring 4.0版本中引入的,它提供了一种更加灵活的方式来控制bean的创建和注册。在此之前,开发者通常使用Profi…

【网络原理】HTTP 请求 (Request)详解

文章目录 🎍请求格式🎄认识URL🌸query string🌸关于 URL encode 🍀认识 “方法” (method)🌸GET方法🌸POST 方法🌸GET 和 POST 的区别 🌲认识请求 “报头” (header)&…

cocos控制物体移动轨迹

引擎:CocosCreator 3.8.2 思考了很久决定要不要发这票文章。因为毕竟我也是一个新手。但是这个问题真的困扰了我很久。 特意分享给大家。 如图所示有2个方块。他们可以跟着轨迹移动。 这个轨迹箱子总体来说有以下几个规则。 1.只能沿着轨迹移动。 2.上面只能有一…

[ C++ ] STL---string类的模拟实现

目录 string类的成员变量 构造函数 有参构造函数 无参构造函数 析构函数 拷贝构造函数 赋值运算符重载 string类对象的容量操作 string类对象的遍历与访问 [ ] 下标遍历 迭代器遍历 string类对象的增删查改 string类的成员变量 string类底层为动态开辟的字符数组&a…

提升水库大坝安全与效率:现代技术云平台的应用

在我国,水库大坝的数量居世界之首,它们在推动国民经济发展中扮演着不可或缺的角色。然而,要想让这些水利工程充分发挥其价值,不仅需要精准的调度与高效的管理,更重要的是要确保其安全无虞。一旦发生事故,后…

【机器学习】基于变色龙算法优化的BP神经网络分类预测(SSA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】变色龙优化算法(CSA)原理及实现 2.设计与实现 数据集: 数据集样本总数2000 多输入多输出:样本特征24&#xff…

Java中的I/O讲解(超容易理解)(上篇)

如果想观看更多Java内容 可上我的个人主页关注我,地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?spm1000.2115.3001.5343使用工具 IntelliJ IDEA Community Edition 2023.1.4 使用语言 Java8 代码能力快速提升小方法,看完代码自己敲一…

智慧乡村赋能发展:数字乡村推动农村经济社会持续繁荣

目录 一、智慧乡村的内涵与发展意义 二、智慧乡村赋能发展的路径 1、加强信息基础设施建设 2、推进农业生产智能化 3、提升乡村治理现代化水平 4、推动农村产业融合发展 三、智慧乡村发展面临的挑战与对策 四、智慧乡村发展的未来展望 1、技术融合创新将更加深入 2、…

百度智能云+SpringBoot=AI对话【人工智能】

百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…

怎么在Linux系统下Docker部署Excalidraw白板工具并实现无公网IP远程访问?

文章目录 1. 安装Docker2. 使用Docker拉取Excalidraw镜像3. 创建并启动Excalidraw容器4. 本地连接测试5. 公网远程访问本地Excalidraw5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定公网地址远程访问 本文主要介绍如何在Ubuntu系统使用Docker部署开源白板工具Excal…

【Linux】实现进度条小程序

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…

C++ list详解及模拟实现

目录 本节目标 1. list的介绍及使用 1.2 list的使用 2.list的模拟实现 1.对list进行初步的实现 2.头插和任意位置的插入 3.pos节点的删除,头删,尾删 4.销毁list和析构函数 5.const迭代器 6.拷贝构造和赋值操作 3.完整代码 本节目标 1. list的…

怎么做扫码签到活动_一场别开生面的活动签到革新之旅

在数字化飞速发展的今天,传统的签到方式已无法满足人们对高效、便捷、互动性的追求。为此,我们创新性地推出了扫码签到活动,为您带来一场前所未有的智慧互动新体验。 工具/原料 微信小程序 飞多多网站 方法/步骤 一、扫码签到&#xff0c…