一般寫AP的程式設計師,對於 write() & fwrite() 分別大多沒有清楚的概念,只知道一個是 open 來的,一個是 fopen來的。
這邊 Trace 了一下 Code,並有一些隨寫供參考。
從 AP call fwrite() 講起:
AP-->fwrite(...,FILE *stream)
這個 Function 在 lib 裡面的實作,會先用lock鎖住,避免重覆進入影響資料結構的順序。
-->fwrite_unlocked
可以學起來,凡是 function 不考慮 lock critical section 的,取名叫 xxxx_unlocked 由 function name 就可以得知 lock careless。
-->__stdio_fwrite
重點這這裡。此 Function 會將 buffer 內容 copy 到預先準備的 buffer (stream->__bufpos),最多會 copy 到 BUFSIZ,要滿出來之前就會準備寫到 kernel 了。BUFSIZ 的值由 256~8192 bytes,是當初 build lib 時的 build option決定,lib 一但生成,此值即固定住。
-->__stdio_wcommit
Write commit 就是準備將 buffer 真的寫到 kernel system call 了。
-->__stdio_WRITE
--> __WRITE
-->write((FILE *)stream->__filedes,...)
終於到了,write 下一步就直接用 system call 使用 kernel function 了。
看到最後,恍然大悟了吧,fwrite 最後其實也是用 write 啦!
由這裡應該也可以猜到 fflush(...) 的實作,就是:
fflush(...)
-->__stdio_wcommit
總結 fwrite & write。
fwrite(...): Library 管理一塊 buffer (256-8192bytes),AP fwrite 時先存於 buffer,而不 write(...),待 buffer 到滿時即寫入。優點在於減少頻繁的 system call overhead,缺點是會多 CPU copy memory 的動作。
write(...): 理論上 AP 配合 buffer,然後使用 write(...),系統效能理應跟 fwrite 一樣,隨後下一篇文章我們做一些分析。
