fseek(...)
OS システムコールではなく、ライブラリコールです。OS へのシステム コールの実行に伴う実際のオーバーヘッドを処理するのはランタイム ライブラリです。技術的に言えば、fseek は間接的にシステムへの呼び出しを行っていますが、実際にはそうではありません (これにより、ライブラリ コールとシステム コールの違い)。fseek(...)
基礎となるシステムに関係なく、標準の入出力関数です...しかし...そしてこれは大きなものですが...
OS はファイルをカーネル メモリにキャッシュしている可能性が高くなります。つまり、1 と 0 が格納されているディスク上の場所への直接オフセットです。これは、OS のカーネル レイヤーを介して行われます。ファイルが構成されているもののスナップショットを持つ、カーネル内の最上位レイヤー。つまり、含まれているものに関係なくデータです (そのオフセットのディスク構造への「ポインター」がある限り、どちらの方法でもかまいません)。ディスク上の lcoation は有効です!)...
発生すると、大量のオーバーヘッドfseek(..)
が発生し、間接的にカーネルがディスクからの読み取りタスクを委任します。これは、ファイルがどの程度断片化されているかに応じて、理論的には「いたるところに」発生する可能性があります。ユーザーランドの観点から、つまりCコードfseek(...)
が.ファイルの途中に挿入すると (この段階で、カーネルはデータの実際のディスク プラッターに位置/オフセットを調整する必要があることを思い出してください)、ファイルの最後に追加するよりも遅いと見なされます。
理由は非常に単純です。カーネルは最後のオフセットが何であったかを「認識」しており、EOF マーカーを消去してさらにデータを挿入するだけです。裏で、カーネルはディスク バッファーに別のメモリ ブロックを割り当てなければなりません。データの追加が完了すると、EOF マーカーに続くディスク上の位置への調整されたオフセット。