內核定時器編程:
時鐘脈衝:它是soc的重要指標和性能參數。供內核使用(進程調度,計時)。也稱爲時鐘中斷,通常是操作系統的0號中斷。
jiffies:
- 內核中表示自系統開機以來,一共發生了多少次時鐘脈衝。
HZ:
- 內核中表示一秒鐘發生多少次時鐘脈衝
Tick:
- 內核中表示兩次時鐘脈衝之間的時間間隔。
內核中在軟件層面。提供了一系列數據結構和函數供於底層驅動計時編程。
步驟:
- 1.定義:
- struct timer_list xxx;
- 2.初始化:
init_timer(&xxx);
xxx.function = do_my_xxx;
xxx.data = (unsigned long)ooo;
xxx.expeirs = jiffies + 400;
3.使用:
- 3.1註冊並啓動定時器:
- add_timer(&xxx);
- 3.2完成定時器回調函數:
void do_my_xxx(unsigned long data) { ....... }
- 3.1註冊並啓動定時器:
3.3修改定時器延時時間並啓動:
mod_timer(&xxx,jiffies + 延時時間);
- 3.4註銷定時器:
del_timer(&xxx);
併發控制:
- 多個進程併發訪問臨界資源區,是會引起競態現象,由此我們必須對這種現象加以控制,就是併發控制。併發控制中常用的手段
就是鎖。
linux內核中提供的鎖:
- 1.中斷屏蔽(強烈推薦不使用)
- 2.原子操作 (建議不使用,常見於彙編,一般也只是極短的賦值語句)
- 3.自旋鎖
- 3.1 讀寫鎖 讀讀進程併發,讀寫進程互斥,寫寫進程互斥
- 3.2 順序鎖 讀讀進程併發,讀寫進程併發,寫寫進程互斥
- 3.3 RCU 讀讀進程併發,讀寫進程併發,寫寫進程併發
- 4.信號量 操作pv信號的一種鎖,其使用場景和互斥體類似,但效率比互斥體低,故逐漸被互斥體所替代
- 5.互斥體
自旋鎖和互斥體使用的3大原則:
- 1.當臨界資源區較小時,使用自旋鎖,當臨界資源區比較大時,使用互斥體。因爲自旋鎖所面臨的是自旋等待的cpu資源消耗,
而互斥體是進程切換的資源消耗。 - 2.當臨界資源區中有引起睡眠的函數時,只能使用互斥體。因爲互斥體運行於進程上下文。而自旋鎖運行於中斷上下文,在中斷
上下文,絕對避免進程調度,否則可能將引起系統崩潰。 - 3.當臨界資源區中有中斷時,只能使用自旋鎖,而不能使用互斥體。因爲互斥體是運行於進程上下文。在中斷中會禁止進程調度,
使用互斥體,將會造成上下文丟失。
1.原子操作:
- 1.定義並初始化
- atomic_t xxx = ATOMIC_INIT(1);
- 2.使用:
- atomic_dec_and_test(&xxx);
- atomic_inc(&xxx);
- 或者:
- atomic_inc_and_test(&xxx);
- atomic_dec(&xxx);
- 2.自旋鎖:
- 1.定義:
- spinlock_t xxx;
- 2.初始化:
- spin_lock_init(&xxx);
- 3.使用:
- 3.1上鎖:
- spin_lock(&xxx);
- 3.2解鎖:
- spin_unlock(&xxx);
- 3.1上鎖:
- 3.信號量:
- 1.定義:
- struct semaphore xxx;
- 1.定義:
- 2.初始化:
- sema_init(&xxx,1);
- 3.使用:
- 3.1上鎖:
- down(&xxx);
- 3.2解鎖:
- up(&xxx);
- 3.1上鎖:
- 1.定義:
- 4.互斥體:
- 1.定義:
- struct mutex xxx;
- 2.初始化:
- mutex_init(&xxx);
- 3.使用:
- 3.1上鎖:
- mutex_lock(&xxx);
- 3.2解鎖:
- mutex_unlock(&xxx);
- 3.1上鎖:
- 1.定義: