![]()
平成27年 秋期 基本情報技術者 午後 問11
問11 Java次の Java プログラムの説明及びプログラムを読んで,設問に答えよ。 〔プログラムの説明〕 固定バイト長のブロック(以下,ブロックという)を単位としてデータを保管している装置 (以下,ブロックデバイスという)に対し,ブロックのデータ(以下,ブロックデータという)への アクセスを管理するプログラムである。図1に,プログラム構成の概要を示す。 図中の四角はプログラムの構成要素を,矢印はブロックデータの流れを示す。 ここで,このプログラムでは,ブロックデバイスからの読込みだけを考える。
![]() 図1 プログラム構成の概要 ブロックデバイス内の各ブロックは,インデックス値で指定する。 最初のブロックのインデックス値は,0である。 ブロックアクセッサは,アプリケーションから要求されたブロックデータを ブロックデバイスから取得して,アプリケーションに渡す役割をする。 ブロックアクセッサはキャッシュを使用し,ブロックデバイスから 取得したブロックデータをキャッシュする。 アプリケーションから要求されたブロックデータがキャッシュされていれば, キャッシュから取得したブロックデータをアプリケーションに渡す。 キャッシュは,FIFO(First In,First Out)と LRU(Least Recently Used)の2種類の 管理方針に基づく実装が用意されていて,アプリケーションはどの実装を使用するかを指定する。 (1) クラス BlockAccessor は,ブロックアクセッサを表す。 A メソッド readBlock は,引数で指定されたインデックス値のブロックデータを返す。 ブロックデータがキャッシュにあれば,それを返す。なければ, ブロックデバイスから取得し,キャッシュした後,そのブロックデータを返す。 A メソッド getBlockSize は,ブロックのサイズをバイト数で返す。 B メソッド readBlock は,引数で指定されたインデックス値のブロックデータを 引数で指定されたバッファに読み込む。 (3) 抽象クラス Cache は,ブロックアクセッサからキャッシュ機能を使用するためのクラスを表す。 A 静的メソッド createCache は,引数で指定されたキャッシュの管理方針と 一致する実装クラスのインスタンスを生成して返す。 B 抽象メソッド getCachedBlockData は,引数で指定されたインデックス値の ブロックデータがキャッシュされていれば,それを返す。キャッシュされていなければ,null を返す。 C 抽象メソッド cacheBlockData は,引数で指定されたインデックス値及びその値に 対応するブロックデータをキャッシュする。キャッシュできるブロックデータ数が 上限に達している場合は,管理方針に従ってキャツシュされているブロックデータを 削除してから,指定されたブロックデータをキャッシュする。 A 抽象メソッド hit は,要求されたブロックデータがキャッシュ中に見つかったときに 呼び出される。引数は,見つかったブロックデータとそのインデックス値の対 (以下,キャッシュエントリという)である。 A メソッド getIndex 及び getBlockData は,それぞれインデックス値及びブロックデータを返す。 なお,上記コンストラクタやメソッドを呼び出すときの引数に誤りはないものとする。 〔プログラム1] public class BlockAccessor { private final Cache cache; private final BlockDevice device; public BlockAccessor(Cache.Policy policy) { device = BlockDevice.open(); cache = Cache.createCache(policy); } public byte[] readBlock(int index) { byte[] blookData = cache.getCachedBlockData(index); if (blockData == null) { blockData = new byte[device.getBlockSize()]; device.readBlock(index, blockData); cache.cacheBlockData(index, blockData); } return blockData.clone(); } }〔プログラム2〕 class BlockDevice { private final byte[][] blocks = new byte[1ØØ][512]; static BlockDevice open() { return new BlockDevice(); } int getBlockSize() { return〔プログラム3〕 public abstract class Cache { public enum Policy { FIFO, LRU; } static〔プログラム4〕 import java.util.ArrayList; import java.util.List; abstract class ListBasedCache extends Cache { final List<Entry> entries = new ArrayList<Entry>(); private static final int CACHE_SIZE = 2Ø; byte[] getCachedBlockData(int index) { for (Entry entry : entries) { if (entry.getIndex()設問 プログラム中の ![]() a に関する解答群
b に関する解答群
c に関する解答群
d に関する解答群
e に関する解答群
f に関する解答群
g に関する解答群
[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]
©2004-2024 情報処理試験.jp
|
プライバシーポリシー・著作権・リンク
|
お問合わせ
| ||||||||||||||||||||||||||||||||||||||||||