更多網際網路新鮮資訊、工作奇淫技巧關注原創【飛魚在浪嶼】(日更新)

Linus Torvalds已經合并了John Ogness的一組printk()更新檔程式,這些更新檔程式使核心環形緩沖區(無論您鍵入什麼dmesg)都完全無鎖。這是一個很大的改進,它允許存儲和讀取消息,而無需臨時的每個CPU的緩沖區,而沒有死鎖的風險。
printk問題:
環形緩沖區是Linux核心的核心部分。驅動程式,子系統和很多通用功能用printk()共享錯誤和普通消息。輸入dmesg或sudo dmesg在終端中檢視其内容。
John Ogness提供了長達57分鐘的視訊,标題為“為什麼printk()如此複雜? ”
(https://linuxreviews.org/Why_is_printk()_so_complicated%3F),詳細介紹了Linux核心的環形緩沖區的曆史,自1991年Linux 0.01以來,2019 Linux會議上,他指出了printk()實作存在的問題,并printk()在那次會議上提出了一系列改進建議和核心的環形緩沖區功能。他的一些工作現在已經合并到Linux git樹中,以確定它在幾個月後釋出時将成為Linux 5.10的一部分。
Linus Torvalds已合并John Ogness編寫的一系列更新檔中的第一個更新檔,以使其printk()更加現代,安全和實用。
“最大的新事物是完全無鎖的環形緩沖區實作,包括對連續行的支援。它将允許在沒有死鎖風險的任何情況下存儲和讀取消息,并且不需要臨時的每個單獨CPU緩沖區。
目前通路共享區仍由logbuf_lock序列化。它可以同步其他一些操作,例如用于格式化消息的臨時緩沖區,syslog和kmsg_dump操作。解除鎖定的問題正在讨論,為下一個版本做好準備。”
Linux環形緩沖區原理
它是一個多生産者,單個或多個消費者組成的循環緩沖區。
單生産者單使用者循環緩沖區可以很容易地制成而沒有鎖。生産者寫入緩沖區,然後原子地增加頭指針。使用者讀取緩沖區,然後以原子方式遞增尾指針。
多個生産者在沒有鎖定的情況下變得棘手,因為它們需要互相協調,以至于不能覆寫緩沖區的同一部分。不過,這仍然可以通過原子遞增頭指針來完成。訣竅是,增量必須在寫入緩沖區之前而不是之後進行。是以,緩沖區中需要有一個标記,以訓示它已準備好被讀取。生産者使用原子增量配置設定緩沖區,在需要時将其寫入資料,然後将其标記為可以讀取。消費者同時檢視頭部指針和标記以告知可以讀取多少資料。
可以通過簡單地為每個消費者維護一個尾指針來實作多個消費者。但是,為了真正實作無鎖,生産者不能被緩慢的消費者所阻擋。取而代之的是,生産者隻是簡單地按照他們想要的速度寫作,而消費者則盡其所能跟上。如果使用計數器而不是指針或索引,則消費者可以檢測到它何時落在後面。不是圍繞增量循環,而是圍繞對循環緩沖區的通路。這樣,可以判斷何時計數器落後于頭部計數器後面的緩沖區大小。可以使用64位計數器而不必擔心翻轉從頭開始,也可以為計數器使用較小的資料類型,然後将緩沖區的大小設定為2的幂,以便整數翻轉不會導緻不連續性。