マルチスレッドの概念を7歳の子供に説明する必要がある場合、どうすればよいでしょうか。最近、この質問をインタビューで受け取りました。私は仕事(やるべき仕事)と労働者(スレッド)を使ったストーリーを思いつきましたが、それは完全には説得力がありませんでした(子供が若すぎると考える)。
これについて説明するように求められた場合、どのように説明しますか?
それが何であるかを説明し、定義を除いて専門用語を省いてください:
こんにちは。ポケモンについて考えながら歩きながらガムを噛んだことはありますか?それはあなたの脳のマルチスレッドです。
簡単に理解できるものに関連付けます。道路上の車。
1車線の道路を考えてみてください。 12台の車が次々と運転されています。同時に終了できるのは1台の車だけで、速い車は遅い車を追い越すことができません。
しかし、マルチスレッディングでは、これらすべての車が4車線の広い道路を走行しているようです。速い車は遅い車を通り過ぎることができます。
編集:そして、彼らが注意していない場合、彼らはお互いに衝突する可能性があります...
洗濯するように説明します。
洗濯物が3つあり、洗濯機1つと乾燥機1つがあります。
誰もが洗濯する方法は、最初の荷物を乾燥機に移してから、次の洗濯物を洗濯することです。
すべての子供は、最初の負荷が乾くのを待ってから2番目の負荷の洗浄を開始するのに時間がかかることを理解しています。
さらに多くの洗濯機と乾燥機(コインランドリーなど)があるかどうかを説明することで、さらに一歩踏み出すことができます。
小さなストーブの上でいくつかの料理と一緒に食事を調理します。 2つのバーナー(つまり、プロセッサーまたはコア)と4つの皿(スレッド)を調理します。したがって、一度に最大2つの料理しか調理(実行)できません。料理によって調理時間が異なります。料理人(OS)はこれらすべてを調整しなければならないので、夕食に間に合うようにすべてが調理されます。
2つのボールから始まり、徐々に自分の行動にボールを追加していくサーカスジャグラー。
マルチスレッドは、一度に多くのことを実行し、少しずつ実行するようなものです。
若い好奇心旺盛な男、毎日食べて、遊んで、寝なければならない。正しい?でも、一度食べてみませんか...たくさん食べられなくなるまでたくさん食べてから、必要な時間だけ寝て、面白いゲームをプレイしてください。
ええ、あなたはそれをすることができません、なぜならあなたが食べなければ、あなたは前の食事でいくら食べても空腹になるでしょうから。寝ないと疲れて、友達と遊べません。分かりましたか?やらなければならないことがいくつかありますが、一度に行うことはできません。私たちは朝食を食べ、ゲームをし、昼食をとり、再びゲームをします...そして、ついに「おやすみなさい」と言います。
それはコンピューターの動作でもあります。彼らは音楽を少し再生してから、描いている絵に切り替え、もう一度切り替えて音楽を再生します。しかし、これらすべてのことを千時間行うのにかかった時間は、一瞬の瞬きに過ぎないので、あなたはそれを見ることができません。
私の経験では、7歳の子供は、さまざまなことが同時に進行するという概念に問題はありません。これは、子供向けに設計されたさまざまなプログラミングツールキットで確認されています。特にレゴキットだけでなく、スクラッチシステムも。
おそらく、インタビュアーはあなたに何か予期しないことを尋ねる新しい角度を見つけようとしていただけでしょう。
「キッチンからテーブルまで2杯のグラスを運ぶ必要があります。(彼らは走り、グラスを片手に持ちます)さて、もう一度やり直してください。ただし、片手で操作してください。」
これらの回答のいくつかは驚くべきものです...私はここで7歳児を知っている唯一の人かもしれないと思いますか???
つまり、ジョニー...マルチスレッディングは、学校での片付けのときに起こることに似ています。クラスのすべては、一日の終わりの後に片付ける必要があります...各子供は基本的にスレッドです...おもちゃを拾うことがタスクであり、おもちゃ箱は共有リソースです。
概して、面接担当者の顔を殴ることがより良い答えだと思います。
あなたがしなければならない6つのタスクのセットがあります:
各タスクの実行には1時間かかります。あなたには2人の兄弟がいます。
Artクラス(マルチスレッドアプリケーション)
先生がいなければ授業はできないので、先生(メインスレッド)が必要です。あなたがクラスに着くと、あなたは座り、先生は全員の責任を負い、クラスにその日の絵を描くよう割り当てます。
教師は、その日のすべての生徒にペイントを開始するよう割り当てます(スレッドの初期化と割り当て)。
学校には非常に多くの絵の具しかないので、誰もが互いに色を共有する必要があります(絵の具は記憶を表します)。
あなたがドラゴンをペイントしていて、それにクレイジーな赤い目を与えたいが、他の誰かが赤いペイントを使用しているとしましょう。他の誰もそれを使用することができなくなるので、あなたは単に行き、自分でペイントを取ることはできません。代わりに、ペイントを共有(リソースロック)するように丁寧に依頼します。あなたは少し使ってからそれを渡します。あなたはそれを取り戻すために少し待たなければならないかもしれませんが、それはそれを必要とするすべての人がペイントの戦いなしにいくつかを得ることができるようにします(競合状態)。
クラスの終わりに、教師はクラスを辞退します(スレッド参加)。
ゲーム(マルチプロセスアプリケーション)
友達と一緒にカードゲームをプレイする(または収集品を使用する同等のゲーム):
放課後に友達(プロセス)と集まるとしましょう。何をすべきかをあなたに教えるために誰もいません。
みんなが集まってゲームをプレイします(マルチプロセスまたはマルチレイヤーアプリケーション)。
カードを使用して対戦相手を打ち負かす方法(内部処理)について一生懸命考え、アイデアを思いついたら(メッセージパッシング)、パートナーとアイデアを共有しようとします。
あなたが本当に上手くなったら、クラブに参加することができます:
リーダー(エグゼクティブプログラム)メンバー(サブプログラム)
クラブが本当に上手くなった場合、彼らは戦略を改善するために互いに通信するための特別な方法(API)を考え出すかもしれません。
ここでは複数のプロセッサ/コアについて言及しないことにしました。これは、抽象化がかなり複雑になるためです(コンテキストの切り替えは、ほとんどのアプリケーションに対して透過的です)。ゲームのすべてのチームが個別のプロセッサ/コアを表し、ゲームで一緒に遊ぶことができるのは少数のチームのみであるため、ほとんどのゲームはまだうまくいっていないと私はおそらく最初に言うことができます。将来は、MMORPG=のようなものに見えるかもしれません。そこでは、多くの人々が多くの異なるチームのゲームで一緒に遊ぶことができます。
多数のコアコンピュータまたは多数のホストネットワークで分散処理システムの子供用メタファーを開発しようとするのは、非常に興味深いものですが、Op=が求めていることではありません。
注:
上記のメッセージパッシングは、プログラムが互いに対話するために使用する多くの形式の通信への参照です。人と同じように、アプリケーションには互いに対話するための多くの方法があります。書き込みはPipingのシリアル化されたデータのようなものであり、話すことはネットワークのようなものであり、ささやきは暗号化された接続を介したネットワークのようなものであり、データベースはスコアカード(明確に定義されたデータを持つ有限構造)のようなものであり、MSMQの使用は、固体表面。
それを超えた他のほとんどのコミュニケーション形態は、あまりにぼやけすぎて、それらを区別できないと見なすことができません。
余談:
Haloのようなオンラインゲームをプレイしたことがある場合、グループに参加する(またはプロプレーヤーになる)人々は通常、他のチームのプレーヤーがどこにいて、彼らが何を使用しているかを互いに指示するためのコールアウトをするための短い言語を使用します。コールアウトがわからない場合は本当に不愉快ですが、ゲーム中に驚くほど効果的です。
特定の文化に住むほとんどの人が共通の言語を話しますが、その文化の中で人々は特定のタスクを処理するために最適化された短い簡潔なドメイン言語を開発する方法は興味深いです。コンピューティングでは、それをAPIと比較します。
ジョイスティック/ゲームコントローラが1つあります。
4人の子供がいます。他の子供たちが休んでいる間、各子供は各レベルをプレイする順番を取ります。チームワークを使用して、彼らは最終的にレベル255に達します*。
各子供が遊んでいる間、彼はまた、現在のプレイヤーだけが食べることが許可されているチップの袋から食べています。
*その後、ゲームがクラッシュします。 ;)
「コントローラーを3つ追加購入しませんか?」
まあ、それらはマルチプロセッサです!