Solarisで現在の先読み設定をどのように取得しますか?
Linuxでは、次のように検索できます。
# echo $(($(blockdev --getra /dev/sda)*512/1024))
(blockdevは常に512バイト単位で読み取りヘッド値を返すと仮定します。)
(通常、Linuxでは先読みは128Kです。)
答え1
Solarisはある程度プリフェッチを実行できます。 Linuxとは異なり、Solarisのカーネルは完全に動的であり、制約と使用可能なカーネルメモリに基づいて実行する操作を決定します。
ファイルシステムによって制御される先読みもあり、ZFSを使用している場合は、履歴キャッシュとは異なるキャッシュを持つことができます。
より良い回答を得るためには、合理的でないバッファリングされたデバイスから読み取ることが本当に好きかどうかを知ることが重要であり、実装の詳細を知りたい理由を理解することも重要です。
通常、Solarisでは、バッファリングされたバックストアへのread()呼び出しは、一時カーネルマップマップ領域のコピーに変換されます。 IIRCこの一時マップ領域は32ビットカーネルでは2MBで、64ビットカーネルでは大きいです。先読み操作は、関連するセグメントドライバ(仮想フロントメモリとリアストレージの間のドライバ)によって設定された手動でトリガされたエラー呼び出しによって実装されます。 AFAIK、利用可能な唯一の説明は私のWOFS卒業証書の論文にあります。 Sunの従業員はこの理由でこれを使用します。
状況をよりよく理解するには、いくつかの歴史的文脈を持つことが役に立ちます。
28年前、新しい仮想メモリサブシステムと共にSunOS-4.0がリリースされました。すべての最新のオペレーティングシステムは、少なくともSunOS-4.0のmmap()のアイデアをコピーしました。ただし、SunOS-4.0 はオブジェクト指向の VM サブシステムを実装しているため、より多くの機能があります。
仮想フロントメモリ、セグメントドライバ、HAL層(MMU)、およびバックエンドストレージがあります。
前景メモリオブジェクトタイプと背景オブジェクトタイプに基づく特殊セグメントドライバがあります。
ファイルシステムをフロントオブジェクトとして使用し、ディスクストレージをバックグラウンドメモリとして使用する場合は、セグメントドライバと呼ばれますseg_vn
。デバイスへのマッピングがある場合にsev_dev
使用します。
ufs_vnops.c
先読みがオブジェクトごとに異なることを理解するには、を確認して調べることをお勧めしますufs_getpage_ra()
。