Day9-实时调度类及SMP和NUMA

实时调度类及SMP和NUMA

今天继续学习进程调度相关的视屏课:实时调度类及SMP和NUMA

进程分类:实时/普通

Linux进程可以分为两大类:实时进程和普通进程。实时进程与普通进程根本不同之处,如果系统中有一个实时进程且可执行,那么调度器总是会选择它,除非有一个优先级更高的实时进程。

SCHED_FIFO: 没有时间片,在被调度器选择之后,可以运行任意长的时间

SCHED_RR: 有时间片,其值在进程运行时会减少

实时调度实体:sched_rt_entity数据结构

实时调度提sched_rt_entity数据结构,表示实时调度实体,包含整个实时调度数据信息。具体源代码如下

struct rt_rq

实时调度类:rt_sched_class数据结构

实时调度类rt_sched_class数据结构

实时调度操作核心详解

进程插入函数enqueue_task_rt

内核源码:./kernel/sched/rt.c

//更新调度信息,将调度实体插入到相应优先级队列的末尾
static void
enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags)
{
    struct sched_rt_entity *rt_se = &p->rt;

    if (flags & ENQUEUE_WAKEUP)
        rt_se->timeout = 0;

    enqueue_rt_entity(rt_se, flags);

    if (!task_current(rq, p) && p->nr_cpus_allowed > 1)
        enqueue_pushable_task(rq, p);
}

进程选择函数pick_next_task_rt

实时调度会选择最高优先级的实时进程来运行。

内核源码:./kernel/sched/rt.c

static struct sched_rt_entity *pick_next_rt_entity(struct rq *rq,
                           struct rt_rq *rt_rq)
{
    struct rt_prio_array *array = &rt_rq->active;
    struct sched_rt_entity *next = NULL;
    struct list_head *queue;
    int idx;
    // 第一个找到可用的实体
    idx = sched_find_first_bit(array->bitmap);
    BUG_ON(idx >= MAX_RT_PRIO);
    // 从链表组中找到对应的链表
    queue = array->queue + idx;
    next = list_entry(queue->next, struct sched_rt_entity, run_list);

    return next; //返回找到运行实体
}

进程删除函数dequeue_task_rt

从优先级队列中删除实时进程,并更新调度信息,然后把这个进程添加到队尾

内核源码:./kernel/sched/rt.c

//删除进程
static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags)
{
    struct sched_rt_entity *rt_se = &p->rt;

    update_curr_rt(rq); //更新调度数据信息等等
    // 将rt_se从运行队列当中进行删除,然后添加到队列的尾部
    dequeue_rt_entity(rt_se, flags);

    dequeue_pushable_task(rq, p);//从hash表中进行删除
}

SMP

SMP(又称UMA)

对称多处理器结构(Symmetrical Mulit-Processing, SMP), SMP服务器CPU利用率最好的情况下是2-4个CPU,这个结论是经过实践证明。

在多处理器系统中,内核必须考虑几个额外的问题,主要以确保良好的调度。

  • CPU负荷必须尽可能公平的在所有处理器上共享
  • 进程与系统中某些处理器的亲和性(affinity)必须是可设置的
  • 内核必须能够将进程从一个CPU迁移到另一个

Linux SMP调度就是将进程安排/迁移到合适的CPU中去,保持各CPU负载均衡的过程。

NUMA(非一致内存访问结构)

NUMA是多处理器计算机,各个CPU都有本地内存,可以支持超快的访问能力。各个处理器之间通过总线连接起来,支持对其他CPU的本地内存访问(但比访问自己的内存要慢)

MPP

海量并行处理结构

从应用层系统架构,目前商用服务器大体分为三类: SMP、NUMA、MPP

NUMA优势: 一台物理服务器内部集成多个CPU,使系统具有较高事务处理能力。NUMA架构适合OLTP事务处理场景。

SMP优势:当前使用的OLTP程序当中,用户访问中心数据库,如果采用SMP系统,它的效率要比MPP架构要快

CPU域初始化

根据实际物理属性,CPU分类:

  • SMT(超线程)
  • MC(多核)
  • SoC(system on chip)

从Linux内核分类

  • CONFIG_SCHED_SMT
  • CONFIG_SCHED_MC
  • DIE

Linux内核对CPU的管理是通过bitmap来管理的,并定义四种状态:possible/present/online/active

内核源码目录:./kernel/cpu.c

SMP负载均衡

SMP负载均衡机制从注册软中断开始,,每次系统处理调度tick时会检查当前是否需要处理SMP负责均衡。

负载均衡时机

周期性调用进程调度程序scheduler_tick()-> trigger_load_balance()中,通过软中断触发负载均衡

某个CPU上无可运行进程,__schedule()准备调度idle进程前,会尝试从其他CPU上拉一批进程过来

关注公众号:qiubinwei-1986 

一起开启运维工程师成长之路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值