內核同步機制的一些見解(未完成)

本文主要回答三個問題:
1、爲什麼要內核同步
2、內核同步有哪些策略
3、Liunx內核同步的代碼實現
先來說說內核搶佔,這時一個很重要的概念。內核搶佔通俗來講,的那個一個內核進程在運行的時候,是否允許另外一個內核進程進行搶佔。內核搶佔減少了用戶程序的分派延時,提供了更好地人機交互。但是有的進程要求在持續運行直到結束,所以系統也提供了這樣的接口,代碼如下:

#define preempt_disable()           barrier()
#define preempt_enable()            barrier()

上邊兩個宏實現的功能分別是關閉和打開內核搶佔。當current進程的thread_info結構體中的preempt_count(搶佔計數器)的值是0時,允許內核搶佔,非0表示不允許內核搶佔。
第一個問題,爲什麼要內核同步
因爲有很多臨界資源,競爭臨界資源必然需要同步。
第二個問題,內核同步有哪些機制
1、per-cpu(沒遇到過不理解)
2、原子操作
對於那些讀寫類型的指令來說,只要實現了讀寫都是原子操作,這樣就實現了同步,讀寫是原子操作的時候,必須等讀寫完了別的進程纔可以訪問這個存儲單元。原子操作是在硬件級實現的同步,不是我們的重點。
3、優化和內存屏障(不理解爲什麼這個也算是內核同步)
先來看看優化屏障。現代的編譯器對代碼編譯的時候會進行優化,執行的時候爲了更好地滿足cpu的並行性,程序的代碼可能不會按照原來的順序運行,這個特性對於一些代碼來說是不可接受的(比如之前分析的schedule函數就要求代碼一定要按順序執行),這時候就需要優化屏障,代碼如下:

 asm volatile("" : : : "memory");

Linux系統用上面一行內聯彙編代碼實現優化屏障。意思就是不要對這個代碼進行優化。
內存優化:還不是很理解
4、自旋鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章