0

特定のディレクトリ内のすべてのファイルを再帰的にリストするソフトウェアをCで作成している最中で、内部の断片化を解決する必要があります。

私はこれを調査するのに長い時間を費やしましたが、ext2 の内部フラグメンテーションは最後のブロックでのみ発生することがわかりました。理論的には inode 番号から最初と最後のブロック アドレスを取得できるはずですが、方法がわかりません。

stat()fcntl()およびあらゆる種類の方法を調べました。inode 番号から最後のブロック アドレスを取得するにはどうすればよいですか?

また、最後のブロックのアドレスを取得したら、そのブロックにどれだけの空き領域があるかをテストして、内部の断片化を確認できることもわかりました。

get_inodeget_blockコマンドがあることは知っていますが、それ以外はわかりません!

4

2 に答える 2

1

複雑すぎると思うかもしれませんが、ファイルサイズをブロックサイズで割ってモジュロを取ると、大まかに内部の断片化を計算できるはずです。

ただし、これはファイルが「クラシックファイル」である場合にのみ有効です。スパースファイルまたは多くの「その他の情報」(巨大なACLや拡張属性など)を保持するファイルでは、違いが生じる可能性があります。(それらがどこに保存されているかはわかりませんが、最後のブロックにファイルシステムが保存され、内部の断片化が効果的に(しかし気付かれずに)減少する可能性があると想像できます。)

于 2011-12-12T07:54:37.533 に答える
1

などの通常のシステムコールを介してディスクブロックのアドレスを取得できるとは思いませんstat()。おそらく、ディスク上で未加工の inode を見つけ (未加工のディスクにアクセスすることを意味し、昇格された特権が必要です)、そこからデータを処理する必要があります。

従来、ファイルには直接ブロック、間接ブロック、二重間接ブロック、三重間接ブロックがあります。ただし、関連するファイル システムの種類は dodo と同じくらい死んでいるので (この千年紀にはそのファイル システムの種類は見たことがないと思います)、今はあまり役に立たないでしょう。

情報を取得するための非標準のシステム コールがあるかもしれませんが、私はそれを疑っています。

于 2011-12-11T20:59:42.383 に答える