跳至內容

sync

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

sync(意指Synchronize,即「同步」)為UNIX作業系統的標準系統呼叫,功能為將內核檔案系統緩衝區的所有數據(也即預定將通過低階I/O系統呼叫[註 1]寫入儲存媒介的數據)寫入儲存媒介(如硬碟)。

作為C語言的函數之一,sync()一般以void sync(void)的形式在unistd.h內聲明。該函數也可以從命令列執行sync命令的方式呼叫,同時在其他程式語言(如Perl)中也有名字與之相似的函數。

相關呼叫[編輯]

UNIX中還有一些與sync相似的系統呼叫,如fsyncfdatasync。其中fsync負責寫入所有與特定檔案描述子相關的緩衝區數據[1]fdatasync功能與fsync相似,但只負責寫入檔案中被變更的數據,而不會修改檔案的元數據(如檔案屬性)[2]

在系統中的應用[編輯]

UNIX內核常會執行一些諸如flush或update之類的守護行程以將緩衝區數據寫入目標,而這些行程都要呼叫sync函數;在其他某些作業系統上這類任務由cron完成,而在Linux上負責者則為守護行程pdflush[3]。在解除安裝或以唯讀權限多載檔案系統時,系統也會將緩衝區內容寫入儲存媒介。

資料庫中的應用[編輯]

在對數據進行修改操作(包括增、刪、改)時,被修改的數據一般僅是暫存於基於內存的寫入快取,而當掉電時這些修改便會遺失;而為保證數據的永續性,資料庫必須使用某些形式的sync,以確保修改的內容切實寫入非揮發性記憶體,如PostgreSQL就使用了多種sync類呼叫(包括fsyncfdatasync)來達到這一目的[4]

但是,對於旋轉尋道的硬碟來說,每次旋轉只能完成一項「提交」操作以將客戶端的修覆寫入,因此每秒最多只能完成幾百次的「提交」操作[5];而若關閉fsync的限定來放寬要求,則可大幅提升效能,但同時也會帶來系統崩潰後資料庫損毀英語Data corruption的潛在危險。有鑑於此,資料庫也使用囊括最近修改資訊的紀錄檔檔案英語Transaction log(一般比主題數據檔案小得多)來保障可靠性:根據紀錄檔檔案,系統管理員可以在系統崩潰後準確地重做修改操作,以此即可減少對主要數據檔案的sync操作。

相關爭議[編輯]

在預設情況下,硬碟一般使用自有的揮發性寫入快取以快取要寫入的數據。這一做法可以大幅提升效能,但同時也會帶來寫入操作遺失的潛在風險[6],不過開/關快取的效能落差的確相當巨大,甚至連素來保守的FreeBSD社群為此也否決了在FreeBSD 4.3內預設關閉寫入快取(即是說,修改後直接呼叫sync寫入硬碟)的提案[7]

另外,在Firefox引入fsync呼叫的目的以保證其內嵌的SQLite資料庫的完整性後,便有人指出fsync降低了Firefox 3.0的效能[8];而Linux基金會技術總監西奧多·周則在「Don't fear the fsync!」一文中討論了fsync的效能表現,並表示「沒有必要害怕fsync」[9]

註釋[編輯]

  1. ^ 在此需要注意的是,進階I/O層(如stdio)可能使用自行維護的緩衝區。

參考資料[編輯]

  1. ^ fsync specification. [2012-12-28]. (原始內容存檔於2010-10-31). 
  2. ^ fdatasync specification. [2012-12-28]. (原始內容存檔於2009-08-28). 
  3. ^ The Linux Page Cache and pdflush. [2012-12-28]. (原始內容存檔於2009-11-24). 
  4. ^ PostgreSQL Reliability and the Write-Ahead Log. [2012-12-28]. (原始內容存檔於2012-12-29). 
  5. ^ Tuning PostgreSQL WAL Synchronization. [2012-12-28]. (原始內容存檔於2009-11-25). 
  6. ^ Write-Cache Enabled?. [2012-12-28]. (原始內容存檔於2012-12-17). 
  7. ^ FreeBSD Handbook — Tuning Disks. [2012-12-28]. (原始內容存檔於2012-12-24). 
  8. ^ Mike Shaver. fsyncers and curveballs. [2012-12-28]. (原始內容存檔於2012-12-09). 
  9. ^ Ts'o, Theodore. Don't fear the fsync!. 2009-03-16 [2017-09-06]. (原始內容存檔於2016-04-03).