linux多进程原理,Linux进程调度

极简模式

假设我的系统只有一种调度算法cfs

那么有个调度的队列 cfs_rq

所有running的进程都会 进入这个队列,不在running 或者其他情况会出队列,ok。则假设队列控制的算法有以下。

cfs_rq_enqueue

cfs_rq_dequeue

cfs_rq_pick

所操作的是进程描述符 task_struck.

那么很简单可以理解上述过程

scehed_pick ---->cfs_rq_pick就行了。

多个调度算法

那么如果除了cfs还有rt算法

那么就有两个调度队列,cfs_rq和rt_rq。

一个进程task_struck 有可能属于cfs和rt。

那么考虑 scehed_pick 是如何pick?

ok,Linux建立一个sched_class 的结构链表,sched_class_cfs和sched_class_rt或者还有其他的。顺序的从这么多个调度算法中选择一个合适的。

stop_sched_class -> -> rt_sched_class -> fair_sched_class -> idle_sched_class

如上。那么问题来了,如果前面的队列一直满足,后面的队列就永远得不到执行,这些sched_class之间没有个合理的逻辑吗?

目前看到的逻辑,任务dl 是最先满足的,rt次之,cfs随后,idle当然是最后的,这样的逻辑,基本上能让人有点信服。

能信服,不够科学吧???还是有什么我没有看到的优先级。???

再抽象一层sched_entity

一般情况 cfs和rt或者其他的什么的调度算法的接口 enqueue或者dequeue 都是对task_struck 进行操作的。

但是Linux 这里再抽象一个sched_entity,每个task_struck 对应一个sched_entity 。调度算法对sched_entity操作就行了。

这样抽象我猜想有两个目的,一个是统一比较好看,和task_struck隔离。第二个是,为了下面的组调度做准备。

加入组调度

组调度的数据结构,和组织架构大概是如下这个样子

72903e4df3b13fbbe64562bb2067aa1e.png

c3ecbe2be70e520fc5409ac428b6bf1e.png

OK,如果Linux进行组调度,就不会说使用全局的cfs_rq队列,或者rt_rq队列。而是将这些队列分配到task_group中。大概流程是这样子的。

我们假设我们有两个组 GroupA 和GroupB A占2 B占1 就是有三次调用的情况下 A组会被调用两次,B组只有1次。

f244348cf465370946e44e0fb7da3c76.png

这个时候有一个进程启动了 task_struck task1

5497f4f1bd25aab88ce828c43425dcf5.png

他选择A组,同理task2 可能也选择A task3可能选择B 如下

cf76f04cf549ff95c043c5182457d1c9.png

而A 和 B 不会记录 task的接口体,他记录task 的sched_entity 并用一个se[] 数组表示。

那么还有,task1 task2 有可能是cfs调度也有可能是rt,那么gruop结构体就用 cfs_se[] cfs_rq 和 rt_se[] rt_rq记录。

那么问题来了

task1 task2 属于cfs还是属于rt 是什么时候设置的?

在Android和linux里面没有看到,目前看到的是 0 也就是cfs,

那么有以下可能就是说,如果你不设置,就默认是0,或者继承父亲的等等这种默认策略。

scehed_pick 时候怎么pick?

按照pick三次 两次是A,ok。到了A,再使用这个策略

stop_sched_class -> dl_sched_class -> rt_sched_class -> fair_sched_class -> idle_sched_class

这个是说的通的。

但是要根据代码来。

接下来分析调度过程。

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

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

相关文章

openwrt使用linux内核版本,降低OpenWRT的Linux内核版本

不久前,为了移植某驱动程序,笔者可谓绞尽脑汁,在4.1内核版本上,尝试了很多次都没能成功,后来仔细分析,才知道是内核版本过高导致的,本文给出降低内核版本的方法,具体编译环境的搭建&…

Hibernate3.x,hibernate3.x,Hibernate3.x整合Spring3.x不能实现自动创建表结构的解决办法:...

一:今天遇到一个诡异的问题,就是关于hibernate3.x实现表结构自动创建,一般我们在用Struts2,Hibernate3.x,Spring3.x搭建框架,尤其在开发阶段都希望在启动Web容器时就可以根据Bean实体自动创建数据表结构&am…

linux s t i a权限,关于Linux下s、t、i、a权限

关于Linux下s、t、i、a权限文件权限除了r、w、x外还有s、t、i、a权限:s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(c h m …

linux ssh禁止用户访问任何目录,怎么限制远程ssh用户访问特定的文件

比如我要实现以下目标,通过配置linux限制SSH用户指定目录user 1 只可以访问 /Media, /Documents以及它的家目录User 2 只可以访问/Folder21, 以及它的家目录,User 3 只可以访问 /Documents, /Folder21 以及他的家目录,ssh如何限制指定目录2. 通过配置Linux权限限制S…

linux配置定时删除日志文件,Linux使用shell脚本定时删除历史日志文件

Linux使用shell脚本定时删除历史日志文件,文件,小时,时间,目录,脚本Linux使用shell脚本定时删除历史日志文件易采站长站,站长之家为您整理了Linux使用shell脚本定时删除历史日志文件的相关内容。1、tools目录文件结构[rootwww tools]# tree tools/tools/├── bin│…

linux awk执行shell命令,awk调用shell命令

在awk内部可利用管道和getline函数来调用shell命令,并可得到返回的具体结果,进行相应处理。例子如下:1) {while ( ("ls" | getline) >0 )print}输出当前目录下的所有文件,并打印到标准输出上。| 是管道,g…

linux添加启动脚本文件夹,linux – 将脚本中的符号链接添加到rc.d文件夹中以在系统启动期间启动进程...

我正在使用fedora 15.我试图添加MYSql守护进程在系统strtup期间启动.我已经明白我必须将它添加到rc5.d,因为它是默认目标&是graphical.target.来自inittab:systemd uses ‘targets’ instead of runlevels. By default, there are two main targets:multi-user.…

org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException:

一:今天在使用struts2做文件上传时出现了该异常: 警告: Unable to parse request org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (5897994) exceeds the configured maximum (2…

linux天气软件,类似智能手机!Linux中安装Conky天气插件

如今,智能手机中很多都安装相匹配外观的天气小插件,而对于喜欢操作系统平台的用户而言,可以在你的Linux桌面中拥有像智能手机一样的天气外观。通过Flair Weather Conky可以将使用一个GUI工具Conky Manager在Linux中轻松地管理Conky。这里介绍…

linux go 安装路径,在Alpine Linux D的路径中找不到已安装的Go二进制文件

我有一个Go二进制文件,试图在Alpine Docker映像上运行。这对于Docker Go二进制文件很好用。docker run -it alpine:3.3 shapk add --no-cache curlDOCKER_BUCKETget.docker.comDOCKER_VERSION1.9.1curl -fSL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/do…

linux安装下载中文包,linux下安装中文包和字体

在虚拟机中使用中文输入法和中文显示使用的是rhel5的镜像我把其镜像挂载在/mnt/cdrom中,然后切换到/Server目录下,安装支持中文字体Mount /dev/cdrom /mnt/cdromCd /mnt/cdrom/serverrpm -ivh fonts-chinese-3.02-9.6.el5.noarch.rpmrpm -ivh fonts-ISO8…

Java-Jdbc,JDBC连接Oracle11g实例:

很长时间没用Oracle数据库了,今天在公司的电脑上装了一个Oracle11g,安装完成后,顺便写了个简单的Jdbc连接Oracle的例子,现在记录一下,方便以后查看: 例子很简单,直接上代码: (注意&…

linux无桌面重做系统,Linux不需要重做系统

感谢hsyyf的投递但从系统构架上来讲,总所周知,Linux的稳定性远大于windows,单纯的使用不会引起系统的损坏。当不进行危险操作时,例如执行sudo rm-rf/*之类的命令,或者混用分区工具,是不会引起各种彻底性损坏…

linux远程连接工具putty使用方法,linux远程登陆工具putty使用

#putty工具百度下载即可,最好从官网下。安装时,除安装位置外,其余默认即可。1、使用命令ifconfig命令,记下eth0的IP,我的是192.168.1.1692、打开putty,并将查到的ip写在图中位置,下侧的Saved Se…

linux来源usb驱动在哪下载,Linux USB驱动程序基础

非常好的linux驱动入门,介绍详尽Linux USB驱动程序基础来源: ChinaUnix博客日期:2008.04.10 23:55(共有条评论) 我要评论(Linux USB Driver BasicsIntroductionDrivers are software components that operating systems use to providehardware specific services t…

linux中ss实现原理,ss 详解

ss用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat(参考https://www.jianshu.com/p/7630474c39b1)类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。当服…

Hibernate3.X实现基于CLOB字段类型的注解方式:

一:Hibernate3.X实现基于CLOB字段类型的注解方式的例子:下面直接上代码: 二:UserInfo.java package cn.gov.csrc.cms.model;import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity;…

linux mint安装步骤,Linux mint 安装步骤

##Linux mint 安装步骤##家里的笔记本以前一直用Deepin系统,但是Deepin系统的wifi实在是太慢了。还有就是启动软件是有时候总没响应,卡死机。 最近重装系统,选择了mint ,在这里记录下安装步骤。###1.制作U盘启动盘###下载iso文件,…

linux 商业游戏,Ubuntu下安装试玩原生Linux版商业游戏Braid

这款原生Linux版商业游戏Braid国外出售价大约在80美元左右。每年在Linux平台上发布的原生商业游戏是屈指可数,而且这些游戏的质量也是参差不齐。不过这款原生Linux版商业游戏Braid还是值得一玩的,这款Braid游戏创意十足,您可以通过拼图和时间…

linux centos 7 crontab 启动,CentOS 7 Linux执行crontab 计划任务实操 - 好应网

[inlosc_lg_title]一、环境准备[/inlosc_lg_title]yum install vixie-cron #安装定时任务插件yum install crontabs #安装定时任务crontabs/bin/systemctl restart crond.service #启动服务/bin/systemctl reload crond.service #重新载入配置/bin/systemctl status crond.serv…