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.pswp.cn/news/443538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443538.shtml
英文地址,請注明出處:http://en.pswp.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…