一回も披露したことのない豆知識

このカテゴリでよいか迷ったのですが質問させていただきます。
私は今までの仕事で、某セキュリティ会社の防犯監視システム開発、某携帯電話開発(UI)に携わってきました。
そこではリアルタイムOSマルチタスク環境でのプログラム開発だったのですが、マルチタスクといっても当然タスク毎に"実行可能状態"、"待ち状態"、"実行中状態"等(その他いろいろ)、各種状態を持ち、タスクプライオリティに従いOSがタスクのスケジューリングを行い順次タスクが切り替わって制御されているという感じだったのですが(何が言いたいかというと優先順位の違う複数のタスクが並列で動くことはないですよね?と言いたいのですが)、

今回LinuxOS(MontaVista)でのプログラム開発を行ってみて違いに戸惑いを感じました。(マルチ)プロセスとは何ぞや?から始まり、さらにそのプロセス内で作成されるスレッド、そのプロセス・スレッドは他のプロセス・スレッドと並列で動く等等。(正確にはあたかも同時に動作しているかのように見えるってことですよね?)

前半の"タスク"と後半の"プロセス"とはこのように別物なのですよね?
今までの経験では並列動作という概念が無かったもので、どうもしっくりこなく意見をあおぐ為投稿させていただきました。

かなり漠然としたことで恐縮なのですが、今まで述べたことでなにか勘違いしているんじゃないかとか間違えていることとかありますか?
長文となり申し訳ありません。

A 回答 (6件)

うまく伝わるかどうか不安ですが、頑張ってみますね。



タスクやプロセスという言葉に厳密な定義はない、と思って以下を読んでください。

あなたが、いままでやってきた環境やオペレーティングシステムにおいては、システムの中で同時に動かしたい仕事の単位を「タスク」と定義してあった。
linuxやwindowsでは「プロセス」と定義してあった。
...だけの話です。

リアルタイムOSでは、「タスク」と呼ぶことが多いし、タスク生成や起動のシステムコールもtaskXX()とかいう名前になっています。
linuxやwindowsでは、明らかに「プロセス」と呼ばれています。(敢えて、ここではまだスレッドを出しません。)


また、別の特徴として、

リアルタイムOSでは、システムの中のメモリを全タスクから参照したり書き換えたりできるようなメモリ管理となっていたり、カーネルとタスクが出来る範囲をあまり区別していない。(どのタスクから見ても0x89ABCDEFというアドレスのメモリは全く同一)
linuxやwindowsでは、カーネル空間とユーザ空間に分け、ユーザ空間のプロセスは1つ1つのプロセスは独自のメモリ空間を持って動く。(Aというプロセスから見える0x89ABCDEFというアドレスのメモリと、Bというプロセスから見える0x89ABCDEFというアドレスのメモリは、実は違うもの)
また、カーネルが出来ることと、ユーザ空間プロセスが出来ることを分けている。(これの詳細は割愛します。)

がありますが、タスクとプロセスという言葉とはホントは関係のない話なのです。


同時実行うんぬん(スケジューリング)の話の方も、同様です。
あなたがいままでやってきたお仕事でも、OSが優先順位というポリシーに基づいて、たった1つのプロセッサ資源を、複数のタスクにどう分割して使わせるかを決めていた。
linuxやwindowsのプロセスでも同じです。OSが優先順位や時分割というポリシーに基づいて、たった1つのプロセッサ資源を、複数のプロセスにどう分割して使わせるかを決めている。
ほら、たいした違いはないでしょ?


「スレッド」という言葉は「プロセス」という言葉と一緒に使われます。
プロセスの仕事の流れをある時点から分岐させて複数の仕事を同時実行(厳密には、同時実行しているかのように、というのはご理解されている通りです)させることができます。スレッドを生成するとか、スレッドを起動するとかです。
1つのプロセスは1つ以上のスレッドから成ります。
ここまでくるとお気づきでしょう。
ちょっと上に書いたlinuxやwindowsがプロセスを同時実行させるというのは厳密には間違いで、スレッドがスケジューリングの対象となっています。
あるプロセスの中のスレッドたちは、そのプロセスの資源を共有します。
先に述べたカーネル空間にはプロセスという概念はありませんが、スレッドの概念はあります。カーネルスレッドと呼ばれます。


以上のように、メモリ1枚板で、万能のタスクのマルチタスキングが一般的なリアルタイムOSと、
仮想メモリをプロセスごとに切り替えて動作させることまでサポートしているlinuxやwindowsでの、ユーザ空間マルチプロセッシング、マルチスレッディングとの違いはご理解いただけたでしょうか?

参考になれば。

ちなみに、私のお勧めのコンピュータ関連用語解説サイトをご紹介しておきます。
(英語を読めなければなりませんが...)

参考URL:http://www.whatis.com/
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

とてもわかりやすい解説で納得しました。
ありがとうございます。

お礼日時:2003/02/28 12:57

#環境毎にいろいろ言い回しが違ってくるのもなのでしょうか?



そう思います。
Windowsの話ですが
APIでCreateProcessとCreateThreadというものがあるので
Windowsに限定していうならば定義されているのでしょう。

CreateProcess
実行ファイル(バイナリ)を実行する
CreateThread
実行ファイルの中にある処理を同時に(基本的に非同期)で動かす。

さらにスレッドの中の処理をOS(Windows)が細かく
優先順位順に実行しています。その細かい処理の単位がタスクなのだと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2003/02/28 16:32

2回目です、putarouです。



素人がいきなり、話のレベルを下げてしまったようで、大変申し分けない。

謝ります。

素性を明かしますと、私の経験はあくまで個人の趣味でx86系のマイコンの
プロテクトモードを使用したマルチタスクモニタ(自称だけど)を作ったこと
がある程度です。

WindowsやLinuxに動作については、何も知りません、御承知おき下さい。

さてタスクですが、私の古い資料(80386システムプログラム)では
「80386ではプログラムはすべてタスクとして実行される」
(長文の引用はさけます)
とあります。

この記述は特定のOS等を前提にしたものでないことを御理解ください。

この本はアーキテクチャの説明には、一貫してタスクと言う言葉使いをしています。

プロテクトモードのレジスタにはタスクレジスタ(TR)と言うものがあります。

話をx86のプロテクトモードのアーキテクチャに限定して言いますと。

プロセッサはタスクをひとつしか実行できません、そのひとつしか実行できない
タスクがタスクレジスタに登録されています。

タスクを変えるときはタスクレジスタの値を変えることで行います。

モチロン通常のレジスタを操作するような方法では変えられません。

タスクを変更する方法はセグメント間JMPあるいはCALL、または割り込みにより
行います。

このときタスクスイッチが行われます、各タスクは独立した資源を持っているの
で、これを該当するタスクのものに切り替える為です。

タスクレジスタの値を変えると言いましたが、この値をセレクタと言いこれが間
接的(実情はかなり複雑)にタスクの資源を登録してあるメモリ上の位置をさしま
す。

また、資源を共有したタスクと言うのもあります、これらのタスクは資源の切り
替えはいりませんから、違うタスクですがいわゆるタスクスイッチは不要です、
スレッドと呼ばれているようです。

本には「複数のタスクが同時に実行される」などの表現もあるんですが、アセン
ブラレベルでプログラムを書いている人なら、同時と言っても時分割処理のこと
だなと理解されるでしょう、他に理解のしようもありません。

私の場合はタイマ割り込みを使ってタスク切り替えを行いました、そのときは
登録したユーザプログラムを割り込みの度に切り替えると言うものです、登録
したユーザプログラムが増えると、当然に各タスクの時間当たりの処理量は減
っていきます。

本格的に作れば、ここで優先度をつけて割り当ての制御などを行うのでしょう
、因みに親分のモニタのタスクは必ず割り当てて巡って来るようにしないと、
ユーザタスクだけが存在してシステムタスクが存在せずにシステムサービスが
出来なくなります。

私の古い資料(80386システムプログラム)のホントに最後の数ページにOS/2に
ついて説明があり、そこにプロセスが出てきます。

「プロセスはOS/2がシステムの資源を割り当てる単位であり、複数のプロセス
が同時に実行可能である」(長文の引用はさけます)

とあります、同時に実行可能とは時分割でと言う意味でしょう、80386が1個しか
なければ、それ以外にあり得ませんから。

昔の事を思い出しながら一所懸命、書いてみました。

昔の印象ですから、今は間違っているのかもしれませんが。

タスクとプロセスは紙の両面のように一体にも見えるし、裏(プロセッサ)からみ
ればタスクだし、表(OS)から見ればプロセスなのかなと。

>プロセスをタスクに割り付けるとはどういうことでしょうか

ちょっと違ったかもしれませんけど、タスクにユーザプログラムを割り当てるの
が、先の回答で言った「プロセスをタスクに割り付ける」と言うイメージです。

もちろんユーザプログラムをひとつも割り当てない事もあるんです、そのときは
親タスクだけが走っていることになります。

一応、親タスク(モニタプログラム)もユーザプログラムもタスクに割り付けるの
で、私流の解釈ならプロセスなのかな、親タスクも割り当て解除して、何の動作
もないプログラム(例えば無限ループ)なんかにタスクをスイッチするとコンピュ
ータはフリーズします。

こんな場合は、何にも反応しないプロセスにタスクが占有されてしまったなん
ていったら(本当はモニタプログラムがシステムを放棄したと言うべきだけど)、
言葉使いとしてはどうでしょう、間違ってますか。

>No.1のshigureさんに頂いた回答のようにプロセスとタスクの関係は似て
>異なるものではないのでしょうか?

私もそうだと、思ってるんですけど。

>ある機能については複数のタスクで管理、またある機能については複数の
>プロセスで管理なんてことはできないですよね?

そうですね、タスクとプロセスが全く別物とは思えないですね。

>ようは1つのOS管理の下ではマルチタスクで動作しているか、もしくはマル
>チプロセスで動作しているか存在せずそれらは共存することは無いのでは
>ないでしょうか?

私の場合は表裏一体のように捉えちゃってますね。

まあー、タスクとプロセスは本を読めば読むほど混乱しますね、確かに。

しかし、小さなシステムでマルチタスクを自分なりに構築してみたら、自分
なりの納得が見つかるのでは。
    • good
    • 0
この回答へのお礼

度々のご回答ありがとうございます。

>素人がいきなり、話のレベルを下げてしまったようで、大変申し分けない。
素人は私のほうです。

正直に申しまして、後半の内容が難しく理解するのが困難です。
(タスクについての説明はとてもよくわかりました。ありがとうございます。)
そもそも1つのシステム(CPU管理下)で、タスクというものとプロセスというものが同時に存在することが理解できなく。。。
というのは私の中でタスク=プロセスなので、1つのシステムの中でタスクとプロセスという言葉を同時に使ってはいけないみたいな固定観念が。。。

あ~~~っ!!!、こんな事繰り返してもしょうがないですね。
お馬鹿な自分に腹が立ちます。
最後の1文に少し救われた気がします。
>しかし、小さなシステムでマルチタスクを自分なりに構築してみたら、自分なりの納得が見つかるのでは。  

お礼日時:2003/02/28 01:43

厳密な定義など無いと思いますが、私の認識では



タスク=OSの処理の単位
プロセス=アプリケーションの処理の単位
スレッド=プロセスの中の処理の単位

ASCIIデジタル用語辞典(http://yougo.ascii24.com/)
から引用すると
Windowsではスレッドを実行単位とするため
タスク=スレッドと書かれていました。

LinuxやUNIX系はわかりませんが
WindowsNT系はスレッド単位でCPUを切り替えてる
わけではなく、スレッドよりも小さい単位で
切り替えています。
ですから開発者としては特にタスクを意識しません。
また優先順位が同じでもデュアルCPUでもない限り2つのタスクが
同時に実行される事はないはずです。

と、、間違ってたらごめんなさい
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>プロセス=アプリケーションの処理の単位
つい最近までしていた仕事で、LinuxOSによるシステム開発をしていたのですが、
それは複数のプロセスで構成された1つのシステム(=アプリケーション?)でした。
あっ、けどもしかしたらプロセス単体でも当然動作するのでそれをアプリケーションとも表現できますね。
ってゆうかプロセス毎に実行形式のファイルを作ってたからそういうことですね。すみませんでした。

>スレッドよりも小さい単位で切り替えています。
スレッドよりも小さい単位ってゆうのがあるんですね。知りませんでした。
ただ個人的にはタスク=スレッドというのがしっくりこないのですが。。。

なんかこの問題は意味は同じでも、環境毎にいろいろ言い回しが違ってくるのもなのでしょうか?
そんな気がしてきました。

お礼日時:2003/02/28 01:22

タスクは時系列に分割されたCPU時間の割り当ての枠の事と思います。



プロセスはタスクの割り当てを受けたり、タスクから外されたりします。

タスクは実時間に配置されており、プロセスはプログラムの構造上に
イメージされていると思えます。

タスクが列車の様なものとイメージすると、プロセスは乗客に当ると思
います。

列車の最上位にあるものがJRなら、タスクの上位にあるのはOSでしょう。

客が列車に乗っていれば車掌にサービスも要求できます、プロセスがタ
スクで走っているときには、OSに様々な要求をしていると思います、プ
ロセスがOSに自分より下位のプロセスをタスクに割り付けるタスクの増
発を要求するなんて事もあると思います(一例)。

これがイワユル、マルチタスク動作と言うのでしょうか。

タスクは時分割されたものですから、完全に並走している並列処理とは
違うようです。

具体的なイメージ(モチロンあなたにとっての)で考えた方が、最初はい
いんじゃないかと思います。

細かいところは、そのあと押さえたら良いんじゃないでしょうか。

強引に列車と結びつけちゃいました、ちょっと違うかもしれないけど、
最初からいきなり難しいことは考えにくいです、見えないし。

80386のプロテクトモードは最初はホント、分からなかったです、当時
はそれでも、困らなかったけど。

ちょっとでも参考になったら嬉しいかぎりです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>プロセスがOSに自分より下位のプロセスをタスクに割り付けるタスクの増発を要求するなんて事もあると思います(一例)。
プロセスをタスクに割り付けるとはどういうことでしょうか???
No.1のshigureさんに頂いた回答のようにプロセスとタスクの関係は似て異なるものではないのでしょうか?
タスクとプロセスは異なったレベルではなく(プロセスとスレッドのような関係ではない)、どっちかというと同じレベルに属し、ただ世界が違うようなもの(?)という感じではないのでしょうか?
例えば1つの組み込み機器のなかに、ある機能については複数のタスクで管理、またある機能については複数のプロセスで管理なんてことはできないですよね?
ようは1つのOS管理の下ではマルチタスクで動作しているか、もしくはマルチプロセスで動作しているか存在せずそれらは共存することは無いのではないでしょうか?

お礼日時:2003/02/27 17:18

CPUが一つである限り、並列で動くことはありません。


これはタスクもプロセスも一緒で、優先順位でスケジューリングされます。

タスクとプロセスは似て異なるものです。
一番違うのはメモリ空間です。
リアルタイムOSにおけるタスクは、自分以外のメモリ空間も参照したり書き換えたりできますが、Linuxなどのプロセスはそれぞれ独立したメモリ空間を持っていて、他のプロセスのメモリを参照したりすることができません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私が想像していたのに限りなく近い回答でした、ありがとうございます。
私が今まで経験してきた組み込み系開発では、私自身プロセスという言葉(概念)を聞かなくとても戸惑ってしまいました。
これを機会にWindowsやlinux環境下で動作するアプリケーションプログラムなども勉強したいと思います。

お礼日時:2003/02/27 17:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報