マルチスレッドの概念を7歳の子供に説明する必要がある場合、どうしますか?最近、インタビューでこの質問を受けました。私は仕事(やるべき仕事)と労働者(スレッド)を使ったストーリーを思いつきましたが、それは完全に納得のいくものではありませんでした(子供は若すぎると考えています)。
これについて説明するように頼まれた場合、どうしますか?
マルチスレッドの概念を7歳の子供に説明する必要がある場合、どうしますか?最近、インタビューでこの質問を受けました。私は仕事(やるべき仕事)と労働者(スレッド)を使ったストーリーを思いつきましたが、それは完全に納得のいくものではありませんでした(子供は若すぎると考えています)。
これについて説明するように頼まれた場合、どうしますか?
回答:
それが何であるかを説明し、定義以外の技術用語を省いてください:
やあキッド。ポケモンのことを考えながら、歩いてガムを噛んだことはありますか?それがあなたの脳のマルチスレッド化です。
彼らが簡単に理解できるものに関連付けてください。道路上の車。
単一車線の道路を考えてください。12台の車で、彼らは次々に運転します。そして、同時に完成できるのは1台の車だけで、より速い車は遅い車を追い越すことはできません。
しかし、マルチスレッドでは、これらのすべての車が4車線の広い道路を走行しているようです。速い車は遅い車を通過できます。
編集:そして、彼らが注意しないと、お互いに衝突する可能性があります...
洗濯をするように説明します。
洗濯物が3つ、洗濯機と乾燥機が1つずつあります。
誰もが洗濯をする方法は、洗濯のために次の荷物を置くよりも最初の荷物を乾燥機に入れることです。
子供は誰でも、最初の荷物が乾くのを待ってから2番目の荷物の洗濯を始めるのに時間がかかることを理解するでしょう。
洗濯機と乾燥機(コインランドリーなど)の数が多い場合は、負荷をより高速に処理できることを説明することで、さらに一歩進めることもできます。
これらの答えのいくつかは驚くべきものです...私はここで7歳を知っている唯一の人かもしれないと思いますか?
だから、ジョニー...マルチスレッドは、学校でのクリーンアップ時に起こることと似ています。クラスはすべて一日の終わりに掃除する必要があります...各子供は基本的にスレッドです...おもちゃを拾うことがタスクであり、おもちゃ箱は共有リソースです。
全体的には、面接官を顔にぶつけた方が良い答えだと思います。
マルチスレッドは、一度に多くのことを行い、少しずつ実行するようなものです。
ちょっと若い好奇心の強い男、毎日食べて、遊んで、寝なければならない。右?しかし、一度食べてみてください...それ以上食べられなくなるまでたくさん食べて、必要な時間ずっと寝てから、面白いゲームをプレイ&プレイしてみませんか?
まあ、それはできません。食べないと、前の食事でどれだけ食べてもお腹がすいてしまうからです。寝ないと、疲れて友達と遊べなくなります。分かりましたか?実行する必要があることがいくつかありますが、一度に実行することはできません。私たちは朝食を食べ、ゲームをし、昼食を取り、再びゲームをします...そして「おやすみなさい」と言います。
それはコンピューターの動作方法でもあります。彼らは少し音楽を再生し、次にあなたが描いている絵に切り替え、そして再び音楽を再生するために切り替えます。しかし、これらすべてのことを1000回行うのにかかった時間は、ほんの一瞬であるため、見ることはできません。
実行する必要がある6つのタスクのセットがあります。
各タスクの実行には1時間かかります。あなたには2人の兄弟がいます。
アートクラス(マルチスレッドアプリケーション)
教師がいないクラスは存在できないため、教師(メインスレッド)が必要です。クラスに着くと、座って先生が全員を説明し、その日の絵を描くようにクラスを割り当てます。
教師は、ペイントを開始する日のすべての生徒を割り当てます(スレッドの初期化と割り当て)。
学校には非常に多くの絵の具があるだけなので、誰もが色を共有しなければなりません(絵は記憶を表します)。
あなたがドラゴンを描いていて、それに狂った赤い目を与えたいが、他の誰かが赤い絵の具を使っているとしましょう。他の誰もそれを使用できないので、あなたはただ自分自身のために行き、ペイントを取ることはできません。代わりに、ペイントを共有(リソースロック)するよう丁寧に依頼します。少し使い、それを渡します。あなたはそれを取り戻すために少し待たなければならないかもしれませんが、それはそれを必要とするすべての人がペイントの戦い(レース条件)なしでいくつかを得ることができます。
クラスの終わりに、教師はクラスを解任します(スレッド参加)。
ゲーム(マルチプロセスアプリケーション)
友人とカードゲームをプレイする(またはグッズと同等のゲーム):
放課後に友達(プロセス)と集まるとしましょう。周りに先生がいないので、何をすべきかを教えてくれる人は誰もいません。
全員が集まってゲームをプレイします(マルチプロセスまたはマルチレイヤーアプリケーション)。
相手を打ち負かすためにカードを使用する方法(内部処理)について熱心に考え、アイデアを思いついたときにパートナーとアイデアを共有しようとします(メッセージの受け渡し)。
本当に上手になったら、クラブに参加できます:
リーダー(実行プログラム)メンバー(サブプログラム)
クラブが本当に良くなった場合、彼らはより良い戦略を立てるために互いに通信するための特別な方法(API)を思いつくかもしれません。
ここでは、抽象化がかなり複雑になるため、複数のプロセッサ/コアについては言及しませんでした(そして、コンテキストスイッチングは、ほとんどのアプリケーションに対して透過的です)。おそらく、ゲーム内のすべてのチームが別々のプロセッサ/コアを表し、ほとんどのゲームはゲーム内で少数のチームしか一緒にプレイできないため、依然として不得意だと言うことから始めることができます。将来は、多くの人々が多くの異なるチームのゲームで一緒にプレーできるMMORPGのように見えるかもしれません。
多くのコアコンピューターまたは多くのホストネットワークで分散処理システムの子供のメタファーを開発しようとすることは、遊ぶのはかなり興味深いでしょうが、それはOpが求めたものではありません。
注意:
上記のメッセージの受け渡しは、プログラムが相互に通信するために使用する多くの形式の通信への参照です。人々と同じように、アプリケーションには互いに対話する多くの方法があります。書き込みは、シリアル化されたデータのパイピングのようなものであり、会話はネットワークのようなものであり、ささやきは暗号化された接続を介したネットワークのようなものであり、データベースはスコアカードのようなものです(明確に定義されたデータを持つ有限構造)固体表面。
それ以外のほとんどのコミュニケーション形式は、私がそれらを区別できないと考えるにはあまりにもぼやけすぎます。
余談:
Haloのようなオンラインゲームをプレイしたことがある場合、グループに参加する(またはプロプレイヤーになる)人は通常、他のチームのプレイヤーがどこにいて、何を使用しているのかを互いに指示するための短い言葉を使用します。コールアウトがわからない場合は本当に不快ですが、ゲームプレイ中は驚くほど効果的です。
特定の文化に住んでいるほとんどの人が共通の言語を話すのに、その文化の中で特定のタスクを処理するために最適化された短い簡潔なドメイン言語を開発するのは興味深いことです。コンピューティングでは、APIと比較します。
広く採用されているモデル:食事する哲学者を使用します。
パスタディナーを食べる5人の哲学者。
テーブルの周りに5つのフォークがあります。
各哲学者は食べるために2つのフォークを必要とします。
食べる人もいます。待っている間に哲学する人もいます。
コンピュータは実際には一度に1つのことしか実行できませんが、非常に高速に処理できます。(簡単にするためにマルチコア処理は省略しています。)しかし、音楽を聴きながらゲームをプレイしたい場合はどうでしょうか。コンピューターは(非常に高速に)音楽の処理とゲームの処理を切り替えます。