• ベストアンサー

レジストリを書き換えるといつHDDに保存されるのでしょうか

WindowsXP Professionalで、レジストリの値を 書き換えると、メモリ上で書き換えられるだけ だと思うのですが、HDDに保存されるのはどういう タイミングなのでしょうか。 XPがハングした場合、その直前に自作アプリで書き 換えたレジストリの値がHDDに保存されないときが あり、レジストリの値とDBの値が一致しなくなる ため、レジストリを書き換えると即時にHDDに保存 できる方法を知りたいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.8

Windowsは「起動時あるいはログオン時にレジストリデータの一時コピーを作成し、ログオフ時あるいはシャットダウン時に一時コピーの内容を書き戻す」といった処理を行いません。レジストリデータの更新は、それがレジストリファイルに由来するものであれば、レジストリファイルの更新に直結します。 回答No.2の「5秒間待ってからの書き出し処理」ではHDD上にあるレジストリファイルの内容が更新され、処理が完了するとレジストリファイルの内容は更新済みレジストリデータと一致するものになります。 またこの処理が途中で中断した場合、次回再起動時にレジストリデータは「書き出し処理の開始前の状態」か、あるいは「書き出し処理が完了した場合の状態」のいずれかに修復されます。どちらになるかは、どこまで書き出し処理が進んでいたかによって決まります。(前者をロールバック処理、後者をロールフォワード処理といい、データベースの一貫性を保証するための標準的な処理です。) 実際の処理内容の詳細は回答No.2に挙げた書籍に記載があり、amazon.comのサイト上で実際に読むこともできます。手順は以下のとおり。 1. http://www.amazon.com/gp/product/0735619174 を開く。 2. 書籍の内容を「stabke storage」で検索。 3. 検索結果から290ページ(「on Page 209」)を選択。 ここで表示される290ページの「Stable Storage」の見出し以下、次ページまでの1セクションがレジストリデータ更新時のファイル更新処理の内容です。 もちろん、記述に誤りがあって実は書き戻し用一時コピーを持っているという可能性もなくはありませんが・・・

googooneruneru
質問者

お礼

ありがとうございました。大変参考になりました。

その他の回答 (8)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.9

半分は想像で投稿していましたので、解決への遠回りと混乱を招いていたら申し訳ございません。 そこで、私の投稿がいかなるものか、実践してみました。 簡単な方法ですが、レジストリエディタで「HKEY_CURRENT_USER」を書き換えた後、強制的に電源を切断してみました。 状況からすると自作アプリから書き換えて5秒以上経っていると思われますので、 こちらの試験でも5秒以上経ってから電源を切断しました。 起動して「HKEY_CURRENT_USER」の内容を確認したところ、正しく書き換えられていましたので、 私が思っていた「一時エリア」の展開と退避という処理はなさそうです。 ただ、レジストリエディタが、自作アプリと同様の動作をしているかどうかはわかりません。 結果、ANo.4でxcrOSgS2wYさんが言われたとおり「妙」としか言えなくなりました。 xcrOSgS2wYさんのおかげで私も勉強になりました。 ありがとうございます。 あと、私の勘違いと言うか、想像をたくましくさせたのには、理由がありました。 私のパソコンで必ずといっていいほど、終了時にイベントログがエラーを残しています。 ---- イベント ソース: Userenv ユーザー: NT AUTHORITY\SYSTEM コンピュータ: xxxxxxxx(コンピュータ名) 説明: ログオフ時にアプリケーションまたはサービスがレジストリをまだ使用している間に、Windows はユーザー xxxxxxxx(コンピュータ名)\yyyyyyyy(ユーザー名) のレジストリを保存しました。 ユーザーのレジストリによって使用されたメモリは解放されていません。 レジストリは使用されなくなったときにアンロードされます。 ユーザー アカウントとしてサービスを実行していることが原因と考えられます。 LocalService または NetworkService アカウントでサービスを構成してみてください。 ---- これで、ログオフ時やWindows終了時に何かしらレジストリを操作しているのではないかと、思ったわけです。 しているのは確かだと思いますが、今回のようなことに関係するエリアではない可能性の方が高いですね。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.7

ANo.5の補足です。 ANo.4のxcrOSgS2wYさんが書き込まれている最中に私も作文していたので気付きませんでした。 ANo.6でのフォローは、私の書き込みに対するものだと思いますので、ありがとうございます。 レジストリはキャッシュを介さないとの事ですが、私もそうは思いつつ投稿しました。 ハングアップした後の処理をどうされたかが不明だったので、 強制終了(電源を切ったかリセット)したものと判断したために投稿した次第です。 補足いたしますと、 キャッシュの有無にかかわらず、レジストリが保存されるのは一時的なエリアの書き込み時で、強制終了した場合は、完全なレジストリにはならないと思ったのです。 一時的なエリアと言うのは、「HKEY_CURRENT_USER」の事で、これは現在ログインしているユーザーの情報だと思います。 これとは別に、全ユーザーの情報(ログイン時に読み込まれ「HKEY_CURRENT_USER」化される)があり、そこに書き込まれるのはログオフ時だと思っていました。 レジストリへの書き込みが発生した場合にキャッシュを介していないとして、 「HKEY_CURRENT_USER」だけではなく、私が思っている全ユーザーの情報のエリアにも書き込まれていれば、 このような現象は起こらないと考えたのです。 前提として、 自作アプリが書き換えているのは「HKEY_CURRENT_USER」でるのと、 強制終了した、と言う状況下での話です。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.6

回答No.4の補足です。 「レジストリデータのHDDへの書き込みはバッファを介さない」とは「書き込みキャッシュを介さない」という意味です。念のため。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.5

これでできるかどうかわかりませんが、 時間的余裕があれば、一度試してみてください。 「デバイスマネージャ」で、 コンピュータのツリーの中にある「ディスクドライブ」から、 レジストリファイルのあるHDDを選択して、 プロパティを開きます。 「ポリシー」タブにある、 「ディスクの書き込みキャッシュを有効にする」のチェックをはずします。 そこにある注意書きや、「?」ボタンでのヘルプにあるように、 チェックが付いていると、すぐにはHDDに書き込まれず、 キャッシュに書き込まれるため、 万が一の時にはデータが壊れる可能性があります。 チェックをはずすと、キャッシュを使わなくなるので、 いくらかは安全になると思われます。 おそらくですが、DBの方は、このチェックにかかわらず、 そのシステムから、直に書き込んでいるか、 キャッシュをすぐにパスして書き込まれるようにかになっているのでしょう。 それで、不一致が発生するのかも知れません。 これで、書き込みの安全性は上がりますが、 書き込みのパフォーマンスは下がります。 どれくらい下がるのかを試されてみて、 かつ、安全なのかも確認された上で運用を考えてみてください。 レジストリに書き込まれるタイミングですが、 ユーザー情報とコンピュータ情報とあって、 常時書き込まれているのは一時的なエリアではないかと思われます。 ユーザー情報は、そのユーザーがログオフした時、 コンピュータ情報は、そのコンピュータが終了した時に、 本来のエリア、おそらく起動時に読み込まれるエリアへ、 書き戻しているではないかと思われます。 いずれにしても、正常終了しない限り、レジストリの内容は保障されないことになります。

googooneruneru
質問者

お礼

ありがとうございました。参考になりました。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.4

それは妙ですね。 レジストリデータのHDDへの書き込みはバッファを介さないので、5秒より古いデータが残っていることはないのですが。 むしろ、DBの値の更新トランザクションが完全に完了しないうちにハングアップしており、そのせいで再起動時にDBの内容がロールバックされて不整合を生じている可能性のほうが高いように思われます。 レジストリの値とDBの値が一致しないとき、どちらの値が戻ってしまっているのか、いちど両方ともタイムスタンプを入れて比較してみることをお勧めします。(書き込むデータに時刻を追加し、更新時に、更新時点の時刻も同時に書き込むという意味です。)

  • thanks39
  • ベストアンサー率61% (1189/1944)
回答No.3

書き換える場所によって方法が違うと思いますけど。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

レジストリの値の書き換えが発生してから5秒間待ち、その間のレジストリの値の変更内容がまとめてHDDに書き出されます。 Windows Server 2003ではこの「5秒」という値をレジストリ設定で変更可能です。Windows XPではおそらく変更できません。 (Microsoft Windows Inteernals, Fourth Edition / Microsoft Pressより。)

googooneruneru
質問者

お礼

回答ありがとうございます。 5秒後にかかれるのですか。 ただ、問題が起きた際には、レジストリを書き換え後 20時間してハングし、再起動したところ、 レジストリの値がもとに戻っていたのです。

  • 8086
  • ベストアンサー率22% (118/520)
回答No.1

シャットダウンまたは再起動をするときに「設定を保存しています」と出ますよね。このときだと思います。 レジストリではなく何らかの設定ファイルにでも書き出せば不整合は起きないのでは。

関連するQ&A