我试图了解负载均衡器如何在Linux内核中的多处理器系统上运行,

Linux调度程序基本上使用runques来存储它必须在下一次运行的任务,现在以执行load_balancer()的方式处理多处理器系统的情况,如Robert Loves书中给出的解释Linux内核开发第2版正在关注

首先,load_balance()调用find_busiest_queue()来确定最繁忙的runqueue . 换句话说,这是其中包含最多进程的runqueue . 如果没有比当前进程多25%或更多进程的runqueue,则find_busiest_queue()返回NULL并返回load_balance() . 否则,返回最繁忙的runqueue . 其次,load_balance()决定它想从中拉出的最繁忙的runqueue上的哪个优先级数组 . 过期的阵列是首选,因为这些任务在相对较长的时间内没有运行,因此很可能不在处理器的缓存中(即,它们不是缓存热点) . 如果过期的优先级数组为空,则活动的数组是唯一的选择 . 接下来,load_balance()查找具有任务的最高优先级(最小值)列表,因为公平分配高优先级任务比低优先级任务更重要 . 分析给定优先级的每个任务,以查找未运行的任务,不阻止通过处理器关联迁移,而不是缓存热 . 如果任务满足此条件,则调用pull_task()将任务从最繁忙的runqueue拉到当前的runqueue . 只要运行队列保持不 balancer ,就会重复前两个步骤,并将更多任务从最繁忙的队列中拉到当前 . 最后,当解决不 balancer 时,当前的runqueue被解锁并且load_balance()返回 .

代码如下

static int load_balance(int this_cpu, runqueue_t *this_rq,

struct sched_domain *sd, enum idle_type idle)

{

struct sched_group *group;

runqueue_t *busiest;

unsigned long imbalance;

int nr_moved;

spin_lock(&this_rq->lock);

group = find_busiest_group(sd, this_cpu, &imbalance, idle);

if (!group)

goto out_balanced;

busiest = find_busiest_queue(group);

if (!busiest)

goto out_balanced;

nr_moved = 0;

if (busiest->nr_running > 1) {

double_lock_balance(this_rq, busiest);

nr_moved = move_tasks(this_rq, this_cpu, busiest,

imbalance, sd, idle);

spin_unlock(&busiest->lock);

}

spin_unlock(&this_rq->lock);

if (!nr_moved) {

sd->nr_balance_failed++;

if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) {

int wake = 0;

spin_lock(&busiest->lock);

if (!busiest->active_balance) {

busiest->active_balance = 1;

busiest->push_cpu = this_cpu;

wake = 1;

}

spin_unlock(&busiest->lock);

if (wake)

wake_up_process(busiest->migration_thread);

sd->nr_balance_failed = sd->cache_nice_tries;

}

} else

sd->nr_balance_failed = 0;

sd->balance_interval = sd->min_interval;

return nr_moved;

out_balanced:

spin_unlock(&this_rq->lock);

if (sd->balance_interval < sd->max_interval)

sd->balance_interval *= 2;

return 0;

}

我不清楚的是上面代码中的结构struct sched_domain * sd这个我检查的结构在include / linux / sched.h中定义如下http://lxr.linux.no/linux+v3.7.1/include/linux/sched.h#L895它是一个很大的结构所以我刚刚给出了一个简单的链接 . 我想知道的是上面代码中struct sched_domain的用途是什么?

为什么在调用load_balancer()时会使用这个结构代表什么?

Linux内核 sched,struct sched_domain在include / linux / sched.h中的含义(在内核中调度域)...相关推荐

  1. 【Linux 内核】调度器 ⑧ ( 进程优先级源码 include\linux\sched\prio.h | 进程分类 | 实时进程 | 普通进程 | 进程优先级数值 | 0 ~ 99 实时进程 )

    文章目录 一.Linux 内核进程优先级源码 二.进程分类 三.进程优先级数值 ( 0 ~ 99 实时进程 | 100 ~ 139 普通进程 ) 在之前的博客 [Linux 内核]进程管理 - 进程优 ...

  2. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

  3. Linux内核线程kernel thread详解--Linux进程的管理与调度

    内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...

  4. linux内核开机显示企鹅logo,批改linux内核kernel开机logo(小企鹅)

    修改linux内核kernel开机logo(小企鹅) 修改linux内核kernel的开机图片(原为小企鹅图片). 转载请注明出处:http://blog.csdn.net/wang_zheng_ka ...

  5. Linux内核链表访问链表头指针,linux内核——链表结构分析

    http://blog.csdn.net/tigerjibo/article/details/8299584 简单整理(使用linux3.0内核) 这里首先学习的是内核中一种抽象定义的双向链表,为了提 ...

  6. 《Linux网络接口》---------struct ifreq struct ifconf

    网络接口--------------struct ifconf,struct ifreq 网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示: 接口 SIOCGIFC ...

  7. linux 内核 核心代码,8分钟掌握Linux内核分析的核心科技

    原标题:8分钟掌握Linux内核分析的核心科技 作者: OUYANG_LINUX007 来源: http://blog.csdn.net/ouyang_linux007/article/details ...

  8. linux的memmap函数_究竟有多少linux内核命令行参数

    linux启动时可以带命令行参数,这些参数会影响内核乃至启动脚本的行为.在内核中,用early_param(命令行参数名称,命令行参数处理函数)来注册.除了内核参数,还可以有其他的命令行参数,各自有自 ...

  9. linux内核源码系统调用有多少个,Linux内核源码目录介绍

    Linux的内核源代码可以从很多途径得到,我一般常常去kernel.org看看.一般来讲,在安装的linux系统下,usr/src/linux目录下的东西就是内核源代码.源码的版本号有一个非常简单的编 ...

最新文章

  1. 【干货】Hey, 扁平你个锤子
  2. java 中覆 写tostring_如何在Java中正确覆盖toString()?
  3. 【数据库】Mysql日期/时间函数实际案例
  4. hosts ip 指向ip_不同网段共享打印机?不同IP段怎么共享打印机?
  5. spring cloud 学习(5) - config server
  6. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
  7. 忘记root密码,怎么办
  8. mx350显卡天梯图_CPU天梯图与显卡天梯图2020年最新版
  9. tt服务器显示start dcs,TT服务器使用手册
  10. shell提示Algorithm negotiation fail
  11. 计算机电源+3c认证,电源适配器要不要做3C认证?怎么做
  12. UE脱机激活如何不拔网线实现在线激活
  13. 关于Code Virtualizer pcode解密的一种方法
  14. 两条命令让你的git轻松自动变基,学到了!
  15. 5月16日第壹简报,星期一,农历四月十六
  16. Pycharm、Vscode设置美女背景【内附20张高清图片】
  17. (批处理BAT)批量提取pdf大小
  18. win10设置虚拟内存_小技巧| 电脑经内存不够用,教你如何设置虚拟内存
  19. 字符串与正则表达式习题
  20. GLADE3教程(一)

热门文章

  1. 【计算机毕业设计】基于WEB的婴幼儿用品商城系统
  2. python自动化的实践笔记
  3. 【PTA】7-1 航空公司VIP客户查询 (25 分)
  4. ChatGPT助力校招----面试问题分享(十一)
  5. 抽样分布之χ2 分布,t分布,F分布
  6. Tkinter小结 界面+快捷键设置
  7. Java的类和对象 坦克
  8. 解决方案 TestCenter自动测试软件平台
  9. myeclise CI 2018 9破解方法
  10. html 自动缩放div,动态调整div的css缩放以适应容器的大小