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

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

linux的進程調(diào)度命令 linux 進程調(diào)度

Linux 進程調(diào)度

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

創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、金門網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5高端網(wǎng)站建設、商城系統(tǒng)網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為金門等各大城市提供網(wǎng)站開發(fā)制作服務。

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

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

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

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

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

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

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

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

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

Linux中如何啟動進程?進程調(diào)度命令有哪些?

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

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

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

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

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

常用的進程調(diào)度命令有哪些?

常用的進程調(diào)度命令有:at、batch、crontab。

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

Linux進程的調(diào)度

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

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

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

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

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

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

2) 檢查prev的狀態(tài),更新運行隊列 。如果不是可運行狀態(tài),而且在內(nè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自帶的任務切換機制,需要通過手工的方式實現(xiàn)了切換。

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

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

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

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

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

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

worker_processes? ? ? 4;

worker_cpu_affinity 0001001001001000;

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

worker_processes? ? ? 2;

worker_cpu_affinity 01011010;

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

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

主要參考 :Linux manual page - sched

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

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

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

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

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

其中 pid 為0時,設置自身的調(diào)度策略和參數(shù)。結(jié)構(gòu)體 sched_attr 包含以下字段: size 、 sched_policy (即調(diào)度策略,具體會在下一節(jié)介紹)、 sched_flags 、 sched_nice 、 sched_runtime 、 sched_deadline 、 sched_period (最后三個為 SCHED_DEADLINE 相關(guān)的參數(shù))。當設置成功,系統(tǒng)調(diào)用返回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)調(diào)整的量(比如進程ready卻沒被調(diào)度,則增加)。


當前文章:linux的進程調(diào)度命令 linux 進程調(diào)度
本文URL:http://weahome.cn/article/hgdhgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部