真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

進程調度linux命令,Linux系統(tǒng)中的進程調度采用

Linux進程的調度

上回書說到 Linux進程的由來 和 Linux進程的創(chuàng)建 ,其實在同一時刻只能支持有限個進程或線程同時運行(這取決于CPU核數量,基本上一個進程對應一個CPU),在一個運行的操作系統(tǒng)上可能運行著很多進程,如果運行的進程占據CPU的時間很長,就有可能導致其他進程餓死。為了解決這種問題,操作系統(tǒng)引入了 進程調度器 來進行進程的切換,輪流讓各個進程使用CPU資源。

創(chuàng)新互聯(lián)公司于2013年開始,先為元寶等服務建站,元寶等地企業(yè),進行企業(yè)商務咨詢服務。為元寶企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

1)rq: 進程的運行隊列( runqueue), 每個CPU對應一個 ,包含自旋鎖(spinlock)、進程數量、用于公平調度的CFS信息結構、當前運行的進程描述符等。實際的進程隊列用紅黑樹來維護(通過CFS信息結構來訪問)。

2)cfs_rq: cfs調度的進程運行隊列信息 ,包含紅黑樹的根結點、正在運行的進程指針、用于負載均衡的葉子隊列等。

3)sched_entity: 把需要調度的東西抽象成調度實體 ,調度實體可以是進程、進程組、用戶等。這里包含負載權重值、對應紅黑樹結點、 虛擬運行時vruntime 等。

4)sched_class:把 調度策略(算法)抽象成調度類 ,包含一組通用的調度操作接口。接口和實現是分離,可以根據調度接口去實現不同的調度算法,使一個Linux調度程序可以有多個不同的調度策略。

1) 關閉內核搶占 ,初始化部分變量。獲取當前CPU的ID號,并賦值給局部變量CPU, 使rq指向CPU對應的運行隊列 。 標識當前CPU發(fā)生任務切換 ,通知RCU更新狀態(tài),如果當前CPU處于rcu_read_lock狀態(tài),當前進程將會放入rnp- blkd_tasks阻塞隊列,并呈現在rnp- gp_tasks鏈表中。 關閉本地中斷 ,獲取所要保護的運行隊列的自旋鎖, 為查找可運行進程做準備 。

2) 檢查prev的狀態(tài),更新運行隊列 。如果不是可運行狀態(tài),而且在內核態(tài)沒被搶占,應該從運行隊列中 刪除prev進程 。如果是非阻塞掛起信號,而且狀態(tài)為TASK_INTER-RUPTIBLE,就把該進程的狀態(tài)設置為TASK_RUNNING,并將它 插入到運行隊列 。

3)task_on_rq_queued(prev) 將pre進程插入到運行隊列的隊尾。

4)pick_next_task 選取將要執(zhí)行的next進程。

5)context_switch(rq, prev, next)進行 進程上下文切換 。

1) 該進程分配的CPU時間片用完。

2) 該進程主動放棄CPU(例如IO操作)。

3) 某一進程搶占CPU獲得執(zhí)行機會。

Linux并沒有使用x86 CPU自帶的任務切換機制,需要通過手工的方式實現了切換。

進程創(chuàng)建后在內核的數據結構為task_struct , 該結構中有掩碼屬性cpus_allowed,4個核的CPU可以有4位掩碼,如果CPU開啟超線程,有一個8位掩碼,進程可以運行在掩碼位設置為1的CPU上。

Linux內核API提供了兩個系統(tǒng)調用 ,讓用戶可以修改和查看當前的掩碼:

1) sched_setaffinity():用來修改位掩碼。

2) sched_getaffinity():用來查看當前的位掩碼。

在下次task被喚醒時,select_task_rq_fair根據cpu_allowed里的掩碼來確定將其置于哪個CPU的運行隊列,一個進程在某一時刻只能存在于一個CPU的運行隊列里。

在Nginx中,使用了CPU親和度來完成某些場景的工作:

worker_processes? ? ? 4;

worker_cpu_affinity 0001001001001000;

上面這個配置說明了4個工作進程中的每一個和一個CPU核掛鉤。如果這個內容寫入Nginx的配置文件中,然后Nginx啟動或者重新加載配置的時候,若worker_process是4,就會啟用4個worker,然后把worker_cpu_affinity后面的4個值當作4個cpu affinity mask,分別調用ngx_setaffinity,然后就把4個worker進程分別綁定到CPU0~3上。

worker_processes? ? ? 2;

worker_cpu_affinity 01011010;

上面這個配置則說明了兩個工作進程中的每一個和2個核掛鉤。

Linux 進程調度

Linux的調度策略區(qū)分實時進程和普通進程,實時進程的調度策略是SCHED_FIFO和SCHED_RR,普通的,非實時進程的調度策略是SCHED_NORMAL(SCHED_OTHER)。

實時調度策略被實時調度器管理,普通調度策略被完全公平調度器來管理。實時進程的優(yōu)先級要高于普通進程(nice越小優(yōu)先級越高)。

SCHED_FIFO實現了一種簡單的先入先出的調度算法,它不使用時間片,但支持搶占,只有優(yōu)先級更高的SCHED_FIFO或者SCHED_RR進程才能搶占它,否則它會一直執(zhí)行下去,低優(yōu)先級的進程不能搶占它,直到它受阻塞或自己主動釋放處理器。

SCHED_RR是帶有時間片的一種實時輪流調度算法,當SCHED_RR進程耗盡它的時間片時,同一優(yōu)先級的其它實時進程被輪流調度,時間片只用來重新調用同一優(yōu)先級的進程,低優(yōu)先級的進程決不能搶占SCHED_RR任務,即使它的時間片耗盡。SCHED_RR是帶時間片的SCHED_FIFO。

Linux的實時調度算法提供了一種軟實時工作方式,軟實時的含義是盡力調度進程,盡力使進程在它的限定時間到來前運行,但內核不保證總能滿足這些進程的要求,相反,硬實時系統(tǒng)保證在一定的條件下,可以滿足任何調度的要求。

SCHED_NORMAL使用完全公平調度算法(CFS),之前的算法直接將nice值對應時間片的長度,而在CFS中,nice值只作為進程獲取處理器運行比的權重,每個進程都有一個權重,nice優(yōu)先級越高,權重越大,表示應該運行更長的時間。Linux的實現中,每個進程都有一個vruntime字段,vruntime是經過量化的進程運行時間,也就是實際運行時間除以權重,所以每個量化后的vruntime應該相等,這就體現了公平性。

CFS當然也支持搶占,但與實時調度算法不同,實時調度算法是根據優(yōu)先級進行搶占,CFS是根據vruntime進行搶占,vruntime小就擁有優(yōu)先被運行的權利。

為了計算時間片,CFS算法需要為完美多任務中的無限小調度周期設定近似值,這個近似值也稱作目標延遲,指每個可運行進程在目標延遲內都會調度一次,如果進程數量太多,則時間粒度太小,所以約定時間片的默認最小粒度是1ms。

進程可以分為I/O消耗型和處理器消耗型,這兩種進程的調度策略應該不同,I/O消耗型應該更加實時,給對端的感覺是響應很快,同時它一般又不會消耗太多的處理器,因而I/O消耗型需要調度頻繁。相對來說,處理器消耗型不需要特別實時,應該盡量降低它的調度頻度,延長其運行時間。

參考: linux內核分析——CFS(完全公平調度算法) - 一路向北你好 - 博客園

Linux中如何啟動進程?進程調度命令有哪些?

Linux技術的發(fā)展引起了很多企業(yè)和個人的關注。市場對Linux運維的需求逐漸增加,學習Linux技術的人越來越多。在Linux運維中,進程是必須學習掌握的技能。那么Linux中如何啟動進程?常用的進程調度命令有哪些?

執(zhí)行中的程序稱作進程。當程序的可執(zhí)行文件存儲在存儲器中并運行時,每個進程將被動態(tài)分配系統(tǒng)資源、內存、安全屬性和相關狀態(tài)。多個進程可以與同一個程序相關聯(lián),并在同一時間執(zhí)行,而不會相互干擾。操作系統(tǒng)將有效地管理和跟蹤所有正在運行的進程。

Linux中如何啟動進程?啟動進程的方法是什么?

手工啟動。用戶在輸入端發(fā)出命令,直接啟動進程。分為前臺啟動和后臺啟動。前臺啟動:直接在SHELL中輸入命令進行啟動。后臺啟動:啟動一個目前并不緊急的進程。

調度啟動。系統(tǒng)管理員根據系統(tǒng)資源和進程占用資源的情況,事先進行調度安排,指定任務運行的時間和場合,到時候系統(tǒng)會自動完成該任務。

常用的進程調度命令有哪些?

常用的進程調度命令有:at、batch、crontab。

以上便是關于“如何啟動或終止進程?常用的進程調度命令有哪些?”的相關介紹。想要成為一名優(yōu)秀的Linux運維工程師,需要掌握更多的Linux知識。

Linux系統(tǒng)進程調度

主要參考 :Linux manual page - sched

自從linux內核2.6.23以來,默認的進程調度器就被設置為完全公平調度器(CFS,complete fair scheduler),取代了之前的O(1)調度器。

每個線程都有一個靜態(tài)調度優(yōu)先級,即 sched_priority 字段。

一個線程的調度策略決定了線程會被插入到同級靜態(tài)優(yōu)先級的線程隊列的位置,以及它在隊列中會怎樣移動。

所有的調度都是可插入的,如果一個更高靜態(tài)優(yōu)先級的線程準備好了,現在運行中的線程就會被插入。而調度策略則僅僅影響了同樣靜態(tài)優(yōu)先級的線程。

進程(線程)可以通過系統(tǒng)調用設置自身或者其他進程(線程)的調度策略。

其中 pid 為0時,設置自身的調度策略和參數。結構體 sched_attr 包含以下字段: size 、 sched_policy (即調度策略,具體會在下一節(jié)介紹)、 sched_flags 、 sched_nice 、 sched_runtime 、 sched_deadline 、 sched_period (最后三個為 SCHED_DEADLINE 相關的參數)。當設置成功,系統(tǒng)調用返回0;否則返回-1,并會設置 errno 。

普通進程: SCHED_OTHER / SCHED_BATCH / SCHED_IDLE

實時進程: SCHED_FIFO / SCHED_RR

特殊實時進程: SCHED_DEADLINE

靜態(tài)優(yōu)先級:Static_priority:對于普通進程,靜態(tài)優(yōu)先級為0;對于實時進程,靜態(tài)優(yōu)先級為1-99,99為最高優(yōu)先級。

動態(tài)優(yōu)先級:Dynamic_priority:僅對普通進程有用,取決于nice和一個動態(tài)調整的量(比如進程ready卻沒被調度,則增加)。


分享名稱:進程調度linux命令,Linux系統(tǒng)中的進程調度采用
本文來源:http://www.weahome.cn/article/hdsico.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部