2015-09-29 52 views
3

假設我們有FILE_SIZE字節的文件,並且:正在覆蓋ext4上的一個小文件原子嗎?

  • FILE_SIZE <= min(page_size, physical_block_size);
  • 文件大小永不改變(即從不執行truncate()或附加write());

    1. 這種寫入是原子相對於併發讀取:

       
      pwrite(fd, buf, FILE_SIZE, 0); 
      

是它ext4即保證:

  • 文件是通過使用完全地覆蓋它的內容僅改性?

  • 這樣的寫入是關於系統崩潰的事務?

    (即崩潰後該文件的內容是完全從以前的一些寫,我們永遠不會看到一個部分寫入或空文件)

  • 是第二真:

    • data=ordered
    • data=journal或備選啓用單個文件的日記功能?

      (使用ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL)

    • physical_block_size < FILE_SIZE <= page_size


    我發現related question哪個環節從2011年起然而discussion

    • 我沒有找到我的問題2一個明確的答案。
    • 我想知道,如果以上情況屬實,是不是記錄了某處?

    回答

    2

    我很熟悉關於文件系統的一般理論,而不是Ext4的實現。把這當作有根據的猜測。

    是的,我認爲一個部門的讀取和寫入將原子因爲

    • Link you provided引號「目前併發讀取/寫入是原子只WRT個人網頁,但不在系統調用。」
    • 磁盤扇區(512字節)寫入原子爲according to Stephen Tweedie。在他的私人電子郵件conversation中,他承認這一保證只與硬件一樣好。
    • Ext文件系統覆蓋數據到位,在寫入時沒有拷貝。沒有分配。
    • some effort來實現內聯數據,非常小的文件數據可以適應inode本身。如果你只需要存儲幾個字節,那可能會有影響。

    不知道大約一個頁面,但它會使全日誌模式毫無意義的commiting比前一個頁面少發送到日誌中。

    +0

    感謝答案。 – gavv

    4

    從我的實驗來看,它不是原子的。

    基本上我的實驗是有兩個進程,一個作者和一個讀者。筆者寫到一個文件中環和讀者從文件中讀取

    寫入進程:

    char buf[][18] = { 
        "xxxxxxxxxxxxxxxx", 
        "yyyyyyyyyyyyyyyy" 
    }; 
    i = 0; 
    while (1) { 
        pwrite(fd, buf[i], 18, 0); 
        i = (i + 1) % 2; 
    } 
    

    讀取器進程

    while(1) { 
        pread(fd, readbuf, 18, 0); 
        //check if readbuf is either buf[0] or buf[1] 
    } 
    

    運行一段時間這兩個過程後,我看得出來, readbufxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyxx

    因此它明確表明寫入不是原子的。在我的情況下,16byte寫入總是原子的。

    答案是:POSIX不要求除了管道之外的寫入/讀取的原子性。我看到的16字節原子性是內核特定的,將來可能會改變。在實際崗位的答案

    詳情: write(2)/read(2) atomicity between processes in linux