• ベストアンサー

恰好が悪いのですが、伺います。

再入可能状態のプログラムルーチンが呼び出されている間には、 プロセス毎に使える領域が割り当てられている、 との主旨の説明を見掛けました。 但し、「複数回に渡って呼び出されたプログラムルーチンには、共有ロックが掛けられている。」との回答を別の質問ページで賜れましたので、 残念乍ら、私の誤解が残っているのだろう、と思われます。 従いまして、早急に分かりませんと、たとえ多くの参考書を読み耽りましても、 徒労に終わり兼ねませんから、畏れ入りますが、教えて下さい。 ★「プロセス毎に使える領域の『占有ロック』」が、 "再入可能プログラムルーチン"によって叶えられ得るのでしょうか?

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

> 再入可能状態のプログラムルーティーンが適用されているのでしたら、 > 其の場合には、プロセス毎に使える領域が確保されるそうですが、 > 個別の領域が共有ロック範囲の外で占有されているのでしょうか? > ( http://okwave.jp/qa/q7730078.html のANo.1への補足) はい,次のQ&Aでご紹介した図はそれを表していますよね。 http://okwave.jp/qa/q7729511.html の私の回答ANo.3 > 「プロセス毎に使える領域の『占有ロック』」が、 > "再入可能プログラムルーチン"によって叶えられ得るのでしょうか? はい,それが実現できないものは再入可能プログラムとは呼べません。

SakuraiMisato
質問者

補足

有り難う御座います。 私の誤解が解けまして、助かりました。 因みに、更に下記のページにも続けましたので、 其処でも御教授を賜われますと、非常に有り難いです。 http://okwave.jp/qa/q7731074.html

関連するQ&A

  • 継ぎ接ぎの様な質問文で畏れ入ります。

    (プロセス・スレッドではなく、)タスクによって 再入可能プログラムは別の記憶領域へ呼び出されていて、 其の各記憶領域の峻別の為に、 個別の局所変数が割り当てられるのでしょうか?

  • プログラムの構成について

    構成上どれがいいんでしょうか? 1.複数のプロセスで同時に実行できるようにしたプログラムは再帰的である。 2.逐次再使用可能なプログラムは、再入可能でもある。 3.再入可能プログラムはを実現するためには、プログラムを手続き部分とデータ部分に分割して、データ部分をプロセスごとにもつ必要がある。 4.再帰的処理のためには実行途中の状態をFIFO方式で記録し、制御する必要がある。

  • 共有メモリでのデータ読み書きについて

    Linuxで共有メモリを複数プロセスで読み書きする場合について質問させて頂きます。 CPUは32ビットで、共有メモリ上の、int(32ビット)の領域を 複数のプロセスで読み書きする場合を想定した場合、 セマフォ等でロックした方が良いのでしょうか? または、CPUが1命令で読み書きすることが可能 (と思っていますが、違っていればご指摘お願い致します)なので、 セマフォ等のロックをかけなくても、問題はないものなのでしょうか? 割りと良くありそうな疑問だと思ったのですが、 ウェブで調べた限りでは該当する質問はありませんでしたので、 質問させて頂きました。 ご回答宜しくお願い致します。

  • モジュール結合度の外部結合と共有結合について

    参考書籍を見ながら基本情報処理試験の勉強を始めました。 プログラミングの経験はあまりありません。 モジュール結合度の外部結合と共有結合について、意味がわからず困っています。 書籍には「外部結合=ほかのモジュールとデータ項目を共有するために、共通データの領域(グローバルな領域)を複数のモジュールで使用する」「共通結合=ほかのモジュールとデータ項目を共有するために、共通データ構造(配列や構造体などで定義したデータ)の領域(グローバルな領域)を複数のモジュールで使用する」と書いてあります。 とりあえず丸覚えしているので、試験の問題としては正解できそうなのですが、内容については意味がわかりません。 モジュール結合度でググってみても、ピンとくる説明に行き当たらず・・・。グローバルな領域とか、外部に宣言とか、データ構造・・・このあたりの単語がよくわからないのでピンとこないのかと思いますが、どのへんを勉強したらわかるものでしょうか。 参考サイトなどありましたら教えていただけると助かりますm(__)m

  • MDB のIsOpenに続くOpenで。

    MFC6.0のCDao***クラスにてAccess2000のMDBファイルを作成するプログラムを作っています。 このMDBは2つのプロセスそれぞれで更新のため利用されるので、 必ずIsOpen()で確認してFALSEであれば共有モードでOpen()、 というコードにしているのですけど、このOpen()のタイミングで「ファイルをロックできませんでした」という例外がcatchされてしまいます。 ファイルロックなんてしてないはずなのに、どうしてこんな現象が起きるのでしょうか? どなたかご存知でしたら、教えてください。よろしくお願いします。

  • サブルーチン関数をもちいて

    複数の事前に作製したプログラムファイルを読み込んでから、実行させたいと考えているんですが、どのように用いるのかがわかりません。 何か参考になるページなどがありましたら教えてください。

  • Oracleの排他制御について教えてください

    質問内容は結論から言うと、 INSERT文の時の排他制御について 知りたい。 以下の私の認識を踏まえた上で、 INSERT文の排他制御について 質問させてください。 なお、私の認識に誤りがあれば 指摘してください。 ### 私の認識 start ###### 1)Oracle では、select文の時に for updateを 書かなければ、なんのロックもかからず、 読み取り専用リソースへのアクセスで ない限り、 ダーティーリードの可能性がある。 2) select文で for update を指定した場合は 該当行について 共有ロックがかかる。 行単位の共有ロックがかかる。 その際、 他のトランザクションが for updateつきで selectしてきても、 共有ロック同士なので、 互い排他制御しない。 (3) update 文の場合は 該当行について、 占有ロックがかかる 行単位の占有ロックがかかる。 (4) INSERT文の時には、 ロックをかけようにも INSERT前の段階では、 ロック対象行は存在しない。 複数のトランザクションが INSERTした行のPK の値が偶然同じであった場合 ロストアップデートの危険があるので 私の創造では、INSERT文の時は テーブル全体をロックしないと、 うまくいかないように思えます。 (5) update, insert文については、 Oracleでは、自動的に該当行について 占有ロックを行う。 なお、INSERT文については、 下記の質問事項における疑問点 が解消されていないため、 行単位なのかどうか、私の中では 自身がもてないのが現状です。 ### 私の認識 end ###### ### 主な質問内容 start ### 私の認識の(4)を踏まえた上で INSERT文の時のはいた制御 の範囲や挙動について、 教えてください。 ### 主な質問内容 end ### 以上です。

  • 【Fortran】共有メモリの使い方

    【Fortran】共有メモリの使い方 http://rakasaka.fc2web.com/delphi/mapping.html こちらを参考にして、WindowsでC++から Fortran(77)プログラム呼び出して、 共有メモリを使用したソースを書こうと思っていますが 全然ソースが書けません。 何か参考となるページやアドバイスを頂けませんでしょうか。 現在、C++からCreatProcessでFortranのプログラムを呼び出すこと までできています。 C++のソースは http://staff.aist.go.jp/toru-nakata/sukkoro.html を参考にして作っています。

  • 特定のプロセスが使用している物理メモリ量

    特定のプロセスが使用している物理メモリを確認する方法を教えてください。 プロセスが使用している物理メモリ領域は「Working Set」と呼びますが、「Working Set」には「Private Bytes」と「Shared Bytes」が含まれます。 「Shared Bytes」は、他のプロセスと共有される物理メモリのため、特定のプロセス専用で使用される物理メモリではありません。 「Private Bytes」は、そのプロセスが物理メモリで利用中のものとページアウトされたものになり、ページアウトされたものは物理メモリにはありません。 「Working Set」は「Private Bytes」+「Shared Bytes」の総和といっても、ページアウトされたものをは物理メモリにないため、ページアウトされたものは引かれています。 「Working Set」の値から「Shared Bytes」の使用量を調べて、「Shared Bytes」の中で特定のプロセス専用のものでないものを引くことができれば、特定のプロセスが使用している純粋な物理メモリを知ることができるのではと考えております。 パフォーマンスモニターなどのツールでどの「カウンタ」のどの「インスタンス」を取得して、どのような計算をすれば、求めることができるかご教示頂けませんでしょうか。

  • Windowsの仮想メモリシステムについて

    こんにちは。 OSは現在、WindowsVistaと、Windows7を使っています。 こういったWindows系OS全てに共通している、仮想メモリなどのメモリ関係の用語について、かなり詳しく調べたのですが、最近、それらをきちんと理解できていない事に気づきましたので、今回の質問をさせて頂きます。 まず僕は、メモリ関係の各用語について、以下のように解釈しています。 ---------------------------------------------------------------------------------- ●物理メモリ 基本的にはRAM上にあるメモリの事であり、OSによってアクセスされる。 OSは起動後、各物理メモリに、物理アドレス(物理アドレス空間におけるアドレス)を割り当てる。 ●仮想メモリ領域 仮想メモリ領域は、各プロセスが、メモリを使うためにアクセスするアドレス空間の事であり、物理メモリと、次で説明するページファイルで構成されてる。 現在のWindows系OSでは、プロセスが起動すると、そのプロセスとセットになる、4GBの仮想メモリ領域 (仮想アドレス空間とも呼ばれる) が割り当てられ、実行するプログラムコードと、そのコードが参照して操作するデータが、そこにマップされる。 プロセスの持つ仮想メモリ空間4Gバイトの内、ユーザが使用可能なメモリ領域は、下位2Gバイトであり、上位2Gバイトはシステムによって使用される、「カーネルメモリ」となる。 OSと、コンピュータ上の専用のハードウェアコンポーネントは、プロセスが使用している仮想アドレスを、物理アドレスに変換する処理を行っている。 Windowsの場合、仮想メモリの各フラグメントを、「ページ」といい、サイズは通常 4KB である。 ●ページファイル 物理メモリの不足を補うために、HDDに用意されたメモリ領域の事である。 デフォルトではC:\pagefile.sys というファイルが、ページファイルとなっている。 これによって、RAM容量よりも大きなサイズの、仮想メモリ空間を利用することができる。 ページファイル上に置かれたページにアクセスするには、そのページをRAM上に読み込まなければならないため、現在使われていないRAM上のページとの入れ替えが、OSによって行われる。 このとき、RAM上の不要なページをページファイルに書き出し、RAMから消去することを「ページアウト」あるいは「スワップアウト」と呼び、必要なページをページファイルから読み出し、RAM上に配置することを「ページイン」あるいは「スワップイン」という。 ●コミットページ(コミットチャージ) プロセスに割り当てられた、使用可能な仮想メモリページ全てを表す。 これには、RAMからページアウトされたメモリページも含まれまれる。 コミットページの合計サイズと現在使用中のサイズは、タスクマネージャのパフォーマンスタブにある[ページファイル]の部分で確認できる。 この[ページファイル]という部分は、上で説明したページファイルの事ではなく、 RAMとページファイルの両方に存在している、メモリページのサイズを意味する。 ●ワーキングセットページ プロセスから最も頻繁かつ直近にアクセスされる、常にRAM上にあるメモリページの事である。 ワーキングセットページには、そのプロセスしか使えない部分(プライベートワーキングセット)と、他のプロセスと共有可能な部分がある。 共有可能なワーキングセットは、他のユーザープロセスで、物理メモリが不足し始めた場合に使用できる。 ----------------------------------------------------------------------------------- まず、以上の解釈で、おかしいと思う部分がありましたら、どしどし突っ込んで下さい。 次に、以下のようなコードブロックを含む、C++プログラムを作成して実行しました。 ------------------------------------------------------------ char *p; for(int i=1; i<=2000 ; i++) p=new char[1024*1024]; ------------------------------------------------------------ このコードブロックは、pというポインタに対し、1024×1024B = 1MB のメモリの割り当て作業を、2000回行います。 つまり、このプログラムをビルドして作成された、a.exeという実行ファイルを実行すると、 約2000MBのメモリがa.exeに割り当てられるという事が予想できます。 プログラムの実行中に、タスクマネージャのプロセスタブにある、a.exeの行を見ていると、 メモリに関する列項目値は、 コミットサイズ:2012.928KB=1965.75MB ワーキングセット:4616KB=4.51MB プライベートワーキングセット(a.exeしか使えないワーキングセット):2656KB=2.59MB となっていました。 ワーキングセットページのサイズが4.51MBとしかない事から、約2000MBのメモリの割り当ての大半は、RAM上にはないメモリページ、つまりページファイル上のメモリページを使って行われたのだと、僕は思いました。 ところが、ページファイル上のメモリページの使用量を、専用のソフトで調べてみると、 a.exeの実行前から全く変化していなかったので、実際はページファイル上のメモリページを使用しなかったのだという事になります。 では一体、どこにあるメモリページが、a.exeで使用されたのかという事になります。 この件について、皆さんはどう思われるでしょうか? 長くなりましたが以上です。 何か御存じの方がいらっしゃれば、是非、アドバイスして頂きたく思います。 では、よろしくお願い致します。

専門家に質問してみよう