在linux核心裡記憶體可以和硬碟空間通用的,當記憶體利用很少時,資料可以存到記憶體裡,反之硬碟空間可以用來當記憶體用但是有個共同點資料總是現在記憶體裡操作再寫回到硬碟上的。由於這個原因,塊儲存裝置被當成後備儲存器。
linux
提供了兩種操作的方法: 1
後台程序不停的檢查系統記憶體週期性的寫操作 2
當系統有太多的髒頁需要清理時程序被啟用
記憶體和cache以及後備儲存器之間的同步被分成兩種 1
可以控制資料交換時的優先順序策列,我們可以設定各種引數幫助核心確定何時要交換資料 2
當在記憶體,cache以及後備儲存器之間同步資料時涉及到硬體相關的特性
觸發資料的重新整理有很多個不同的時間和不同的原因 1
核心執行緒週期性的查詢在頁鍊錶中的髒頁當有髒頁產生時就挑選一些將他們寫回,當系統寫操作太忙時,可以設定系統中髒頁髒的比率再操作 2
如果系統中有太多的髒頁,系統就會同步到乙個可接受的水平 3
當特定事件發生時核心要求資料同步,不如umount
核心有程序pdflush 針對前面兩個原因,在第三個則有很多種方法可供選擇
核心可以在很多地方開始同步,但是最終都是呼叫sync_sb_inodes,這個函式負責同步所有的髒的inode到superblock writeback_single_inode用作同步每個inode
pdflush
由兩部分組成,分別是描述程序的資料結構和這方面的策略pdflush的定義如下:
struct pdflush_work ;
pdflush
是乙個核心執行緒,它一旦產生就進入睡眠狀態一直等到核心其他的部分排程到為止
pdflush_operation
是pdflush執行緒被喚醒時呼叫的函式
wb_kupdate
函式負責flushing的技術方面的具體實現。它是基於位址概念的關於wb_kupdata有兩個重要的資料結構vm_stat
atomic_long_t vm_stat[nr_vm_zone_stat_items];
第二個是struct writeback_control
sync_super
是超級塊的同步函式
writeback_inode
則是inode的同步函式
linux
同步inode裡的資料則是呼叫
__writeback_single_inode
阻塞指當讀或寫操作時核心的塊裝置佇列超載,這時不能提交更多的塊裝置讀寫請求,最好的辦法是當一些讀寫請求被處理,在新的請求之前塊裝置佇列變的短一點
核心使用了兩個佇列,乙個是輸出,另乙個是輸入
對於核心來只說定義了乙個最小的記憶體值
上面的機制回寫頁是合適的,但是當系統中的快取資料快速變為髒頁時就有問題了。當核心收到大量的記憶體請求但不能滿足請求時因為有大量的髒頁,這就必須盡快的清空記憶體把頁裡的資料寫到塊裝置中去,核心提供了sync類似的呼叫都是基於
wakeup_pdflush
函式的linux
核心裡提供了系統呼叫可以同步
全部同步
同步inode:
同步個別檔案則可以呼叫:
同步記憶體對映:
Linux核心 同步
核心同步方法 2.自旋鎖 3.訊號量 4.互斥體 5.順序和屏障 6.其它 1.從2.0開始,linux開始支援多處理器 2.所謂臨界區就是訪問和操作共享資料的 段 3.我們應該不讓兩個執行執行緒在同乙個臨界區同時執行 4.i 的機器指令步驟 5.核心為我們實現了一些原子操作的介面 6.乙個鎖被高度...
Linux核心同步方法
1 原子操作,是其它同步方法的基礎。2 自旋鎖,執行緒試圖獲取乙個已經被別人持有的自旋鎖,當前執行緒處於忙等待,占用cpu資源。3 讀寫自旋鎖,根據通用性和針對性的特點,普通自旋鎖在特定場景下的表現會退化。因此,提供了讀寫自旋鎖,讀鎖可以加讀鎖,不能加寫鎖,寫鎖不能加任何鎖。4 需要注意的幾項 普通...
Linux核心學習筆記 核心同步
linux核心中執行的程式,時刻都要防止併發引起的競態。這將會導致資料結構被破壞,嚴重的時候會引起核心崩潰。所以核心同步技術對核心開發的驅動程式來說非常重要。不懂核心同步技術的人,是寫不出安全健壯的核心驅動程式來的。在學習核心同步技術之前需要掌握一下幾個概念。1 並行,併發與競態 在smp執行的li...