linux時間片
1. linux 判斷進程時間片耗盡
假如這段代碼就放在調度程序中,就應該是每次先把某個進程時間片減1,再判斷,確定是休眠還是繼續
不是放在調度裡面,它沒有理由去處理這個數字
處理task_struct的應該是內核程序..我看的內核代碼不多,只能猜...
2. linux 每一個時間片是哪個進程佔用的
方法/步驟
首先,我們在測試項目中新建一個用戶控制項,然後把GridControl拖到用戶控制項中,設置控制項的Dock屬性為Fill(可根據需要自行設置)。GridControl的顯示效果如下圖所示:
由上圖可以看到,我們拖進去的控制項上面顯示的有一段說明性的英文文字,如果不想顯示這些文字,那我們就點擊RunDesigner進入屬性編輯器窗體,修改OptionView下的showGroupPanel屬性為False,這樣,上面的提示性文字就消失了;
設置屬性控制GridControl中列頭的過濾器:我們只需要點擊runDesign,設置OptionsCustomization下的AllowFilter屬性為False,即可禁用過濾器,設為True時,可啟用過濾器;
如何控制GridControl右鍵單擊可彈出右鍵菜單:如果不需要右鍵菜單,我們可以在OptionMenu下設置其EnableColumnMenu屬性為false,如若需要右鍵菜單,則把屬性設為True即可;
在查詢數據為空時,顯示自定義的字元提示:當我們的查詢書庫為空時,我們可以在列表中設置字元提示信息,而不是彈出一個窗體提示信息,這樣我們需要在gridview1_CustomDrawEmptyForwground()事件下寫以下方法即可;
6
顯示行號:使用GridControl時,我們一般在第一行顯示序號便於記錄數,在如果需要在第一行顯示行號,那麼我們可以在gridView1_CustomDrawRowIndicator(object sender, e)下寫如下代碼,即可實現顯示行號的功能;
7
顯示水平滾動條:當我們顯示的列數很多時,可能用到水平滾動條,在GridControl中,顯示滾動條的控制只需要設置this.gridView.OptionsView.ColumnAutoWidth = false;
3. Linux內核初始化 sp設置
Linux內核初始化sp設置方法是sp只要指向遠大於512偏移處都可以。linux在初始的時候會調用fork系統調用來創建第一個進程,他被成為零號進程,創建後會一直存在並且零號進程是所有進程的父進程。
Linux內核初始化的設置方法
首先看任務的結構體,前面是進程的狀態時間片,優先順序信號打開文件等等,重要的是最後TSS結構體,TSS段存放的是進程的一些寄存器的狀態標識,當CPU運行某個進程時,需要將這個進程的TSS段放入CPU中。
TSS實際就是CPU在運行時產生的一些結果會放到這些寄存器中,當再次調用這個進程時再把TSS段放進CPU中,需要將linux的信息從硬碟中移到內存里,之後進行內存向量等的初始化,在內核初始化的過程中,會手動創建0號進程。
4. 在linux中如何根據nice值設置任務時間片
Linux內核的三種調度方法:
1、SCHED_OTHER 分時調度策略。
2、SCHED_FIFO實時調度策略,先到先服務。
3、SCHED_RR實時調度策略,時間片輪轉。
實時進程將得到優先調用,實時進程根據實時優先順序決定調度權值,分時進程則通過nice和counter值決定權值,nice越小,counter越大,被調度的概率越大,也就是曾經使用了cpu最少的進程將會得到優先調度。
所有任務都採用linux分時調度策略時即nice時,採用以下方式設置任務時間片。
1,創建任務指定採用分時調度策略,並指定優先順序nice值(-20~19)。
2,將根據每個任務的nice值確定在cpu上的執行時間(counter)。
3,如果沒有等待資源,則將該任務加入到就緒隊列中。
4, 調度程序遍歷就緒隊列中的任務,通過對每個任務動態優先順序的計算(counter+20-nice)結果,選擇計算結果最大的一個去運行,當這 個時間片用完後(counter減至0)或者主動放棄cpu時,該任務將被放在就緒隊列末尾(時間片用完)或等待隊列(因等待資源而放棄cpu)中。
5,此時調度程序重復上面計算過程,轉到第4步。
6,當調度程序發現所有就緒任務計算所得的權值都為不大於0時,重復第2步。
5. linux 什麼時候調用schele
Linux在眾多進程中是怎麼進行調度的,這個牽涉到Linux進程調度時機的概念,由Linux內核中Schele()的函數來決定是否要進行進程的切換,如果要切換的話,切換到哪個進程等等。
Linux進程調度時機主要有:
1、進程狀態轉換的時刻:進程終止、進程睡眠;
2、當前進程的時間片用完時(current->counter=0);
3、設備驅動程序
4、進程從中斷、異常及系統調用返回到用戶態時;
時機1,進程要調用sleep()或exit()等函數進行狀態轉換,這些函數會主動調用調度程序進行進程調度;
時機2,由於進程的時間片是由時鍾中斷來更新的,因此,這種情況和時機4是一樣的。
時機3,當設備驅動程序執行長而重復的任務時,直接調用調度程序。在每次反復循環中,驅動程序都檢查need_resched的值,如果必要,則調用調度程序schele()主動放棄CPU。
時機4,如前所述,不管是從中斷、異常還是系統調用返回,最終都調用ret_from_sys_call(),由這個函數進行調度標志的檢測,如果必要,則調用調用調度程序。那麼,為什麼從系統調用返回時要調用調度程序呢?這當然是從效率考慮。從系統調用返回意味著要離開內核態而返回到用戶態,而狀態的轉換要花費一定的時間,因此,在返回到用戶態前,系統把在內核態該處理的事全部做完。
對於直接執行調度程序的時機,我們不討論,因為後面我們將會描述調度程序的工作過程。前面我們討論了時鍾中斷,知道了時鍾中斷的重要作用,下面我們就簡單看一下每個時鍾中斷發生時內核要做的工作,首先對這個最頻繁的調度時機有一個大體了解,然後再詳細討論調度程序的具體工作過程。
每個時鍾中斷(timer interrupt)發生時,由三個函數協同工作,共同完成進程的選擇和切換,它們是:schele()、do_timer()及ret_form_sys_call()。我們先來解釋一下這三個函數:
schele():進程調度函數,由它來完成進程的選擇(調度);
do_timer():暫且稱之為時鍾函數,該函數在時鍾中斷服務程序中被調用,是時鍾中斷服務程序的主要組成部分,該函數被調用的頻率就是時鍾中斷的頻率即每秒鍾100次(簡稱100赫茲或100Hz);
ret_from_sys_call():系統調用返回函數。當一個系統調用或中斷完成時,該函數被調用,用於處理一些收尾工作,例如信號處理、核心任務等等。
這三個函數是如何協調工作的呢?
前面我們看到,時鍾中斷是一個中斷服務程序,它的主要組成部分就是時鍾函數do_timer(),由這個函數完成系統時間的更新、進程時間片的更新等工作,更新後的進程時間片counter作為調度的主要依據。
在時鍾中斷返回時,要調用函數ret_from_sys_call(),前面我們已經討論過這個函數,在這個函數中有如下幾行:
cmpl $0, _need_resched
jne reschele
……
restore_all:
RESTORE_ALL
reschele:
call SYMBOL_NAME(schele)
jmp ret_from_sys_call
這幾行的意思很明顯:檢測 need_resched 標志,如果此標志為非0,那麼就轉到reschele處調用調度程序schele()進行進程的選擇。調度程序schele()會根據具體的標准在運行隊列中選擇下一個應該運行的進程。當從調度程序返回時,如果發現又有調度標志被設置,則又調用調度程序,直到調度標志為0,這時,從調度程序返回時由RESTORE_ALL恢復被選定進程的環境,返回到被選定進程的用戶空間,使之得到運行。
以上就是時鍾中斷這個最頻繁的調度時機。討論這個的主要目的使讀者對時機4有個大致的了解。
另外,TIF_NEED_RESCHED的設置時機 :
設置這個標志的函數主要有兩個: resched_task(),set_tsk_need_resched().主要是resched_task,而resched_task的調用者 check_preempt_curr更是通過:try_to_wake_up/wake_up_new_task/pull_task /__migrate_task 這些被廣泛使用的函數, 從而分布在內核中大量的檢查點有機會搶占進程.
最後要說明的是,系統調用返回函數ret_from_sys_call()是從系統調用、異常及中斷返回函數通常要調用的函數,但並不是非得調用,對於那些要經常被響應的和要被盡快處理的中斷請求信號,為了減少系統開銷,處理完成後並不調用 ret_from_sys_call()(因為很顯然的,從這些中斷處理程序返回到的用戶空間肯定是那個被中斷的進程,無需重新選擇),並且,它們作的工作要盡可能少,因為響應的頻率太高了。
Linux進程調度和其他的UNIX進程調度不同,尤其是在「nice level」優先順序的處理上,與優先權調度(priority高的進程最先運行)不同,Linux用的是時間片輪轉調度(Round Robing),但同時又保證了高優先順序的進程運行的既快、時間又長(both sooner and longer)。而標準的UNIX調度程序都用到了多級進程隊列。大多數的實現都用到了二級優先隊列:一個標准隊列和一個實時(「real time」)隊列。一般情況下,如果實時隊列中的進程未被阻塞,它們都要在標准隊列中的進程之前被執行,並且,每個隊列中,「nice level」高的進程先被執行。
總體上,Linux 調度序程在交互性方面表現很出色,當然了,這是以犧牲一部分「吞吐量」為代價的。
6. 當前linux內核的進程調度,時間片究竟是多長時間
linux內核是通過硬體中斷來執行相應的中斷處理程序,linux內核是利用中斷程序實現了對task任務鏈表的分析處理,這自然也包括重新分配cpu時間片
linux系統上,中斷系統是很核心的東西,她很大程度上能影響整個內核,因為任何時刻都有可能發生中斷信號,無論cpu在干什麼都一定會處理的(除非中斷還沒初始化完成或者還在屏蔽中斷)
7. linux中什麼是時間片
時間片,簡單來說就是CPU分配給各個程序的時間,使各個程序從表面上看是同時進行的,而不會造成CPU資源浪費。
時間片輪轉調度中唯一有趣的一點是時間片的長度。從一個進程切換到另一個進程是需要一定時間的--保存和裝入寄存器值及內存映像,更新各種表格和隊列 等。
假如進程切換(process switch) - 有時稱為上下文切換(context switch),需要5毫秒,再假設時間片設為20毫秒,則在做完20毫秒有用的工作之後,CPU將花費5毫秒來進行進程切換。CPU時間的20%被浪費 在了管理開銷上。
8. linux線程時間片多長
Linux內核切換線程時間在微秒級別,幾十微秒。
1. 查看需要更新的內核命令:
1
2
apt-cache search linux
#該命令將會顯示所有可以獲取的內核
2. 安裝內核,假設要安裝的內核為2.6.39-0,則使用下面的命令
1
2
sudo apt-get install linux-headers-2.6.39-0-generic linux-image-2.6.39-0-generic
#安裝後,reboot即可,重啟後,既是以新內核啟動。
9. linux可以修改進程時間片的長短嗎
明確回答,no
不可能改某個進程的時間片長度,系統調度的時間片是既定的。具體在代碼的什麼地方,還沒研究過,但是Linux的實現原理是這樣的
想要一個進程獲得更多的運行時間只有提高它的優先順序。