一般寫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 一樣,隨後下一篇文章我們做一些分析。

文章標籤
全站熱搜
創作者介紹
創作者 小寫 的頭像
小寫

小寫的部落格

小寫 發表在 痞客邦 留言(0) 人氣(487)