- 博客(10)
- 资源 (4)
- 收藏
- 关注
原创 CPU负载均衡
如何实现负载均衡为了系统负载的均衡,主要通过如下三种手段:(1)当一个进程要加入runqueue时,选择负载最轻的cpu上的runqueue(2)当前CPU的runqueue为空时,主动拉取其他runqueue上的进程来运行(3)周期计算各个CPU上的负载情况,在必要的时候迁移进程具体的场景,CFS调度器负载均衡发生在如下的一些路径上:1.当前进程离开runqueue,进入睡眠,而对应...
2019-02-28 19:37:36 4889
原创 内核调度时机
调度的时机内核中常见的调度场景如下:(1)进程被阻塞时,比如执行sleep()后,需要立刻执行schedule()进行调度(2)当唤醒进程时,比如try_to_wake_up()执行时,会重新计算负载,查找需要执行的进程,并设置TIF_NEED_RESCHED标志延时调度(3)当周期执行的scheduler_tick()发现需要切换进程时,设置TIF_NEED_RESCHED标志延时调度...
2019-02-19 10:19:19 727
原创 进程创建过程
进程创建在进程创建时,调用do_fork函数来创建新进程,那么和调度相关的操作主要有两个,一个是sched_fork,这是对一个进程进行调度的初始化,另外一个就是wake_up_new_task,这个是把刚刚创建的子进程唤醒加入到调度器中管理。首先来看sched_fork函数,调用流为do_fork–>copy_process–>sched_fork。 /* * fork()...
2019-02-25 16:07:26 4945
原创 scheduler_tick函数详解
scheduler_tick是调度器中的一个核心重要的函数,它叫做周期调度器,驱动调度器运行的机制之一。event_handler()-->tick_handle_periodic()->tik_periodic()->update_process_times()-->scheduler_tick()以上是该函数的调用回溯,由时钟中断驱动着这个函数的运行,每个CPU ...
2019-02-24 17:09:01 5809
原创 CFS调度器(二)
组调度前面介绍到的CFS调度器都是以进程为单位进行的调度,实际应用场景中,用户可能会希望系统调度是基于用户组进行的。比如一个服务器上有两个用户同时使用,如果想要两个用户拥有相同的资源分配,那么就可以采用组调度方式。如果依然以进程为单位,那么假如一个用户拥有1个进程,而另一个用户拥有10个进程,这就导致了其中一个用户占用了大部分的CPU资源。调度器都是基于调度实体sched_entity来作为调...
2019-02-24 15:08:41 350
原创 CFS调度器(一)
关于调度类和优先级的概念,前面的文章《调度器概述》中已经做了介绍了,本文不在重述。本文主要关注的就是CFS调度器,或者叫做fair_sched_class调度类。这种调度器是被SCHED_NORMAL、SCHED_BATCH这两种调度策略使用的。(本文基于Linux4.0)提到调度器涉及到两个问题:1.怎么根据参量快速选出下一个要调度执行的进程?2.怎么定义和更新不同进程的相关参量?带着...
2019-02-22 18:09:09 1323
原创 PELT负载计算
PELT负载计算 (Per-Entity Load Tracking)简介什么是负载,负载实际上表示的是进程运行对系统的“压力”情况,它和进程消耗CPU时间是两个概念,比如:10个进程在运行队列runqueue中,和1个进程在runqueue中,虽然在runquque中的进程并没有正在消耗CPU时间,实际上这两种情况下,系统的压力是不同的,此时这些进程并没有在消耗CPU时间,而是在等待,但是...
2019-02-21 20:33:59 2212
原创 schedule()函数详解
asmlinkage __visible void __sched schedule(void) { struct task_struct *tsk = current; sched_submit_work(tsk); do { __schedule(); } while (need_resched()); }schedul...
2019-02-20 16:58:20 21129
原创 调度器概述
调度类现代版本的内核中,比如笔者使用的Linux 4.0,已经去除了O(N)和O(1)调度器的实现。默认实现了另外更新的4种调度器:deadline,realtime,idle和CFS。内核使用struct sched_class来描述一个调度类,也就是一个调度器。这几个调度类在内核中的定义如下:rt_sched_class --------- realtime调度器fair_sched_...
2019-02-20 11:18:31 535
原创 Linux2.6 O(1)调度器
O(1)调度器存在于2.4-2.6版本的内核中。普通进程和实时进程Linux中把进程分为普通进程和实时进程两种,实时进程对于系统的响应时间要求很高,因此实时进程的优先级都是要高于普通进程的。静态和动态优先级静态和动态优先级的范围都是[100~139],这两个值对于普通进程来说非常重要。静态优先级(值越小)越高,基本时间片越长,静态优先级越低(值越大),基本时间片越短。这是有一个固定公式进...
2019-02-15 15:56:12 801
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人