プロセスを生成や実行する時に内部でどんな処理が行われていますか?

このQ&Aのポイント
  • プロセスを生成や実行する際の内部処理について詳しく解説します。
  • 「Lions' Commentary on UNIX」という本を参考にしながらプロセスの実行について学んでいますが、理解が進まないです。
  • 具体的には、メモリへの実行ファイルのロードだけではプロセスは走らず、さまざまな操作が必要です。
回答を見る
  • ベストアンサー

プロセスを生成や実行する時に内部でどんな処理が行われていますか?

最近 「Lions' Commentary on UNIX」 という本がわかりやすいと薦められて読んでいますが ぶっちゃけよくわからずに読み進めています。 その本のなかでnewproc()という関数のコード解説があったのですがやはりよく理解できませんでした。 結局「プロセスを実行する」という処理は内部でどういう操作が行われているのでしょうか?上記の本を読んだ感じでは結局メモリに実行ファイルをロードしただけなんじゃないかという気がします。 もちろんそれだけではプロセスは走らないとは思いますが、具体的に何をどうすれば「プロセスが走り出す」状態になるのでしょうか? よろしくお願いします。

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

  • ベストアンサー
回答No.1

プロセスの新規生成とは、プロセスの各種情報をプロセス一覧表内のPCB(process control block)に書き込み、実行可能プロセスの待ち行列にほうりこむことです。ですので、それだけでは実行されません。 実行されたがっているプロセスはOS内にいくつもある可能性があるので、次に実際に実行されるのは待ち行列の先頭にあるプロセスです。新規のプロセスもいずれは先頭に来て実行されることになります。 行列の先頭プロセスが実行されるときには、OSはPCB内にある中断時のレジスタなどの情報を実際のレジスタに格納し、前回中断された場所にジャンプ(実際にはリターンですが)することにより、実行が再開されます。新規のプロセスであっても先頭から再開されることによって、実行開始となります。 プロセスは実行を開始しても、一定時間の経過、OSの呼出し、外部からの割込みなどの様々な原因で中断してしまい、場合によっては待ち行列の末尾に戻ります。

_comcom
質問者

お礼

どうもありがとうございます。 構造は理解できました。後はソースコードと 照らし合わせながら読んでみたいと思います。

関連するQ&A

  • UNIXのプロセス内部で実行ファイルの絶対パスを知る方法

    UNIXのプロセス内部で、自分自身の実行ファイルの絶対パスを知る方法はありますか? 関数が用意されていそうな気がするのですが、見つかりません。 分かる方、教えて下さい。

  • Linuxで生成したプロセスに処理をさせるには?

    Linuxの学んでいる者です。 表題の件について、本を読んだり、ネットで検索したり したのですが、解決ができなかったため質問させて いただきました。 以下に例を挙げます。 1つのCファイルに、「main」と「A」と「B」という関数があるとします。 「main」関数にて、fork()で2つプロセスを生成し、一方のプロセスでは 「A」関数を実行し、もう一方では「B」という関数を実行させます。 「A」という関数は3秒ごとに「1,2,3,…」と数字を出力するもので、 「B」という関数は5秒ごとに「10、20、30、…」と数字を出力するものとします。 こういう場合に、プロセスに「A」や「B」の処理を実行させることができません。 exec関数でプロセスに別のプログラムを実行させることはできますが、 プログラムの実行ファイルのパスを指定して実行させるようなので、 この場合にはうまく使えません。 理解されている方には、本当に些細なことではあると思いますが、 私では解決にまで至らなかったので、ご教授いただければ幸いです。 よろしくお願いいたします。

  • lions' commentary on unix 練習問題 section3について

    lions' commentary on unix 練習問題 section3の3.1について、「goto文を使わずにすむように手続きschedを書き直せ」という問題の答えが分かりません。分かる方解答お願いします 

  • Windowsでのfork方法

    Windowsプログラムで、UNIXライクなマルチプロセス処理を書きたいのですが、 fork()が使えないようで、代替の方法がわかりません。 CreateProcess()というAPIはありますが、これは単に実行モジュールの呼び出し を行う関数で、UNIXのようなfork()でプロセスを分けるものでは ないようです。 子プロセス内部で、構築済みのDLLを複数ロードしたいのですが、 そのDLLはマルチスレッド対応になっていないため、 マルチスレッド処理はできません。 具体的にやりたいと思っていることをプログラム的に書くと、 およそ以下のような処理です。(UNIXでよくやる手法です) ----- 実行処理のメイン() {  int p_pid[128];  for(int i=0; i<10; i++) {   switch(pid[i]=fork()){    case 0: // 子プロセスとしての処理     子プロセスが呼び出す関数();     exit(0);    case -1:     break;    default:     break;   }  } } void 子プロセスが呼び出す関数() {  LoadLiblary() と GetProcAddress() で、DLLを動的にロードし、  DLL内のAPIを呼び出す。  DLLがマルチスレッド対応でなくても、この関数は各々が別プロセスとして  複数同時実行されるので、問題なく処理できるはず。 } ----- この処理は、Windowsでは無理なのでしょうか? もしできるなら、Windowsで用意されているランタイムライブラリかAPIを 教えていただけないでしょうか? よろしくお願いします。

  • 権限=プロセスを実行したユーザー?

    権限=プロセスを実行したユーザー? ウィンドウズNTのセキュリティについて調べています。 権限という言葉がよくでてきますが、それはつまりそのプロセスを起動したユーザーということですか? そして特権についてですが、特権はシステム関連の操作を行う権利で、特権によってはデフォルトでオフになっているものもある、という考えであっているでしょうか。 そして、「そもそも権限が足りないから特権をONにできない」という様な記述をみたのですが、ということは、権限によって持っている特権が決まるということですよね? またこの権限は昇格させられますか? という事で、質問したい点は ・権限とは? ・特権のON、OFFについて ・特権と権限の関係 ・権限は昇格させられるか? の4つです。 どれか1つでもので回答よろしくお願いします。

  • C言語でホスト(Unix)にプログラム/プロセスを送信して実行する方法

    C言語でホスト(Unix)にプログラム/プロセスを送信して実行する方法を探しています。 用途はまだ具体的に決まってませんが 例えば、ある与えられたコマンドを各ホストに一斉送信して その結果をまとめて取得する、ようなことがしたいです。 どんなに難しくなってもいいので、いい方法や関数があったら教えて下さい。

  • デバッグ時と実行時の識別はできますか?

     多重起動の防止のため、WEBページを参考にしてメインFormのLoad時に、下記のコードで2個目以降起動しないようにしています。 '2重起動の防止 Dim pn As String = Process.GetCurrentProcess.ProcessName If Process.GetProcessesByName(pn).GetUpperBound(0) > 0 Then   MessageBox.Show("すでに起動しています")   Me.Close()   Exit Sub End If  これはうまく行くのですが、デバッグ実行のときに時々起動しないことがあります。 EXEでの実行時にこのようなことはないので、デバッグ時のみこの部分を機能しないようと思っています。 参照可能な内部変数などご存知ないでしょうか。

  • javaを使ってunixの端末操作の実行

    unix(ubuntu)の端末の操作(ls,rm,cpなど)をjavaで書いたコードで実行したいです(unixの端末内で)。 javaのProcessBuilderでコードを書く場合どうすればいいでしょうか? ちなみにjshて何ですか? 参考コードなどをいただけるとありがたいです。 よろしくお願いします。

  • C言語でのコマンドライン引数の内部での処理のされ方

    C言語でint main(int argc, char *argv[])とメイン関数を宣言します。 2番目の引数はC言語の文法的にいうと文字列へのポインタの配列だとおもいますが、一般的な関数でこの引数に値を渡すとすると、以下のように宣言されたポインタ配列を渡すことになるとおもいます。 ・宣言 char *pa[]; ・関数への渡し func(pa); 話が元に戻りますが、main関数でもらう場合は、プログラム外部から与えられた引数は(正確に言うとアドレス)、メモリ上ではC言語で書かれたexeファイルの外から実行時にプログラムファイルのメモリ上にコピーされるのでしょうか? 自分でもうまく表現できないのですが、 ・コマンドプロンプトで引数を与えて実行         ↓ ・プログラムファイルのメモリ上に引数がロードされる ということでいいんでしょうか? 自分でもなんだかうまく表現できないので、お暇な方でよろしいので、気が向いた人、回答ください。 よろしくお願いします。

  • 【VB2005】コンソールアプリ実行時のコマンドプロンプトの非表示方法

    22歳男性です。 vb2005で開発してます。 コンソールアプリケーション実行時に表示されるコマンドプロンプトを非表示(タスクバーにも表示されない)にしたいのですがやり方がわかりません。 私が調べたところ「System.Diagnostics.Process」クラスを使用すると外部アプリ(コマンドプロンプトなど)の操作はできるようです。ですが、私は外部アプリの操作ではなく、実行ファイル自身が実行時に表示するコマンドプロンプトを非表示にしたいので、「System.Diagnostics.Process」クラスでは実現不可と考えています。 それと、このことを実現するために、新たに実行ファイルを作るのではなく、あくまで既存の実行ファイルに「コマンドプロンプトを非表示にする」コードを埋め込むことを理想としています。そのため、実行ファイルが2つ以上になる(実際に実行するファイルと、その実行ファイルのコマンドプロンプトを操作する実行ファイル)ような考えは求めてません。 もし知っている方がいらっしゃいましたら、「使用するクラス」「具体的なコード」などを記述していただけたらありがたいです。 宜しくお願いします。