當前位置:首頁 » 操作系統 » linuxtick

linuxtick

發布時間: 2022-09-18 06:02:25

linux 時鍾中斷 哪個定時器

一. Linux的硬體時間
PC機中的時間有三種硬體時鍾實現,這三種都是基於晶振產生的方波信號輸入。這三種時鍾為:(1)實時時鍾RTC ( Real Time Clock) (2)可編程間隔器PIT(Programmable Interval Timer )(3)時間戳計數器TSC(Time Stamp Clock)
1. 實時時鍾 RTC
用於長時間存放系統時間的設備,即時關機後也可依靠主板CMOS電池繼續保持系統的計時,原理圖如下:

Note: Linux與RTC的關系是,當Linux啟動時從RTC讀取時間和日期的基準值,然後在Kernel運行期間便拋開RTC,以軟體的形式維護系統的時間日期,並在適當時機由Kernel將時間寫回RTC Register.
1.1 RTC Register
(1). 時鍾與日歷Register
共10個,地址:0x00-0x09,分別用於保存時間日歷的具體信息,詳情如下:
00 Current Second for RTC
01 Alarm Second
02 Current Minute
03 Alarm Minute
04 Current Hour
05 Alarm Hour
06 Current Day of Week(1=Sunday)
07 Current Date of Month
08 Current Month
09 Current Year
(2).狀態和控制Register
共四個,地址:0x0a-0x0d,控制RTC晶元的工作方式,並表示當前狀態。
l 狀態RegisterA , 0x0A 格式如下:
bit[7]——UIP標志(Update in Progress),為1表示RTC正在更新日歷寄存器組中的值,此時日歷寄存器組是不可訪問的(此時訪問它們將得到一個無意義的漸變值)。
bit[6:4]——這三位是用來定義RTC的操作頻率。各種可能的值如下:

DV2 DV1 DV0
0 0 0 4.194304 MHZ
0 0 1 1.048576 MHZ
0 1 0 32.769 KHZ
1 1 0/1 任何
PC機通常設置成「010」。
bit[3:0]——速率選擇位(Rate Selection bits),用於周期性或方波信號輸出。
RS3 RS2 RS1 RS0 周期性中斷 方波 周期性中斷 方波
0 0 0 0 None None None None
0 0 0 1 30.517μs 32.768 KHZ 3.90625ms 256 HZ
0 0 1 0 61.035μs 16.384 KHZ
0 0 1 1 122.070μs 8.192KHZ
0 1 0 0 244.141μs 4.096KHZ
0 1 0 1 488.281μs 2.048KHZ
0 1 1 0 976.562μs 1.024KHZ
0 1 1 1 1.953125ms 512HZ
1 0 0 0 3.90625ms 256HZ
1 0 0 1 7.8125ms 128HZ
1 0 1 0 15.625ms 64HZ
1 0 1 1 31.25ms 32HZ
1 1 0 0 62.5ms 16HZ
1 1 0 1 125ms 8HZ
1 1 1 0 250ms 4HZ
1 1 1 1 500ms 2HZ
PC機BIOS對其默認的設置值是「0110」
l 狀態Register B , 0x0B 格式如下:
bit[7]——SET標志。為1表示RTC的所有更新過程都將終止,用戶程序隨後馬上對日歷寄存器組中的值進行初始化設置。為0表示將允許更新過程繼續。
bit[6]——PIE標志,周期性中斷enable標志。
bit[5]——AIE標志,告警中斷enable標志。
bit[4]——UIE標志,更新結束中斷enable標志。
bit[3]——SQWE標志,方波信號enable標志。
bit[2]——DM標志,用來控制日歷寄存器組的數據模式,0=BCD,1=BINARY。BIOS總是將它設置為0。
bit[1]——24/12標志,用來控制hour寄存器,0表示12小時制,1表示24小時制。PC機BIOS總是將它設置為1。
bit[0]——DSE標志。BIOS總是將它設置為0。
l 狀態Register C,0x0C 格式如下:
bit[7]——IRQF標志,中斷請求標志,當該位為1時,說明寄存器B中斷請求 發生。
bit[6]——PF標志,周期性中斷標志,為1表示發生周期性中斷請求。
bit[5]——AF標志,告警中斷標志,為1表示發生告警中斷請求。
bit[4]——UF標志,更新結束中斷標志,為1表示發生更新結束中斷請求。
l 狀態Register D,0x0D 格式如下:
bit[7]——VRT標志(Valid RAM and Time),為1表示OK,為0表示RTC 已經掉電。
bit[6:0]——總是為0,未定義。
2.可編程間隔定時器 PIT
每個PC機中都有一個PIT,以通過IRQ0產生周期性的時鍾中斷信號,作為系統定時器 system timer。當前使用最普遍的是Intel 8254 PIT晶元,它的I/O埠地址是0x40~0x43。
Intel 8254 PIT有3個計時通道,每個通道都有其不同的用途:
(1) 通道0用來負責更新系統時鍾。每當一個時鍾滴答過去時,它就會通過IRQ0向 系統 產生一次時鍾中斷。
(2) 通道1通常用於控制DMAC對RAM的刷新。
(3) 通道2被連接到PC機的揚聲器,以產生方波信號。
每 個通道都有一個向下減小的計數器,8254 PIT的輸入時鍾信號的頻率是1.193181MHZ,也即一秒鍾輸入1193181個clock-cycle。每輸入一個clock-cycle其時間 通道的計數器就向下減1,一直減到0值。因此對於通道0而言,當他的計數器減到0時,PIT就向系統產生一次時鍾中斷,表示一個時鍾滴答已經過去了。計數 器為16bit,因此所能表示的最大值是65536,一秒內發生的滴答數是:1193181/65536=18.206482.
PIT的I/O埠:
0x40 通道0 計數器 Read/Write
0X41 通道1計數器 Read/Write
0X42 通道2計數器 Read/Write
0X43 控制字 Write Only
Note: 因PIT I/O埠是8位,而PIT相應計數器是16位,因此必須對PIT計數器進行兩次讀寫。
8254 PIT的控制寄存器(0X43)的格式如下:
bit[7:6] — 通道選擇位:00 ,通道0;01,通道1;10,通道2;11,read-back command,僅8254。
bit[5:4] – Read/Write/Latch鎖定位,00,鎖定當前計數器以便讀取計數值;01,只讀高位元組;10,只讀低位元組;11,先高後低。
bit[3:1] – 設定各通道的工作模式。
000 mode0 當通道處於count out 時產生中斷信號,可用於系統定時
001 mode1 Hardware retriggerable one-shot
010 mode2 Rate Generator。產生實時時鍾中斷,通道0通常工作在這個模式下
011 mode3 方波信號發生器
100 mode4 Software triggered strobe
101 mode5 Hardware triggered strobe
3. 時間戳計數器 TSC
從Pentium開始,所有的Intel 80x86 CPU就都包含一個64位的時間戳記數器(TSC)的寄存器。該寄存器實際上是一個不斷增加的計數器,它在CPU的每個時鍾信號到來時加1(也即每一個clock-cycle輸入CPU時,該計數器的值就加1)。
匯編指令rdtsc可以用於讀取TSC的值。利用CPU的TSC,操作系統通常可以得到更為精準的時間度量。假如clock-cycle的頻率是400MHZ,那麼TSC就將每2.5納秒增加一次。
二. Linux時鍾中斷處理程序
1. 幾個概念
(1)時鍾周期(clock cycle)的頻率:8253/8254 PIT的本質就是對由晶體振盪器產生的時鍾周期進行計數,晶體振盪器在1秒時間內產生的時鍾脈沖個數就是時鍾周期的頻率。Linux用宏 CLOCK_TICK_RATE來表示8254 PIT的輸入時鍾脈沖的頻率(在PC機中這個值通常是1193180HZ),該宏定義在include/asm-i386/timex.h頭文件中
#define CLOCK_TICK_RATE 1193180 kernel=2.4 &2.6

(2)時鍾滴答(clock tick):當PIT通道0的計數器減到0值時,它就在IRQ0上產生一次時鍾中斷,也即一次時鍾滴答。PIT通道0的計數器的初始值決定了要過多少時鍾周期才產生一次時鍾中斷,因此也就決定了一次時鍾滴答的時間間隔長度。
(3)時鍾滴答的頻率(HZ):1秒時間內PIT所產生的時鍾滴答次數。 這個值也由PIT通道0的計數器初值決定的.Linux內核用宏HZ來表示時鍾滴答的頻率,而且在不同的平台上HZ有不同的定義值。對於ALPHA和 IA62平台HZ的值是1024,對於SPARC、MIPS、ARM和i386等平台HZ的值都是100。該宏在i386平台上的定義如下 (include/asm-i386/param.h):
#define HZ 100 kernel=2.4
#define HZ CONFIG_HZ kernel=2.6

(4)宏LATCH:定義要寫到PIT通道0的計數器中的值,它表示PIT將隔多少個時鍾周期產生一次時鍾中斷。公式計算:
LATCH=(1秒之內的時鍾周期個數)÷(1秒之內的時鍾中斷次數)=(CLOCK_TICK_RATE)÷(HZ)
定義在<include/linux/timex.h>
#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ)
(5)全局變數jiffies:用於記錄系統自啟動以來產生的滴答總數。啟動時,kernel將該變數初始為0,每次時鍾中斷處理程序timer_interrupt()將該變數加1。因為一秒鍾內增加的時鍾中斷次數等於Hz,所以jiffies一秒內增加的值也是Hz。由此可得系統運行時間是jiffies/Hz 秒。
jiffies定義於<linux/jiffies.h>中:
extern unsigned long volatile jiffies;
Note:在kernel 2.4,jiffies是32位無符號數;kernel 2.6,jiffies是64位無符號數。
(6)全局變數xtime: 結構類型變數,用於表示當前時間距UNIX基準時間1970-01-01 00:00:00的相對秒數值。當系統啟動時,Kernel通過讀取RTC Register中的數據來初始化系統時間(wall_time),該時間存放在xtime中。
void __init time_init (void) {
... ...
xtime.tv_sec = get_cmos_time ();
xtime.tv_usec = 0;
... ... }
Note:實時時鍾RTC的最主要作用便是在系統啟動時用來初始化xtime變數。
2.Linux的時鍾中斷處理程序
Linux下時鍾中斷處理由time_interrupt() 函數實現,主要完成以下任務:
l 獲得xtime_lock鎖,以便對訪問的jiffies_64 (kernel2.6)和 xtime進行保護
l 需要時應答或重新設置系統時鍾。
l 周期性的使用系統時間(wall_time)更新實時時鍾RTC
l 調用體系結構無關的時鍾常式:do_timer()。
do_timer()主要完成以下任務:
l 更新jiffies;
l 更新系統時間(wall_time),該時間存放在xtime變數中
l 執行已經到期的動態定時器
l 計算平均負載值
void do_timer(unsigned long ticks)
{
jiffies_64 += ticks;
update_process_times(user_mode(regs));
update_times (ticks);
}
static inline void update_times(unsigned long ticks)
{
update_wall_time ();
calc_load (ticks);
}
time_interrupt ():

static void timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) {
int count;
write_lock (&xtime_lock); //獲得xtime_lock鎖

if(use_cyclone)
mark_timeoffset_cyclone();
else if (use_tsc) {
rdtscl(last_tsc_low); //讀TSC register到last_tsc_low
spin_lock (&i8253_lock); //對自旋鎖i8253_lock加鎖,對8254PIT訪問
outb_p (0x00, 0x43);

count = inb_p(0x40);
count |= inb(0x40) << 8;
if (count > LATCH) {
printk (KERN_WARNING "i8253 count too high! resetting../n");
outb_p (0x34, 0x43);
outb_p (LATCH & 0xff, 0x40);
outb(LATCH >> 8, 0x40);
count = LATCH - 1;
}
spin_unlock (&i8253_lock);

if (count = = LATCH) {
count- -;
}

count = ((LATCH-1) - count) * TICK_SIZE;
delay_at_last_interrupt = (count + LATCH/2) / LATCH;
} //end use_tsc
do_timer_interrupt (irq, NULL, regs);
write_unlock(&xtime_lock);
}//end time_interrupt

do_timer_interrupt():
static inline void do_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
……
do_timer(regs);
if((time_status & STA_UNSYNC)= =0&&xtime.tv_sec> last_rtc_update + 660 && xtime.tv_usec >= 500000 - ((unsigned) tick) / 2 && xtime.tv_usec <= 500000 + ((unsigned) tick) / 2) {
if (set_rtc_mmss(xtime.tv_sec) == 0)
last_rtc_update = xtime.tv_sec;
else
last_rtc_update = xtime.tv_sec - 600;
……
}
do_timer_interrupt()主要完成:調用do_timer()和判斷是否需要更新CMOS時鍾。更新CMOS時鍾的條件如下:三個須同時成立
1.系統全局時間狀態變數time_status中沒有設置STA_UNSYNC標志,即Linux沒有設置外部同步時鍾(如NTP)
2.自從上次CMOS時鍾更新已經過去11分鍾。全局變數last_rtc_update保存上次更新CMOS時鍾的時間.
3.由於RTC存在Update Cycle,因此應在一秒鍾間隔的中間500ms左右調用set_rtc_mmss()函數,將當前時間xtime.tv_sec寫回RTC中。
Note. Linux kernel 中定義了一個類似jiffies的變數wall_jiffies,用於記錄kernel上一次更新xtime時,jiffies的值。

Summary: Linux kernel在啟動時,通過讀取RTC里的時間日期初始化xtime,此後由kernel通過初始PIT來提供軟時鍾。
時鍾中斷處理過程可歸納為:系統時鍾system timer在IRQ0上產生中斷;kernel調用time_interrupt();time_interrupt()判斷系統是否使用TSC,若使用 則讀取TSC register;然後讀取PIT 通道0的計數值;調用do_time_interrupt(),實現系統時間更新.

❷ 怎麼查 linux 當前cpu tick

如果是獲取 cpu 時鍾 的 tick:
clock_t tick1,tick2;
tick1=clock(); // 開機到執行這句時的毫秒數 ms
等待一會
tick2=clock(); // 開機到執行這句時的毫秒數 ms
dt = (double) (tick2 - tick1); // 或得時間差。
===============
如果是 獲取 CPU cycle count
#include <stdint.h>
// Windows
#ifdef _WIN32
#include <intrin.h>
uint64_t rdtsc(){
return __rdtsc();
}
// Linux/GCC
#else

uint64_t rdtsc(){
unsigned int lo,hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));

return ((uint64_t)hi << 32) | lo;
}
#endif
===================
獲取高精度時間(MS VC++ 6.0編譯器):
// Pentium instruction "Read Time Stamp Counter".
__forceinline unsigned _int64 My_clock(void)
{
_asm _emit 0x0F
_asm _emit 0x31
}
unsigned _int64 Start(void) { return My_clock();}
unsigned _int64 Stop(unsigned _int64 m_start, unsigned _int64 m_overhead)
{return My_clock()-m_start - m_overhead; }
==========
獲取cpu 速度(MS VC++ 6.0編譯器):
void get_CPU_speed()
{
unsigned _int64 m_start=0, m_overhead=0;
unsigned int CPUSpeedMHz;
m_start = My_clock();
m_overhead = My_clock() - m_start - m_overhead;
printf("overhead for calling My_clock=%I64d\n", m_overhead);
m_start = My_clock();
wait_ms(2000);
CPUSpeedMHz=(unsigned int) ( (My_clock()- m_start - m_overhead) / );
printf("CPU_Speed_MHz: %u\n",CPUSpeedMHz);
}

❸ linux下如何定期自動更新時間

Can use ntpdate or rdate command to sync the datetime with remote server.

i.e.:
# ntpdate remote_server
or
# rdate -s remote_server
Also, sync the remote server periodically is a good idea!
# crontab -e

# auto sync with time server at 0:00 everyday
0 0 * * * rdate -t 60 -s stdtime.gov.hk記住,更新完後要用 clock -w 或 hwclock -w 實時間寫入到BIOS中,這樣下次啟動機子時,時間就會自動更新了。1.在虛擬終端中使用date命令來查看和設置系統時間查看系統時鍾的操作:# date設置系統時鍾的操作:# date 091713272003.30通用的設置格式:# date 月日時分年.秒2.使用hwclock或clock命令查看和設置硬體時鍾查看硬體時鍾的操作:# hwclock --show 或# clock --show2003年09月17日 星期三 13時24分11秒 -0.482735 seconds設置硬體時鍾的操作:# hwclock --set --date="09/17/2003 13:26:00"或者# clock --set --date="09/17/2003 13:26:00"通用的設置格式:hwclock/clock --set --date=「月/日/年 時:分:秒」。3.同步系統時鍾和硬體時鍾Linux系統(筆者使用的是Red Hat 8.0,其它系統沒有做過實驗)默認重啟後,硬體時鍾和系統時鍾同步。如果不大方便重新啟動的話(伺服器通常很少重啟),使用clock或hwclock命令來同步系統時鍾和硬體時鍾。硬體時鍾與系統時鍾同步:# hwclock --hctosys或者# clock --hctosys上面命令中,--hctosys表示Hardware Clock to SYStem clock。系統時鍾和硬體時鍾同步:# hwclock --systohc或者# clock --systohc使用圖形化系統設置工具設置時間對於初學者來,筆者推薦使用圖形化的時鍾設置工具,如Red Hat 8.0中的日期與時間設置工具,可以在虛擬終端中鍵「redhat-config-time」命令,或者選擇「K選單/系統設置/日期與時間」來啟動日期時間設置工具。使用該工具不必考慮系統時間和硬體時間,只需從該對話框中設置日期時間,可同時設置、修改系統時鍾和硬體時鍾。

❹ linux系統時間越走越慢

系統時間慢是正常的,不然Linux也不會出現ntpd了,把ntpd服務啟動起來它就會自動同步時間了

❺ 如何在CentOS 7上使用TICK監視系統指標

Kernel 4.0 已經在上周發布,帶來了重大的變化,驅動程序更新,支持新的設備和增強文件系統功能;另外就是帶來用戶期待已久的功能就是:用戶更新內核時,不再需要重啟系統,當然對於普通用戶來說這個功能不太重要,但對於Linux伺服器來說就太重要了。

❻ linux 當前進程是時鍾中斷怎麼更新的進程調度時間

時鍾中斷對於調度系統來說就是一種驅動力。在時鍾中斷中,調度相關的一些時間計數量會被更新。同時會檢查一下目前運行的進程運行時間是不是超過了一個slice,如果超過了這個間隔,就會設置重新調度標記。會在schele函數中完成調度並完成進程切換。如果沒有小於這個slice量,那就不會觸發重新調度。為什麼這么做呢?因為時鍾中斷觸發頻率是很高的,每秒有1000個tick,如果一個tick就重新調度一次,那麼cpu將忙於進程切換,將大量的cpu白白浪費掉了,所以進程切換的頻率必須掌握一個度。

❼ linux 用戶進程 可以搶占內核進程嗎

1.2.1 調度過程中關閉內核搶占
我們在上一篇linux內核主調度器schele(文章鏈接, CSDN, Github)中在分析主調度器的時候, 我們會發現內核在進行調度之前都會通過preempt_disable關閉內核搶占, 而在完成調度工作後, 又會重新開啟內核搶占
參見主調度器函數schele
do {
preempt_disable(); /* 關閉內核搶占 */
__schele(false); /* 完成調度 */
sched_preempt_enable_no_resched(); /* 開啟內核搶占 */

} while (need_resched()); /* 如果該進程被其他進程設置了TIF_NEED_RESCHED標志,則函數重新執行進行調度 */123456123456

這個很容易理解, 我們在內核完成調度器過程中, 這時候如果發生了內核搶占, 我們的調度會被中斷, 而調度卻還沒有完成, 這樣會丟失我們調度的信息.
1.2.2 調度完成檢查need_resched看是否需要重新調度
而同樣我們可以看到, 在調度完成後, 內核會去判斷need_resched條件, 如果這個時候為真, 內核會重新進程一次調度.
這個的原因, 我們在前一篇博客中, 也已經說的很明白了,
內核在thread_info的flag中設置了一個標識來標志進程是否需要重新調度, 即重新調度need_resched標識TIF_NEED_RESCHED, 內核在即將返回用戶空間時會檢查標識TIF_NEED_RESCHED標志進程是否需要重新調度,如果設置了,就會發生調度, 這被稱為用戶搶占
2 非搶占式和可搶占式內核
為了簡化問題,我使用嵌入式實時系統uC/OS作為例子
首先要指出的是,uC/OS只有內核態,沒有用戶態,這和Linux不一樣
多任務系統中, 內核負責管理各個任務, 或者說為每個任務分配CPU時間, 並且負責任務之間的通訊.
內核提供的基本服務是任務切換. 調度(Scheler),英文還有一詞叫dispatcher, 也是調度的意思.
這是內核的主要職責之一, 就是要決定該輪到哪個任務運行了. 多數實時內核是基於優先順序調度法的, 每個任務根據其重要程度的不同被賦予一定的優先順序. 基於優先順序的調度法指,CPU總是讓處在就緒態的優先順序最高的任務先運行. 然而, 究竟何時讓高優先順序任務掌握CPU的使用權, 有兩種不同的情況, 這要看用的是什麼類型的內核, 是不可剝奪型的還是可剝奪型內核
2.1 非搶占式內核
非搶占式內核是由任務主動放棄CPU的使用權
非搶占式調度法也稱作合作型多任務, 各個任務彼此合作共享一個CPU. 非同步事件還是由中斷服務來處理. 中斷服務可以使一個高優先順序的任務由掛起狀態變為就緒狀態.
但中斷服務以後控制權還是回到原來被中斷了的那個任務, 直到該任務主動放棄CPU的使用權時,那個高優先順序的任務才能獲得CPU的使用權。非搶占式內核如下圖所示.

非搶占式內核的優點有
中斷響應快(與搶占式內核比較);
允許使用不可重入函數;
幾乎不需要使用信號量保護共享數據, 運行的任務佔有CPU,不必擔心被別的任務搶占。這不是絕對的,在列印機的使用上,仍需要滿足互斥條件。
非搶占式內核的缺點有
任務響應時間慢。高優先順序的任務已經進入就緒態,但還不能運行,要等到當前運行著的任務釋放CPU
非搶占式內核的任務級響應時間是不確定的,不知道什麼時候最高優先順序的任務才能拿到CPU的控制權,完全取決於應用程序什麼時候釋放CPU
2.2 搶占式內核
使用搶占式內核可以保證系統響應時間. 最高優先順序的任務一旦就緒, 總能得到CPU的使用權。當一個運行著的任務使一個比它優先順序高的任務進入了就緒態, 當前任務的CPU使用權就會被剝奪,或者說被掛起了,那個高優先順序的任務立刻得到了CPU的控制權。如果是中斷服務子程序使一個高優先順序的任務進入就緒態,中斷完成時,中斷了的任務被掛起,優先順序高的那個任務開始運行。
搶占式內核如下圖所示

搶占式內核的優點有
使用搶占式內核,最高優先順序的任務什麼時候可以執行,可以得到CPU的使用權是可知的。使用搶占式內核使得任務級響應時間得以最優化。
搶占式內核的缺點有:
不能直接使用不可重入型函數。調用不可重入函數時,要滿足互斥條件,這點可以使用互斥型信號量來實現。如果調用不可重入型函數時,低優先順序的任務CPU的使用權被高優先順序任務剝奪,不可重入型函數中的數據有可能被破壞。
3 linux用戶搶占
3.1 linux用戶搶占
當內核即將返回用戶空間時, 內核會檢查need_resched是否設置, 如果設置, 則調用schele(),此時,發生用戶搶占.
3.2 need_resched標識
內核如何檢查一個進程是否需要被調度呢?
內核在即將返回用戶空間時檢查進程是否需要重新調度,如果設置了,就會發生調度, 這被稱為用戶搶占, 因此內核在thread_info的flag中設置了一個標識來標志進程是否需要重新調度, 即重新調度need_resched標識TIF_NEED_RESCHED
並提供了一些設置可檢測的函數

函數
描述
定義

set_tsk_need_resched 設置指定進程中的need_resched標志 include/linux/sched.h, L2920
clear_tsk_need_resched 清除指定進程中的need_resched標志 include/linux/sched.h, L2926
test_tsk_need_resched 檢查指定進程need_resched標志 include/linux/sched.h, L2931
而我們內核中調度時常用的need_resched()函數檢查進程是否需要被重新調度其實就是通過test_tsk_need_resched實現的, 其定義如下所示
// http://lxr.free-electrons.com/source/include/linux/sched.h?v=4.6#L3093
static __always_inline bool need_resched(void)
{
return unlikely(tif_need_resched());
}

// http://lxr.free-electrons.com/source/include/linux/thread_info.h?v=4.6#L106
#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED)1234567812345678

3.3 用戶搶占的發生時機(什麼時候需要重新調度need_resched)
一般來說,用戶搶占發生幾下情況:
從系統調用返回用戶空間;
從中斷(異常)處理程序返回用戶空間
從這里我們可以看到, 用戶搶占是發生在用戶空間的搶占現象.
更詳細的觸發條件如下所示, 其實不外乎就是前面所說的兩種情況: 從系統調用或者中斷返回用戶空間
時鍾中斷處理常式檢查當前任務的時間片,當任務的時間片消耗完時,scheler_tick()函數就會設置need_resched標志;
信號量、等到隊列、completion等機制喚醒時都是基於waitqueue的,而waitqueue的喚醒函數為default_wake_function,其調用try_to_wake_up將被喚醒的任務更改為就緒狀態並設置need_resched標志。
設置用戶進程的nice值時,可能會使高優先順序的任務進入就緒狀態;
改變任務的優先順序時,可能會使高優先順序的任務進入就緒狀態;
新建一個任務時,可能會使高優先順序的任務進入就緒狀態;
對CPU(SMP)進行負載均衡時,當前任務可能需要放到另外一個CPU上運行
4 linux內核搶占
4.1 內核搶占的概念
對比用戶搶占, 顧名思義, 內核搶占就是指一個在內核態運行的進程, 可能在執行內核函數期間被另一個進程取代.
4.2 為什麼linux需要內核搶占
linux系統中, 進程在系統調用後返回用戶態之前, 或者是內核中某些特定的點上, 都會調用調度器. 這確保除了一些明確指定的情況之外, 內核是無法中斷的, 這不同於用戶進程.
如果內核處於相對耗時的操作中, 比如文件系統或者內存管理相關的任務, 這種行為可能會帶來問題. 這種情況下, 內核代替特定的進程執行相當長的時間, 而其他進程無法執行, 無法調度, 這就造成了系統的延遲增加, 用戶體驗到」緩慢」的響應. 比如如果多媒體應用長時間無法得到CPU, 則可能發生視頻和音頻漏失現象.
在編譯內核時如果啟用了對內核搶占的支持, 則可以解決這些問題. 如果高優先順序進程有事情需要完成, 那麼在啟用了內核搶占的情況下, 不僅用戶空間應用程序可以被中斷, 內核也可以被中斷,
linux內核搶占是在Linux2.5.4版本發布時加入的, 盡管使內核可搶占需要的改動特別少, 但是該機制不像搶佔用戶空間進程那樣容易實現. 如果內核無法一次性完成某些操作(例如, 對數據結構的操作), 那麼可能出現靜態條件而使得系統不一致.
內核搶占和用戶層進程被其他進程搶占是兩個不同的概念, 內核搶佔主要是從實時系統中引入的, 在非實時系統中的確也能提高系統的響應速度, 但也不是在所有情況下都是最優的,因為搶占也需要調度和同步開銷,在某些情況下甚至要關閉內核搶占, 比如前面我們將主調度器的時候, linux內核在完成調度的過程中是關閉了內核搶占的.
內核不能再任意點被中斷, 幸運的是, 大多數不能中斷的點已經被SMP實現標識出來了. 並且在實現內核搶占時可以重用這些信息. 如果內核可以被搶占, 那麼單處理器系統也會像是一個SMP系統
4.3 內核搶占的發生時機
要滿足什麼條件,kernel才可以搶佔一個任務的內核態呢?
沒持有鎖。鎖是用於保護臨界區的,不能被搶占。
Kernel code可重入(reentrant)。因為kernel是SMP-safe的,所以滿足可重入性。
內核搶占發生的時機,一般發生在:
當從中斷處理程序正在執行,且返回內核空間之前。當一個中斷處理常式退出,在返回到內核態時(kernel-space)。這是隱式的調用schele()函數,當前任務沒有主動放棄CPU使用權,而是被剝奪了CPU使用權。
當內核代碼再一次具有可搶占性的時候,如解鎖(spin_unlock_bh)及使能軟中斷(local_bh_enable)等, 此時當kernel code從不可搶占狀態變為可搶占狀態時(preemptible again)。也就是preempt_count從正整數變為0時。這也是隱式的調用schele()函數
如果內核中的任務顯式的調用schele(), 任務主動放棄CPU使用權
如果內核中的任務阻塞(這同樣也會導致調用schele()), 導致需要調用schele()函數。任務主動放棄CPU使用權
內核搶占,並不是在任何一個地方都可以發生,以下情況不能發生
內核正進行中斷處理。在Linux內核中進程不能搶佔中斷(中斷只能被其他中斷中止、搶占,進程不能中止、搶佔中斷),在中斷常式中不允許進行進程調度。進程調度函數schele()會對此作出判斷,如果是在中斷中調用,會列印出錯信息。
內核正在進行中斷上下文的Bottom Half(中斷下半部,即軟中斷)處理。硬體中斷返回前會執行軟中斷,此時仍然處於中斷上下文中。如果此時正在執行其它軟中斷,則不再執行該軟中斷。
內核的代碼段正持有spinlock自旋鎖、writelock/readlock讀寫鎖等鎖,處干這些鎖的保護狀態中。內核中的這些鎖是為了在SMP系統中短時間內保證不同CPU上運行的進程並發執行的正確性。當持有這些鎖時,內核不應該被搶占。
內核正在執行調度程序Scheler。搶占的原因就是為了進行新的調度,沒有理由將調度程序搶佔掉再運行調度程序。
內核正在對每個CPU「私有」的數據結構操作(Per-CPU date structures)。在SMP中,對於per-CPU數據結構未用spinlocks保護,因為這些數據結構隱含地被保護了(不同的CPU有不一樣的per-CPU數據,其他CPU上運行的進程不會用到另一個CPU的per-CPU數據)。但是如果允許搶占,但一個進程被搶占後重新調度,有可能調度到其他的CPU上去,這時定義的Per-CPU變數就會有問題,這時應禁搶占。

❽ linux配置ntp時鍾源

(一)確認ntp的安裝
1)確認是否已安裝ntp

【命令】rpm –qa | grep ntp
若只有ntpdate而未見ntp,則需刪除原有ntpdate。如:
ntpdate-4.2.6p5-22.el7_0.x86_64
fontpackages-filesystem-1.44-8.el7.noarch
python-ntplib-0.3.2-1.el7.noarch

2)刪除已安裝ntp

【命令】yum –y remove ntpdate-4.2.6p5-22.el7.x86_64

3)重新安裝ntp

【命令】yum –y install ntp

(二)配置ntp服務
1)修改所有節點的/etc/ntp.conf

【命令】vi /etc/ntp.conf
【內容】

restrict 192.168.6.3 nomodify notrap nopeer noquery //當前節點IP地址
restrict 192.168.6.2 mask 255.255.255.0 nomodify notrap //集群所在網段的網關(Gateway),子網掩碼(Genmask)

2)選擇一個主節點,修改其/etc/ntp.conf

【命令】vi /etc/ntp.conf
【內容】在server部分添加一下部分,並注釋掉server 0 ~ n
server 127.127.1.0
Fudge 127.127.1.0 stratum 10

3)主節點以外,繼續修改/etc/ntp.conf

【命令】vi /etc/ntp.conf
【內容】在server部分添加如下語句,將server指向主節點。
server 192.168.6.3
Fudge 192.168.6.3 stratum 10

===修改前===

image
===修改後===
節點1(192.168.6.3):

image
節點2(192.168.6.4):

image
節點3(192.168.6.5):

image
(三)啟動ntp服務、查看狀態
1)啟動ntp服務

【命令】service ntpd start

2)查看ntp伺服器有無和上層ntp連通

【命令】ntpstat

image
查看ntp狀態時,可能會出現如下所示情況
① unsynchronised time server re-starting polling server every 8 s

image
② unsynchronised polling server every 8 s

image
這種情況屬於正常,ntp伺服器配置完畢後,需要等待5-10分鍾才能與/etc/ntp.conf中配置的標准時間進行同步。
等一段時間之後,再次使用ntpstat命令查看狀態,就會變成如下正常結果:

image
3)查看ntp伺服器與上層ntp的狀態

【命令】ntpq -p

image
remote:本機和上層ntp的ip或主機名,「+」表示優先,「*」表示次優先
refid:參考上一層ntp主機地址
st:stratum階層
when:多少秒前曾經同步過時間
poll:下次更新在多少秒後
reach:已經向上層ntp伺服器要求更新的次數
delay:網路延遲
offset:時間補償
jitter:系統時間與bios時間差
4)查看ntpd進程的狀態
【命令】watch "ntpq -p"
【終止】按 Ctrl+C 停止查看進程。

image
第一列中的字元指示源的質量。星號 ( * ) 表示該源是當前引用。
remote:列出源的 IP 地址或主機名。
when:指出從輪詢源開始已過去的時間(秒)。
poll:指出輪詢間隔時間。該值會根據本地時鍾的精度相應增加。
reach:是一個八進制數字,指出源的可存取性。值 377 表示源已應答了前八個連續輪詢。
offset:是源時鍾與本地時鍾的時間差(毫秒)。
(四)設置開機啟動
【命令】chkconfig ntpd on
(五)從其他博客的一些參考摘錄
===/etc/ntp.conf 配置內容===

[

復制代碼
](javascript:void(0); "復制代碼")
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"># 1. 先處理許可權方面的問題,包括放行上層伺服器以及開放區域網用戶來源:
restrict default kod nomodify notrap nopeer noquery <==拒絕 IPv4 的用戶
restrict -6 default kod nomodify notrap nopeer noquery <==拒絕 IPv6 的用戶
restrict 220.130.158.71 <==放行 tock.stdtime.gov.tw 進入本 NTP 的伺服器
restrict 59.124.196.83 <==放行 tick.stdtime.gov.tw 進入本 NTP 的伺服器
restrict 59.124.196.84 <==放行 time.stdtime.gov.tw 進入本 NTP 的伺服器
restrict 127.0.0.1 <==底下兩個是默認值,放行本機來源
restrict -6 ::1 restrict 192.168.100.0 mask 255.255.255.0 nomodify <==放行區域網用戶來源,或者列出單獨IP
2. 設定主機來源,請先將原本的 [0|1|2].centos.pool.ntp.org 的設定批註掉:
server 220.130.158.71 prefer <==以這部主機為最優先的server
server 59.124.196.83 server 59.124.196.84 # 3.默認的一個內部時鍾數據,用在沒有外部 NTP 伺服器時,使用它為區域網用戶提供服務:
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10 # 4.預設時間差異分析檔案與暫不用到的 keys 等,不需要更動它:
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys </pre>

[

復制代碼
](javascript:void(0); "復制代碼")
===restrict選項格式===
restrict [ 客戶端IP ] mask [ IP掩碼 ] [參數]
「客戶端IP」 和 「IP掩碼」 指定了對網路中哪些范圍的計算機進行控制,如果使用default關鍵字,則表示對所有的計算機進行控制,參數指定了具體的限制內容,常見的參數如下:
◆ ignore:拒絕連接到NTP伺服器
◆ nomodiy: 客戶端不能更改服務端的時間參數,但是客戶端可以通過服務端進行網路校時。
◆ noquery: 不提供客戶端的時間查詢
◆ notrap: 不提供trap遠程登錄功能,trap服務是一種遠程時間日誌服務。
◆ notrust: 客戶端除非通過認證,否則該客戶端來源將被視為不信任子網 。
◆ nopeer: 提供時間服務,但不作為對等體。
◆ kod: 向不安全的訪問者發送Kiss-Of-Death報文。
===server選項格式===
server host [ key n ] [ version n ] [ prefer ] [ mode n ] [ minpoll n ] [ maxpoll n ] [ iburst ]
其中host是上層NTP伺服器的IP地址或域名,隨後所跟的參數解釋如下所示:
◆ key: 表示所有發往伺服器的報文包含有秘鑰加密的認證信息,n是32位的整數,表示秘鑰號。
◆ version: 表示發往上層伺服器的報文使用的版本號,n默認是3,可以是1或者2。
◆ prefer: 如果有多個server選項,具有該參數的伺服器有限使用。
◆ mode: 指定數據報文mode欄位的值。
◆ minpoll: 指定與查詢該伺服器的最小時間間隔為2的n次方秒,n默認為6,范圍為4-14。
◆ maxpoll: 指定與查詢該伺服器的最大時間間隔為2的n次方秒,n默認為10,范圍為4-14。
◆ iburst: 當初始同步請求時,採用突發方式接連發送8個報文,時間間隔為2秒。
===查看網關方法===
【命令1】route -n
【命令2】ip route show
【命令3】netstat -r
===層次(stratum)===
stratum根據上層server的層次而設定(+1)。
對於提供network time service provider的主機來說,stratum的設定要盡可能准確。
而作為區域網的time service provider,通常將stratum設置為10

image
0層的伺服器採用的是原子鍾、GPS鍾等物理設備,stratum 1與stratum 0 是直接相連的,
往後的stratum與上一層stratum通過網路相連,同一層的server也可以交互。
ntpd對下層client來說是service server,對於上層server來說它是client。
ntpd根據配置文件的參數決定是要為其他伺服器提供時鍾服務或者是從其他伺服器同步時鍾。所有的配置都在/etc/ntp.conf文件中。
[圖片上傳失敗...(image-f2dcb9-1561634142658)]
===注意防火牆屏蔽ntp埠===
ntp伺服器默認埠是123,如果防火牆是開啟狀態,在一些操作可能會出現錯誤,所以要記住關閉防火牆。ntp採用的時udp協議

sudo firewall-cmd --zone=public --add-port=123/udp --permanent

===同步硬體時鍾===
ntp服務,默認只會同步系統時間。
如果想要讓ntp同時同步硬體時間,可以設置/etc/sysconfig/ntpd文件,
在/etc/sysconfig/ntpd文件中,添加【SYNC_HWCLOCK=yes】這樣,就可以讓硬體時間與系統時間一起同步。
允許BIOS與系統時間同步,也可以通過hwclock -w 命令。
===ntpd、ntpdate的區別===
下面是網上關於ntpd與ntpdate區別的相關資料。如下所示所示:
使用之前得弄清楚一個問題,ntpd與ntpdate在更新時間時有什麼區別。
ntpd不僅僅是時間同步伺服器,它還可以做客戶端與標准時間伺服器進行同步時間,而且是平滑同步,
並非ntpdate立即同步,在生產環境中慎用ntpdate,也正如此兩者不可同時運行。
時鍾的躍變,對於某些程序會導致很嚴重的問題。
許多應用程序依賴連續的時鍾——畢竟,這是一項常見的假定,即,取得的時間是線性的,
一些操作,例如資料庫事務,通常會地依賴這樣的事實:時間不會往回跳躍。
不幸的是,ntpdate調整時間的方式就是我們所說的」躍變「:在獲得一個時間之後,ntpdate使用settimeofday(2)設置系統時間,
這有幾個非常明顯的問題:
【一】這樣做不安全。
ntpdate的設置依賴於ntp伺服器的安全性,攻擊者可以利用一些軟體設計上的缺陷,拿下ntp伺服器並令與其同步的伺服器執行某些消耗性的任務。
由於ntpdate採用的方式是跳變,跟隨它的伺服器無法知道是否發生了異常(時間不一樣的時候,唯一的辦法是以伺服器為准)。
【二】這樣做不精確。
一旦ntp伺服器宕機,跟隨它的伺服器也就會無法同步時間。
與此不同,ntpd不僅能夠校準計算機的時間,而且能夠校準計算機的時鍾。
【三】這樣做不夠優雅。
由於是跳變,而不是使時間變快或變慢,依賴時序的程序會出錯
(例如,如果ntpdate發現你的時間快了,則可能會經歷兩個相同的時刻,對某些應用而言,這是致命的)。
因而,唯一一個可以令時間發生跳變的點,是計算機剛剛啟動,但還沒有啟動很多服務的那個時候。
其餘的時候,理想的做法是使用ntpd來校準時鍾,而不是調整計算機時鍾上的時間。
NTPD在和時間伺服器的同步過程中,會把BIOS計時器的振盪頻率偏差——或者說Local Clock的自然漂移(drift)——記錄下來。
這樣即使網路有問題,本機仍然能維持一個相當精確的走時。
===國內常用NTP伺服器地址及IP===
210.72.145.44 (國家授時中心伺服器IP地址)
133.100.11.8 日本 福岡大學
time-a.nist.gov 129.6.15.28 NIST, Gaithersburg, Maryland
time-b.nist.gov 129.6.15.29 NIST, Gaithersburg, Maryland
time-a.timefreq.bldrdoc.gov 132.163.4.101 NIST, Boulder, Colorado
time-b.timefreq.bldrdoc.gov 132.163.4.102 NIST, Boulder, Colorado
time-c.timefreq.bldrdoc.gov 132.163.4.103 NIST, Boulder, Colorado
utcnist.colorado.e 128.138.140.44 University of Colorado, Boulder
time.nist.gov 192.43.244.18 NCAR, Boulder, Colorado
time-nw.nist.gov 131.107.1.10 Microsoft, Redmond, Washington
nist1.symmetricom.com 69.25.96.13 Symmetricom, San Jose, California
nist1-dc.glassey.com 216.200.93.8 Abovenet, Virginia
nist1-ny.glassey.com 208.184.49.9 Abovenet, New York City
nist1-sj.glassey.com 207.126.98.204 Abovenet, San Jose, California
nist1.aol-ca.truetime.com 207.200.81.113 TrueTime, AOL facility, Sunnyvale, California
nist1.aol-va.truetime.com 64.236.96.53 TrueTime, AOL facility, Virginia
————————————————————————————————————
ntp.sjtu.e.cn 202.120.2.101 (上海交通大學網路中心NTP伺服器地址)
s1a.time.e.cn 北京郵電大學
s1b.time.e.cn 清華大學
s1c.time.e.cn 北京大學
s1d.time.e.cn 東南大學
s1e.time.e.cn 清華大學
s2a.time.e.cn 清華大學
s2b.time.e.cn 清華大學
s2c.time.e.cn 北京郵電大學
s2d.time.e.cn 西南地區網路中心
s2e.time.e.cn 西北地區網路中心
s2f.time.e.cn 東北地區網路中心
s2g.time.e.cn 華東南地區網路中心
s2h.time.e.cn 四川大學網路管理中心
s2j.time.e.cn 大連理工大學網路中心
s2k.time.e.cn CERNET桂林主節點
s2m.time.e.cn 北京大學</pre>

❾ 如何armlinux輸出時鍾信息

1、相關數據結構
include/linux/notifier.h
struct notifier_block {
int (*notifier_call)(struct notifier_block *, unsigned long, void *);
struct notifier_block *next;
int priority;
};
通知鏈中的元素,記錄了當發出通知時,應該執行的操作(即回調函數)
鏈頭中保存著指向元素鏈表的指針。通知鏈元素結構則保存著回調函數的類型以及優先順序

2、時鍾初始化
2.1 內核初始化部分( start_kernel 函數)和時鍾相關的過程主要有以下幾個:
tick_init()
init_timers()
hrtimers_init()
time_init()
其中函數 hrtimers_init() 和高精度時鍾相關,下面將詳細介紹這幾個函數。
2.2.1 tick_init 函數
kernel/time/tick-common.c
void __init tick_init(void)
{
clockevents_register_notifier(&tick_notifier);
}
static struct notifier_block tick_notifier = {
.notifier_call = tick_notify,
};
函數 tick_init() 很簡單,調用 clockevents_register_notifier 函數向 clockevents_chain 通知鏈注冊元素: tick_notifier。這個元素的回調函數指明了當時鍾事件設備信息發生變化(例如新加入一個時鍾事件設備等等)時,應該執行的操作,該回調函數為 tick_notify
kernel/time/tick-common.c
static int tick_notify(struct notifier_block *nb, unsigned long reason,
void *dev)
{
switch (reason) {
case CLOCK_EVT_NOTIFY_ADD:
return tick_check_new_device(dev);
case CLOCK_EVT_NOTIFY_BROADCAST_ON:
case CLOCK_EVT_NOTIFY_BROADCAST_OFF:
case CLOCK_EVT_NOTIFY_BROADCAST_FORCE:
tick_broadcast_on_off(reason, dev);
break;
case CLOCK_EVT_NOTIFY_BROADCAST_ENTER:
case CLOCK_EVT_NOTIFY_BROADCAST_EXIT:
tick_broadcast_oneshot_control(reason);
break;
case CLOCK_EVT_NOTIFY_CPU_DYING:
tick_handover_do_timer(dev);
break;
case CLOCK_EVT_NOTIFY_CPU_DEAD:
tick_shutdown_broadcast_oneshot(dev);
tick_shutdown_broadcast(dev);
tick_shutdown(dev);
break;
case CLOCK_EVT_NOTIFY_SUSPEND:
tick_suspend();
tick_suspend_broadcast();
break;
case CLOCK_EVT_NOTIFY_RESUME:
tick_resume();
break;
default:
break;
}
return NOTIFY_OK;
}

2.2.2 init_timers 函數

函數 init_timers() 的實現如清單2-1(省略了部分和
主要功能無關的內容,以後代碼同樣方式處理)

❿ linux內核線程死鎖或死循環之後如何讓系統宕機重啟

在開發內核模塊或驅動時,如果處理失誤,導致內核線程中出現死鎖或者死循環,你會發現,除了重啟之外,你沒有任何可以做的。這時你的輸入不起任何作用,終端(不是指遠程的ssh工具)只會在那重復的輸出類似「BUG: soft lockup - CPU#0 stuck for 67s! [fclustertool:2043]」,更無奈的是你重啟之後導致系統掛起的堆棧信息也看不到,你所能做的就是一遍遍的加調試信息,一遍遍的重啟機器(這是我的經歷,現在想想很傻)。 這種情況你肯定不是第一個遇到的,所以內核肯定會提供處理這種情況的一些機制。但是如何來找到這些機制在哪個地方,或者說根據什麼信息去google呢?最有用的就是這句話「BUG: soft lockup - CPU#0 stuck for 67s! [fclustertool:2043]」,因為這句話提供你的信息量很大。首先,這條信息可以輸出,說明即使發生死鎖或者死循環,還是有代碼可以執行。第二,可以通過這個日誌信息,找到對應的處理函數,這個函數所在的模塊就是用來處理CPU被過度使用時用到的。所以通過這個事情,可以看到內核列印出的只言片語都有可能成為你解決問題的關鍵,一定要從重視這些信息,從中找出有用的東西。 我經常看的內核版本是官方的2.6.32內核,這個版本中我找到的函數是softlockup_tick(),這個函數在時鍾中斷的處理函數run_local_timers()中調用。這個函數會首先檢查watchdog線程是否被掛起,如果不是watchdog線程,會檢查當前佔有CPU的線程佔有的時間是否超過系統配置的閾值,即softlockup_thresh。如果當前佔有CPU的時間過長,則會在系統日誌中輸出我們上面看到的那條日誌。接下來才是最關鍵的,就是輸出模塊信息、寄存器信息和堆棧信息,檢查softlockup_panic的值是否為1。如果softlockup_panic為1,則調用panic()讓內核掛起,輸出OOPS信息。代碼如下所示:/** This callback runs from the timer interrupt, and checks * whether the watchdog thread has hung or not:*/void softlockup_tick(void){int this_cpu = smp_processor_id(); unsigned long touch_timestamp = per_cpu(touch_timestamp, this_cpu); unsigned long print_timestamp; struct pt_regs *regs = get_irq_regs(); unsigned long now; /* Warn about unreasonable delays: */ if (now <= (touch_timestamp + softlockup_thresh))return; per_cpu(print_timestamp, this_cpu) = touch_timestamp; spin_lock(&print_lock); printk(KERN_ERR BUG: soft lockup - CPU#%d stuck for %lus! [%s:%d]\n, this_cpu, now - touch_timestamp, current-comm, task_pid_nr(current)); print_moles(); print_irqtrace_events(current);if (regs)show_regs(regs);elsemp_stack(); spin_unlock(&print_lock); if (softlockup_panic) panic(softlockup: hung tasks);} 但是softlockup_panic的值默認竟然是0,所以在出現死鎖或者死循環的時候,會一直只輸出日誌信息,而不會宕機,這個真是好坑啊!所以你得手動修改/proc/sys/kernel/softlockup_panic的值,讓內核可以在死鎖或者死循環的時候可以宕機。如果你的機器中安裝了kmp,在重啟之後,你會得到一份內核的core文件,這時從core文件中查找問題就方便很多了,而且再也不用手動重啟機器了。如果你的內核是標准內核的話,可以通過修改/proc/sys/kernel/softlockup_thresh來修改超時的閾值,如果是CentOS內核的話,對應的文件是/proc/sys/kernel/watchdog_thresh。CentOS內核和標准內核還有一個地方不一樣,就是處理CPU佔用時間過長的函數,CentOS下是watchdog_timer_fn()函數。 這里介紹下lockup的概念。lockup分為soft lockup和hard lockup。 soft lockup是指內核中有BUG導致在內核模式下一直循環的時間超過10s(根據實現和配置有所不同),而其他進程得不到運行的機會。hard softlockup是指內核已經掛起,可以通過watchdog這樣的機制來獲取詳細信息。這兩個概念比較類似。如果你想了解更多關於lockup的信息,可以參考這篇文檔: 注意上面說的這些,都是在內核線程中有效,對用戶態的死循環沒用。如果要監視用戶態的死循環,或者內存不足等資源的情況,強烈推薦軟體層面的watchdog。具體的操作可以參考下面的文章,都寫的非常好,非常實用:

熱點內容
sd卡手機存儲系統存儲 發布:2025-05-18 00:55:28 瀏覽:636
pythonlistintstr 發布:2025-05-18 00:48:18 瀏覽:604
輕應用緩存 發布:2025-05-18 00:31:02 瀏覽:251
鳥存儲空氣 發布:2025-05-18 00:20:24 瀏覽:201
linux刻錄iso 發布:2025-05-18 00:16:15 瀏覽:663
php動態參數 發布:2025-05-18 00:12:05 瀏覽:425
安卓應用上傳 發布:2025-05-18 00:11:57 瀏覽:803
數對的演算法 發布:2025-05-18 00:11:02 瀏覽:382
linuxwhile 發布:2025-05-18 00:10:08 瀏覽:144
xpftp外網 發布:2025-05-17 23:58:11 瀏覽:386