6-定時器_鎖_互斥體_自旋鎖_原子操作

內核定時器編程:
時鐘脈衝:它是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.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.定義:
        • struct semaphore xxx;
    • 2.初始化:
      • sema_init(&xxx,1);
    • 3.使用:
      • 3.1上鎖:
        • down(&xxx);
      • 3.2解鎖:
        • up(&xxx);
  • 4.互斥體:
    • 1.定義:
      • struct mutex xxx;
    • 2.初始化:
      • mutex_init(&xxx);
    • 3.使用:
      • 3.1上鎖:
        • mutex_lock(&xxx);
      • 3.2解鎖:
        • mutex_unlock(&xxx);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章