メタデータ#
[!abstract] オペレーティングシステム入門
- 書名: オペレーティングシステム入門
- 著者: ライムズ・H. アパヒデュセル アンドレア・C. アパヒデュセル
- 概要: これは現代のオペレーティングシステムに関する本です。本書は、仮想化、並行性、持続性という 3 つの主要な概念を中心に展開し、すべての現代システムの主要なコンポーネント(スケジューリング、仮想メモリ管理、ディスクおよび I/O サブシステム、ファイルシステムを含む)を紹介しています。本書は全 50 章で、3 つの部分に分かれており、それぞれ仮想化、並行性、持続性に関連する内容を説明しています。本書のほとんどの章では、特定の問題を提起し、書中で紹介される技術、アルゴリズム、思想を通じてそれらの問題を解決します。著者は対話形式で紹介されるテーマの概念を導入し、文体はユーモアを交えつつも鋭い洞察を提供し、読者がオペレーティングシステムにおける仮想化、並行性、持続性の原理を理解できるように努めています。本書は内容が充実しており、実行可能なコード(擬似コードではなく)を提供し、関連する演習も含まれており、高等教育機関の関連専門の教師の教育や大学生の独学に適しています。
- 出版時間 2019-06-01 00:00:00
- ISBN: 9787115508232
- 分類: コンピュータ - コンピュータ総合
- 出版社: 人民郵電出版社
ハイライト#
前書き#
- 📌 仮想化(virtualization)、並行性(concurrency)、持続性(persistence)。 ^30179184-6-1240-1293
- ⏱ 2021-11-07 09:36:51
第 1 章 本書についての対話#
-
📌 教授:この本を読んでくれてありがとう。本書の英語のタイトルは『Operating Systems: Three Easy Pieces』で、オペレーティングシステムに関する知識を教えます。自己紹介をしてください。学生:教授、こんにちは。私は学生です。おそらくお分かりでしょうが、私は学ぶ準備ができています!教授:素晴らしい。質問はありますか?学生:あります!この本はなぜ「3 つの簡単な部分」を扱っているのですか?教授:それは簡単です。リチャード・ファインマンは物理学に関するいくつかの講義を持っていて、とても素晴らしいです…… 学生:ああ、『ふざけるな、ファインマン先生』の著者ですか?あの本は素晴らしいです!この本もあの本のように面白いですか?教授:ええと…… いいえ。その本は確かに素晴らしいです。あなたがそれを読んでくれて嬉しいです。この本は、彼の物理学に関する講義にもっと似ていることを願っています。基本的な内容を集めて『Six Easy Pieces』という本にまとめました。彼は物理学について話していて、私たちが探求するテーマはオペレーティングシステムの 3 つの簡単な部分です。これは適切です。なぜなら、オペレーティングシステムの難しさは物理学の半分程度だからです。学生:わかりました。私は物理学が好きです。それはどの 3 つの部分ですか?教授:仮想化(virtualization)、並行性(concurrency)、持続性(persistence)です。これが私たちが学ぶ 3 つの重要な概念です。これらの 3 つの概念を学ぶことで、オペレーティングシステムがどのように機能するかを理解します。たとえば、次にどのプログラムが CPU を使用するかをどのように決定するか、仮想メモリシステムでメモリ使用のオーバーロードをどのように処理するか、仮想マシンモニターがどのように機能するか、ディスク上のデータをどのように管理するか、部分的なノードが失敗しても正常に動作する分散システムをどのように構築するかについても少し説明します。学生:あなたが言ったことについて、私は何も理解していません。教授:素晴らしい、あなたは正しい場所に来ました。 ^30179184-6-359
- ⏱ 2021-10-13 09:10:43
-
📌 まずは授業を聞き、先生の説明を聞いてメモを取り、毎週末にメモを読み返して、これらの概念をよりよく理解することです。 ^30179184-6-1738-1776
- ⏱ 2021-11-07 10:17:48
-
📌 特にプロジェクトを行うと、実際の問題を解決するために本物のコードを書くことになります。これはメモの概念を実践することです。孔子が言ったように…… ^30179184-6-1830-1879
- ⏱ 2021-11-07 10:17:55
-
📌 「聞くことは見ることに及ばず、見ることは知ることに及ばず、知ることは行うことに及ばず。」 ^30179184-6-1941-1971
- ⏱ 2021-11-07 10:18:11
-
📌 良い質問です!私は時々、自分を物語から引き離して考えることがより有用だと思います。これらの対話は考えることです。 ^30179184-6-2532-2577
- ⏱ 2021-11-07 10:19:27
第 2 章 オペレーティングシステムの紹介#
-
📌 仮想化は多くのプログラムを実行可能にし(したがって CPU を共有)、多くのプログラムが同時に自分の命令とデータにアクセスできるようにします(したがってメモリを共有) ^30179184-7-2403-2450
- ⏱ 2021-10-13 09:11:38
-
📌 2 つの数を加算する、メモリにアクセスする、条件をチェックする、関数にジャンプするなど ^30179184-7-734-757
- ⏱ 2021-11-07 10:18:57
-
📌 オペレーティングシステムはどのようなメカニズムと戦略を用いて仮想化を実現していますか?オペレーティングシステムはどのように効果的に仮想化を実現していますか?どのようなハードウェアのサポートが必要ですか? ^30179184-7-1754-1798
- ⏱ 2021-11-07 10:19:11
-
📌 あなたが学部のオペレーティングシステムのコースを受講しているなら、プログラムが実行されるときに何が起こるかについての基本的な理解があるはずです。もし理解していないなら、この本(および関連するコース)はあなたにとって難しいでしょう:この本を読むのをやめるか、最近の書店に行って、必要な背景知識(Patt / Patel [PP03]、特に Bryant / O’Hallaron の本 [BOH10]、どちらも非常に良い)を素早く学んでからこの本を読み続けるべきです。プログラムが実行されると何が起こるのでしょうか?実行中のプログラムは非常に単純なことを行います:命令を実行します。プロセッサはメモリから命令を取得(fetch)し、それをデコード(decode)し(これはどの命令かを理解する)、それを実行(execute)します(2 つの数を加算する、メモリにアクセスする、条件をチェックする、関数にジャンプするなど)。この命令が完了すると、プロセッサは次の命令を実行し、これを繰り返します。プログラムが最終的に完了するまで [挿絵]。こうして、フォン・ノイマン(Von Neumann)計算モデル [挿絵] の基本概念を説明しました。簡単に聞こえますね?しかし、このコースでは、プログラムが実行されている間に、他にも多くの狂ったことが同時に進行していることを学びます —— 主にシステムを使いやすくするためです。実際、ある種のソフトウェアがプログラムの実行を容易にし(複数のプログラムを同時に実行することさえ可能にし)、プログラムがメモリを共有し、プログラムがデバイスと対話できるようにし、その他の興味深い作業を行います。これらのソフトウェアはオペレーティングシステム(Operating System、OS)と呼ばれ、システムが使いやすく、正確かつ効率的に動作することを保証する役割を担っています。重要な問題:リソースをどのように仮想化するか。本書では、オペレーティングシステムがリソースをどのように仮想化するかという核心的な問題に答えます。これは重要な問題です。なぜオペレーティングシステムはこれを行うのか?これは主な問題ではありません。なぜなら、答えは明らかであるべきだからです:それはシステムを使いやすくするからです。したがって、私たちはどのように仮想化するかに焦点を当てます:オペレーティングシステムはどのようなメカニズムと戦略を用いて仮想化を実現していますか?オペレーティングシステムはどのように効果的に仮想化を実現していますか?どのようなハードウェアのサポートが必要ですか? ^30179184-7-359
- ⏱ 2021-11-07 10:21:48
-
📌 命令を実行する ^30179184-7-657-661
- ⏱ 2021-11-07 10:23:46
-
📌 命令を取得(fetch)し、それをデコード(decode)し(これはどの命令かを理解する)、それを実行(execute)します(それがすべきことを行います、例えば ^30179184-7-669-734
- ⏱ 2021-11-07 10:23:53
-
📌 リソースをどのように仮想化するか ^30179184-7-1626-1634
- ⏱ 2021-11-07 10:32:53
-
📌 私たちには 1 つのプロセッサしかありませんが、これらの 4 つのプログラムは同時に実行されているようです!この魔法はどのように起こるのでしょうか? ^30179184-7-4049-4314
- ⏱ 2021-11-07 10:35:34
-
📌 単一の CPU(またはその一部)を無限の数の CPU のように見せることで、多くのプログラムが同時に実行されているように見えるようにすることが、いわゆる仮想化 CPU(virtualizing the CPU)です。これは本書の第一部の焦点です。 ^30179184-7-4399-4491
- ⏱ 2021-11-07 10:35:57
-
📌 もし 2 つのプログラムが特定の時間に実行したい場合、どちらを実行すべきですか?この問題はオペレーティングシステムのポリシー(policy)によって答えられます。 ^30179184-7-4680-4727
- ⏱ 2021-11-07 10:36:15
-
📌 オペレーティングシステムはリソースマネージャー(resource manager)の役割を担っています。 ^30179184-7-4812-4846
- ⏱ 2021-11-07 10:36:21
-
📌 メモリを読み取る(read)には、指定されたアドレス(address)を指定する必要があります。そうしないと、そこに保存されているデータにアクセスできません。書き込む(write)または更新する(update)には、指定されたアドレスに書き込むデータを指定する必要があります。 ^30179184-7-4996-5078
- ⏱ 2021-11-07 10:50:35
-
📌 プログラムの各命令はメモリにあるため、命令を読み取るたびにメモリにアクセスします。 ^30179184-7-5178-5211
- ⏱ 2021-11-07 10:50:51
-
📌 実行中の各プログラムは同じアドレス(00200000)でメモリを割り当てていますが、各プログラムは 00200000 の値を独立して更新しているようです!まるで実行中の各プログラムが他のプログラムと同じ物理メモリを共有するのではなく、自分専用のプライベートメモリを持っているかのようです。 ^30179184-7-6454-6723
- ⏱ 2021-11-07 10:54:54
-
📌 プライベート仮想アドレス空間(virtual address space)(時にはアドレス空間とも呼ばれる)、オペレーティングシステムはそれを機械の物理メモリに何らかの方法でマッピングします。 ^30179184-7-7116-7191
- ⏱ 2021-11-07 11:00:47
-
📌 物理メモリはオペレーティングシステムによって管理される共有リソースです。 ^30179184-7-7261-7279
- ⏱ 2021-11-07 11:00:54
-
📌 プログラムは Pthread_create () を使用して 2 つのスレッド(thread)を作成しました。スレッドは、他の関数と同じメモリ空間で実行される関数と見なすことができます。 ^30179184-7-8694-8907
- ⏱ 2021-11-07 11:01:38
-
📌 命令は 1 回に 1 つだけ実行されます。残念ながら、上記のプログラムの重要な部分は、共有カウンターを増加させる部分で、3 つの命令が必要です。 ^30179184-7-10069-10113
- ⏱ 2021-11-07 11:03:54
-
📌 持続性を正しく実現するためにはどのような技術が必要ですか?高性能で実現するためにはどのようなメカニズムと戦略が必要ですか?ハードウェアやソフトウェアの障害に直面した場合、信頼性はどのように実現されますか? ^30179184-7-11947-12000
- ⏱ 2021-11-07 11:06:49
-
📌 open () の呼び出しは、ファイルを開いて作成します。2 番目は write () で、いくつかのデータをファイルに書き込みます。3 番目は close () です。 ^30179184-7-12068-12121
- ⏱ 2021-11-07 11:07:11
-
📌 ハードウェアは何らかの入力 / 出力(Input/Output、I/O)デバイスの形で現れます。 ^30179184-7-10527-10563
- ⏱ 2021-11-07 11:07:20
-
📌 ほとんどのファイルシステムは、ジャーナリング(journaling)やコピーオンライト(copy-on-write)などの複雑な書き込みプロトコルを含んでいます。 ^30179184-7-12788-12843
- ⏱ 2021-11-07 11:08:52
-
📌 CPU、メモリ、ディスクなどの物理リソース(resources)を仮想化(virtualize)します。これは、並行性(concurrency)に関連する厄介で難しい問題を処理します。ファイルを持続的に(persistently)保存し、それによって長期間安全に保ちます。 ^30179184-7-13143-13255
- ⏱ 2021-11-07 11:09:26
-
📌 それは取得しました ^30179184-7-13140-13143
- ⏱ 2021-11-07 11:09:29
-
📌 抽象化により、大規模なプログラムを書くことが可能になり、それを小さくて理解しやすい部分に分割し、C のような高級言語でそのようなプログラムを書く際にアセンブリを考慮する必要がなく、アセンブリでコードを書く際には論理ゲートを考慮する必要がなく、論理ゲートを使用してプロセッサを構築する際にはトランジスタをあまり考慮する必要がありません。 ^30179184-7-13411-13623
- ⏱ 2021-11-07 11:10:45
-
📌 オペレーティングシステムを設計し実装する目的の 1 つは、高性能を提供することです。 ^30179184-7-13736-13757
- ⏱ 2021-11-07 11:11:02
-
📌 もう 1 つの目的は、アプリケーション間および OS とアプリケーション間で保護(protection)を提供することです。 ^30179184-7-14007-14047
- ⏱ 2021-11-07 11:13:00
-
📌 保護はオペレーティングシステムの基本原理の 1 つであり、隔離(isolation)がその核心です。プロセスを互いに隔離することが保護の鍵であり、したがって OS が実行しなければならない多くのタスクを決定します。 ^30179184-7-14134-14200
- ⏱ 2021-11-07 11:13:19
-
📌 これらのオーバーヘッドはさまざまな形で現れます:追加の時間(より多くの命令)や追加のスペース(メモリやディスク上)。可能であれば、私たちは解決策を探し、1 つまたは 2 つを最小限に抑えようとします。しかし、完璧は常に実現可能ではなく、私たちはそれに注意を払い、(適切な場合には)それを容認します。 ^30179184-7-13875-13978
- ⏱ 2021-11-07 11:15:03
-
📌 仮想化とシステムを使いやすくすることは非常に価値がありますが、コストを無視することはできません。したがって、私たちは過剰なオーバーヘッドなしに、仮想化や他のオペレーティングシステム機能を提供するよう努めなければなりません。 ^30179184-7-13815-13875
- ⏱ 2021-11-07 11:15:34
-
📌 ユーザーはコンピュータの前に座って使用しますが、大部分の時間はアイドル状態であり、そのため施設は毎時数千ドルを無駄にします [BH00 ^30179184-7-15348-15392
- ⏱ 2021-11-07 11:16:27
-
📌 これらの古いメインフレームシステムでは、1 回に 1 つのプログラムを実行し、オペレーターが制御します。このオペレーターは、あなたが現代のオペレーティングシステムが行うと思う多くのことを行いました(たとえば、ジョブの実行順序を決定するなど)。もしあなたが賢い開発者なら、オペレーターに良い印象を与えるでしょう。そうすれば、彼らはあなたの仕事をキューの前に移動させることができます。 ^30179184-7-15130-15243
- ⏱ 2021-11-07 11:16:45
-
📌 システムコールとプロシージャコールの主な違いは、システムコールが制御を OS に移し、ハードウェア特権レベル(hardware privilege level)を引き上げることです。 ^30179184-7-15928-16002
- ⏱ 2021-11-07 11:17:14
-
📌 カーネルモードでは、オペレーティングシステムはシステムのハードウェアに完全にアクセスできるため、I/O リクエストを開始したり、プログラムに追加のメモリを提供したりするなどの機能を実行できます。 ^30179184-7-16210-16263
- ⏱ 2021-11-07 11:17:40
-
📌 初期のオペレーティングシステム、たとえば DOS(Microsoft のディスクオペレーティングシステム)は、メモリ保護が重要であるとは考えていませんでした。したがって、悪意のあるプログラム(または単にプログラミングが不十分なアプリケーション)は、メモリ全体に無秩序に書き込む可能性があります。 ^30179184-7-17795-17876
- ⏱ 2021-11-07 11:18:07
-
📌 プロセスのマシン状態のもう 1 つの部分はレジスタです。 ^30179184-9-2248-2265
- ⏱ 2021-11-08 13:54:05
第 1 部 仮想化#
- 📌 第 3 章 仮想化についての対話教授:さて、オペレーティングシステムの 3 つの部分の第 1 部 —— 仮想化について話し始めましょう。学生:尊敬する教授、仮想化とは何ですか?教授:桃を想像してください。学生:桃?(信じられない)教授:はい、桃です。私たちはそれを物理的(physical)桃と呼びます。しかし、この桃を食べたい人がたくさんいます。私たちは、食べたい人全員にそれぞれの桃を提供したいと思っています。そうすれば、皆が幸せになります。私たちは、各人に与える桃を仮想(virtual)桃と呼びます。私たちは、物理的な桃から多くの仮想桃を作り出す方法を考えます。重要なのは、この幻想の中で、誰もが物理的な桃を持っているように見えることですが、実際にはそうではありません。学生:つまり、誰も他の人と桃を共有していることを知らないのですか?教授:はい。学生:でも、実際には 1 つの桃しかないのです。教授:はい、そうです。学生:だから、もし私が他の人と同じ桃を共有しているなら、私はその問題に気づくはずです。教授:はい!あなたは正しいです。しかし、食べる人が多いほど、その問題が発生します。彼らはほとんどの時間を居眠りしたり、他のことをしたりしているので、あなたは彼らが居眠りしている間に彼らの手から桃を取り上げて他の人に分け与えることができます。そうすれば、私たちは多くの仮想桃があるように見せかけることができます! ^30179184-8-375
- ⏱ 2021-11-07 11:18:54
第 4 章 抽象化:プロセス#
-
📌 プロセスとは、実行中のプログラムです。プログラム自体にはライフサイクルはなく、単にディスク上に存在するいくつかの命令(おそらくいくつかの静的データ)です。 ^30179184-9-433-485
- ⏱ 2021-11-08 13:50:32
-
📌 オペレーティングシステムはこれらのバイトを実行させ、プログラムを機能させます。 ^30179184-9-485-507
- ⏱ 2021-11-08 13:50:38
-
📌 プロセスのマシン状態には明らかな構成要素があり、それはメモリです。 ^30179184-9-2124-2147
- ⏱ 2021-11-08 13:54:03
-
📌 同様に、スタックポインタ(stack pointer)と関連するフレームポインタ(frame pointer)は、関数パラメータスタック、ローカル変数、および戻りアドレスを管理するために使用されます。 ^30179184-9-2434-2498
- ⏱ 2021-11-08 13:54:34
-
📌 メカニズムはシステムの「どのように(how)」の問題に答えます。たとえば、オペレーティングシステムはどのようにコンテキストスイッチを実行しますか?ポリシーは「どれ(which)」の問題に答えます。 ^30179184-9-2644-2706
- ⏱ 2021-11-08 13:56:30
-
📌 両者を分離することで、メカニズムを再考することなくポリシーを簡単に変更できます。 ^30179184-9-2724-2748
- ⏱ 2021-11-08 13:56:48
-
📌 すべての現代のオペレーティングシステムは、何らかの形でこれらの API を提供しています。 ^30179184-9-3002-3023
- ⏱ 2021-11-08 13:57:19
-
📌 それはプログラムがプロセスに変換される方法です。 ^30179184-9-3970-3982
- ⏱ 2021-11-08 13:57:59
-
📌 プログラムの実行時スタック(run-time stack または stack)にいくつかのメモリを割り当てる必要があります。あなたはおそらく、C プログラムがスタックを使用してローカル変数、関数パラメータ、および戻りアドレスを保存することを知っています。 ^30179184-9-4753-4823
- ⏱ 2021-11-08 13:59:20
-
📌 オペレーティングシステムは、プログラムのヒープ(heap)にもいくつかのメモリを割り当てる可能性があります。C プログラムでは、ヒープは明示的に要求された動的メモリを使用します。 ^30179184-9-4920-4961
- ⏱ 2021-11-08 13:59:27
-
📌 コードと静的データをメモリにロードし、スタックを作成して初期化し、I/O 設定に関連する他の作業を実行することで、OS は今や(ついに)プログラムの実行の舞台を整えました。 ^30179184-9-5337-5399
- ⏱ 2021-11-08 13:59:52
-
📌 これにより、CPU を忙しく保つことでリソースの利用率を向上させることができます。 ^30179184-9-7648-7671
- ⏱ 2021-11-09 09:27:18
-
📌 いつでも、実行中にアクセスまたは影響を与えるシステムのさまざまな部分をカウントすることで、プロセスを概括できます。 ^30179184-9-1943-1985
- ⏱ 2021-11-09 09:57:14
-
📌 プログラムカウンター(Program Counter、PC) ^30179184-9-2359-2384
- ⏱ 2021-11-09 09:58:15
-
📌 コードとすべての静的データ(初期化変数など)がメモリにロードされ、プロセスのアドレス空間にロードされます。 ^30179184-9-4061-4104
- ⏱ 2021-11-09 09:59:03
-
📌 プログラムを起動し、エントリーポイントで実行します。つまり、main () です。main () ルーチン(第 5 章で説明される特別なメカニズム)にジャンプすることで、OS は CPU の制御を新しく作成されたプロセスに移し、プログラムの実行が始まります。 ^30179184-9-5411-5487
- ⏱ 2021-11-09 09:59:53
-
📌 さまざまな関連情報を追跡するための重要なデータ構造があります。たとえば、各プロセスの状態を追跡するために、オペレーティングシステムはすべての準備が整ったプロセスのリスト(process list)を保持するかもしれません。 ^30179184-9-7865-7938
- ⏱ 2021-11-09 10:01:11
-
📌 現在実行中のプロセスに関する追加情報を追跡する必要があります。オペレーティングシステムは、ブロックされたプロセスを何らかの方法で追跡する必要があります。 ^30179184-9-7939-7981
- ⏱ 2021-11-09 10:01:18
-
📌 プロセスが停止すると、そのレジスタはこのメモリ位置に保存されます。これらのレジスタを復元することで(それらの値を実際の物理レジスタに戻す)、オペレーティングシステムはそのプロセスを再開できます。 ^30179184-9-8217-8285
- ⏱ 2021-11-09 10:01:40
-
📌 これは比較的単純なものですが、同時に複数のプログラムを実行できるオペレーティングシステムは、システム内で実行中のすべてのプログラムを追跡するために、同様の構造を持つ必要があります。時には、人々はプロセスに関する情報を保存する個々の構造をプロセス制御ブロック(Process Control Block、PCB)と呼びます。これは、各プロセスの情報を含む C 構造について話す方法の 1 つです。 ^30179184-9-10235-10375
- ⏱ 2021-11-09 10:02:23
-
📌 シミュレーションジョブはシミュレーターの形で現れます。 ^30179184-9-12159-12172
- ⏱ 2021-11-09 10:05:10
第 5 章 挿話:プロセス API#
-
📌 fork () と exec () を分離することは、UNIX シェルを構築する際に非常に便利です。なぜなら、これによりシェルは fork の後、exec の前にコードを実行する機会を得るからです。このコードは新しいプログラムを実行する前に環境を変更することができ、一連の興味深い機能を簡単に実現できます。 ^30179184-10-7408-7515
- ⏱ 2021-11-09 10:06:46
-
📌 p1.c で実際に何が起こったのかを詳しく理解しましょう。 ^30179184-10-2186-2208
- ⏱ 2021-11-09 10:08:55
-
📌 UNIX システムは、新しいプロセスを作成する非常に興味深い方法を採用しています。それは、fork () と exec () という一対のシステムコールを通じてです。 ^30179184-10-631-679
- ⏱ 2021-11-09 10:09:06
第 6 章 メカニズム:制限された直接実行#
-
📌 1 つのプロセスを一定時間実行し、その後別のプロセスを実行するというように交互に行います。このようにして CPU を時間共有(time sharing)することで、仮想化が実現されます。 ^30179184-11-456-519
- ⏱ 2021-11-09 10:09:44
-
📌 最初のポイントはパフォーマンスです:システムのオーバーヘッドを増やさずに仮想化を実現するにはどうすればよいか?2 つ目は制御です:プロセスを効果的に実行しながら、CPU の制御を保持するにはどうすればよいか?制御はオペレーティングシステムにとって特に重要です。なぜなら、オペレーティングシステムはリソース管理を担当しているからです。制御がなければ、プロセスは単に無制限に実行され、マシンを占有したり、権限のない情報にアクセスしたりすることができます。したがって、制御を保持しながら高性能を得ることは、オペレーティングシステムを構築する際の主要な課題の 1 つです。 ^30179184-11-570-727
- ⏱ 2021-11-09 10:09:55
第 15 章 メカニズム:アドレス変換#
- 📌 1.シード 1、2、3 を使用して実行し、プロセスが生成する各仮想アドレスが境界内にあるか境界外にあるかを計算します。境界内であれば、アドレス変換を計算します。2.次のフラグを使用して実行します:-s 0 -n 10。すべての生成された仮想アドレスが境界内にあることを確認するために、-l(境界レジスタ)をどのような値に設定すればよいですか?3.次のフラグを使用して実行します:-s 1 -n 10 -l 100。アドレス空間が物理メモリ内に完全に収まるために、境界を設定できる最大値は何ですか?4.3 番目の問題と同じ操作を実行しますが、より大きなアドレス空間(-a)と物理メモリ(-p)を使用します。5.境界レジスタの値の関数として、ランダムに生成された仮想アドレスのどの部分が有効ですか?図を描き、異なるランダムシードを使用して、制限値を 0 から最大アドレス空間サイズまで設定します。 ^30179184-20-14592
- ⏱ 2021-10-13 09:08:27
第 16 章 セグメンテーション#
-
📌 もし私たちが全アドレス空間を物理メモリに置くなら、スタックとヒープの間のスペースはプロセスによって使用されていないが、依然として実際の物理メモリを占有しています。 ^30179184-21-548-599
- ⏱ 2021-10-13 09:14:00
-
📌 大きなアドレス空間をサポートするにはどうすればよいか ^30179184-21-761-770
- ⏱ 2021-10-13 09:14:04
-
📌 セグメンテーション:一般化された基準 / 境界 ^30179184-21-975-986
- ⏱ 2021-10-13 09:14:08
-
📌 基準と境界レジスタのペアではなく、アドレス空間内の各論理セグメント(segment)に対してペアを与えます。セグメントはアドレス空間内の連続した固定長の領域であり、典型的なアドレス空間には 3 つの論理的に異なるセグメントがあります:コード、スタック、ヒープ。 ^30179184-21-1106-1191
- ⏱ 2021-10-14 12:41:07
第 26 章 並行性:紹介#
- 📌 第 26 章 並行性:紹介 ^30179184-33-350-360
- ⏱ 2022-01-14 09:15:03
第 46 章 分散についての対話#
- 📌 メッセージは失われ、マシンは故障し、ディスクはデータを損傷します。まるで世界全体があなたに対抗しているかのようです! ^30179184-51-1170-1203
- ⏱ 2021-11-09 10:10:42
第 47 章 分散システム#
-
📌 単に 1 台のマシンと対話するのではありません。 ^30179184-52-510-522
- ⏱ 2021-11-09 10:11:50
-
📌 私たちが主に注目しているのは障害(failure)です。 ^30179184-52-670-689
- ⏱ 2021-11-09 10:12:02
-
📌 システムのパフォーマンス(performance)は通常非常に重要です。 ^30179184-52-1471-1493
- ⏱ 2021-11-09 10:12:41
-
📌 障害が焦点となります:通信層は障害をどのように処理すべきですか? ^30179184-52-1824-1842
- ⏱ 2021-11-09 10:13:35
-
📌 パケットロスはネットワークの基本的な現象です。したがって、問題は:パケットロスをどのように処理すべきですか? ^30179184-52-2489-2516
- ⏱ 2021-11-09 10:14:16
-
📌 現代のネットワークの核心原則は、通信は基本的に信頼できないということです。 ^30179184-52-1933-1953
- ⏱ 2021-11-09 10:14:30
-
📌 データパケットは頻繁に失われ、損傷し、目的地に到達しません。 ^30179184-52-1990-2012
- ⏱ 2021-11-09 10:14:34
-
📌 この信頼できない層の良い例は、ほぼすべての現代システムに存在する UDP/IP ネットワークスタックです。 ^30179184-52-2727-2765
- ⏱ 2021-11-09 10:15:39
-
📌 UDP は信頼できない通信層の良い例です。 ^30179184-52-5420-5438
- ⏱ 2021-11-09 10:19:55
-
📌 チェックサムを使用して完全性を確認します。 ^30179184-52-5705-5715
- ⏱ 2021-11-09 10:20:08
-
📌 追加のメカニズムが必要です。これをタイムアウト(timeout)と呼びます。 ^30179184-52-6866-6890
- ⏱ 2021-11-09 10:20:40
-
📌 タイムアウトと再試行の組み合わせにより、一部の人々はこのアプローチをタイムアウト / 再試行(timeout/retry)と呼びます。ネットワークに関わる非常に賢い人々ですね。図 47.4 はその例を示しています。 ^30179184-52-7020-7122
- ⏱ 2021-11-09 10:20:53
-
📌 この例では、失われるのは元のメッセージではなく、確認メッセージです。 ^30179184-52-7165-7187
- ⏱ 2021-11-09 10:21:01
-
📌 したがって、送信者は確認を受け取りますが、メッセージは受信されていないため、上記で述べた一度限りの意味が保証されます。 ^30179184-52-7992-8027
- ⏱ 2021-11-09 10:21:41
-
📌 このメカニズムは順序カウンターと呼ばれます。 ^30179184-52-8195-8206
- ⏱ 2021-11-09 10:21:59
-
📌 メッセージを送信した後、送信者はその値を増加させます(N + 1 に)。 ^30179184-52-8334-8383
- ⏱ 2021-11-09 10:22:42
-
📌 したがって、受信者はそのメッセージを受信したことを知っています。したがって、受信者はそのメッセージを確認しますが、アプリケーションには渡しません。このようにして、順序カウンターは重複を回避できます。 ^30179184-52-8754-8815
- ⏱ 2021-11-09 10:23:06
-
📌 一般的な信頼できる通信層は TCP/IP、または略して TCP と呼ばれます。 ^30179184-52-8845-8869
- ⏱ 2021-11-09 10:23:09
-
📌 分散共有メモリ(Distributed Shared Memory、DSM)システムは、異なるマシン上のプロセスが大きな仮想アドレス空間を共有できるようにします [LH89] ^30179184-52-9727-9796
- ⏱ 2021-11-09 10:23:46
-
📌 たとえば、最初のタイムアウトの後、クライアントはそのタイムアウト値を元の値の 2 倍に増加させるかもしれません。この指数バックオフ(exponential back-off)スキームは、初期の Aloha ネットワークで実施され、初期のイーサネット [A70] で採用され、過剰な再送信によるリソースの過負荷を回避します。堅牢なシステムはこのような過負荷を避けるよう努めます。 ^30179184-52-9504-9639
- ⏱ 2021-11-09 10:24:08
-
📌 もう 1 つの問題はパフォーマンスです。 ^30179184-52-10271-10279
- ⏱ 2021-11-09 10:25:11
-
📌 リモートプロシージャコール(RPC) ^30179184-52-10496-10506
- ⏱ 2021-11-09 10:25:57
-
📌 主な抽象はリモートプロシージャコール(Remote Procedure Call)、または略して RPC です [BN84]。 ^30179184-52-10591-10757
- ⏱ 2021-11-09 10:26:11
-
📌 残りは RPC システムが処理します。RPC システムは通常 2 つの部分から構成されます:スタブ生成器(stub generator、時にはプロトコルコンパイラと呼ばれる)とランタイムライブラリ(run-time library)。次に、これらの部分について詳しく説明します。 ^30179184-52-10882-10994
- ⏱ 2021-11-09 10:26:30
-
📌 並行性のサーバーの組織方法 ^30179184-52-13277-13288
- ⏱ 2021-11-09 10:29:00
-
📌 もし RPC 呼び出しがブロックされる(たとえば、I/O で)、サーバーリソースが浪費されます。したがって、ほとんどのサーバーは何らかの並行方式で構築されています。一般的な組織方法はスレッドプール(thread pool)です。 ^30179184-52-13342-13417
- ⏱ 2021-11-09 10:29:16
-
📌 スレッドは他のリクエストを受け取り続け、他の作業スレッドに送信することがあります。 ^30179184-52-13488-13514
- ⏱ 2021-11-09 10:29:27
-
📌 現在のインターネットプロトコルが提供するホスト名とポート番号 ^30179184-52-13872-13889
- ⏱ 2021-11-09 10:37:17
-
📌 信頼できる通信層の上に RPC を構築すると、パフォーマンスの非効率を引き起こす可能性があります。 ^30179184-52-14371-14395
- ⏱ 2021-11-09 10:37:43
-
📌 信頼できる通信層はどのように機能するか:確認とタイムアウト / 再試行 ^30179184-52-14404-14423
- ⏱ 2021-11-09 10:37:48
-
📌 多くの RPC パッケージは信頼できない通信層の上に構築されています。たとえば UDP です。 ^30179184-52-14580-14608
- ⏱ 2021-11-09 10:37:59
-
📌 47.6 まとめ私たちは新しいテーマ、分散システムとその主要な問題を紹介しました:障害を処理する方法は現在の一般的なイベントです。Google 内部で言われているように、あなたが自分のデスクトップを持っているとき、障害はまれです。しかし、数千台のマシンを持つデータセンターを持つと、障害は常に発生します。すべての分散システムの鍵は、障害を処理する方法です。また、通信はすべての分散システムの核心であることもわかりました。リモートプロシージャコール(RPC)では、この通信の一般的な抽象が見られ、クライアントがサーバー上でリモート呼び出しを行うことを可能にします。RPC パッケージは、タイムアウト / 再試行や確認などのすべての詳細を処理し、ローカルプロシージャコールに非常に似たサービスを提供します。RPC パッケージを真に理解する最良の方法は、もちろん、実際に使用することです。Sun の RPC システムは、rpcgen というスタブコンパイラを使用しており、非常に一般的で、今日の多くのシステムで利用可能です。試してみて、すべてのこれらの問題が実際にどのように機能するかを見てください。参考文献 [A70]「The ALOHA System — Another Alternative for Computer Communications」ノーマン・アブラモソン 1970 年秋の合同コンピュータ会議 ALOHA ネットワークは、ネットワークにおけるいくつかの基本的な概念を開発し、指数バックオフや再送信を含み、これらは共有バスイーサネットネットワーク通信の基礎となっています。[BN84]「Implementing Remote Procedure Calls」アンドリュー・D・ビレル、ブルース・ジェイ・ネルソン ACM TOCS、ボリューム 2:1、1984 年 2 月基礎 RPC システム、他のすべての理論はこれに基づいています。はい、それは私たちが Xerox PARC の友人たちの別の画期的な努力の結果です。 ^30179184-52-16865
- ⏱ 2021-11-09 10:38:39
-
📌 信頼できるファイル転送を構築するには、エンドツーエンドの信頼性チェックを含める必要があります。たとえば、転送が完了した後、受信者のディスク上のファイルを読み取り、チェックサムを計算し、そのチェックサムを送信者のファイルのチェックサムと比較します。この基準に従った推論は、時には、低いレイヤーが追加の機能を提供することでシステムのパフォーマンスを向上させたり、他の方法でシステムを最適化したりできることを示唆しています。したがって、システム内の低いレイヤーのこのメカニズムを排除すべきではありません。実際、このメカニズムの実用性を注意深く考慮し、それが最終的にシステム全体またはアプリケーションにどのように影響するかを考慮する必要があります。RPC パッケージは通常、そのメッセージフォーマットで明確に定義されたバイト順序を提供し、この問題を処理します。Sun の RPC パッケージでは、XDR(eXternal Data Representation、外部データ表現)層がこの機能を提供します。メッセージを送信または受信するコンピュータが XDR のバイト順序に一致する場合、メッセージは期待通りに送信および受信されます。 ^30179184-54-14643
- ⏱ 2022-01-14 09:14:39
第 48 章 Sun のネットワークファイルシステム(NFS)#
- 📌 分散クライアント / サーバーコンピューティングの最初の使用の 1 つは、分散ファイルシステムの分野です。この環境では、多くのクライアントマシンと 1 つのサーバー(またはいくつか)があります。サーバーはそのディスクにデータを保存し、クライアントは構造化されたプロトコルメッセージを介してデータを要求します。図 48.1 は基本的な設定を示しています。[挿絵] 図 48.1 一般的なクライアント / サーバーシステム図からわかるように、サーバーにはディスクがあり、メッセージを送信するクライアントはネットワークを介してサーバーのディスク上のディレクトリやファイルにアクセスします。なぜこのような手間をかけるのですか?(つまり、なぜクライアントが自分のローカルディスクを使わないのですか?)この設定は、クライアント間でデータを簡単に共有(sharing)できるようにします。したがって、あなたが 1 台のコンピュータでファイルにアクセスした場合(クライアント 0)、次に別のコンピュータ(クライアント 2)を使用すると、同じファイルシステムビューを持つことになります。これにより、異なるマシンでデータを自然に共有できます。2 つ目の利点は集中管理(centralized administration)です。たとえば、ファイルのバックアップは少数のサーバーマシンを介して行うことができ、多くのクライアントを介して行う必要はありません。もう 1 つの利点はセキュリティ(security)です。すべてのサーバーを施錠されたサーバールームに置くことができます。重要な問題:分散ファイルシステムをどのように構築するか?分散ファイルシステムをどのように構築しますか?考慮すべき重要な側面は何ですか?どこで間違いやすいですか?既存のシステムから何を学べますか? ^30179184-53-359
- ⏱ 2021-11-09 10:40:01
読書ノート#
第 4 章 抽象化:プロセス#
ハイライトコメント#
- 📌 現時点では、これが良い決定かどうかは不明です。 ^7265636-7uG78TXby
- 💭 優先順位に基づいて割り当てることができ、即座に切り替えると頻繁なコンテキストスイッチが発生し、効率が低下する可能性があります。
- ⏱ 2021-11-09 09:28:51
ハイライトコメント#
- 📌 プロセスがディスクに I/O リクエストを発行すると、それはブロックされるため、他のプロセスがプロセッサを使用できます。 ^7265636-7uG6WqgFc
- 💭 スレッドのブロッキング
- ⏱ 2021-11-09 09:25:47
第 16 章 セグメンテーション#
ハイライトコメント#
- 📌 セグメンテーション(segmentation)の概念が生まれました。セグメンテーションは新しい概念ではなく、1960 年代初頭にさかのぼることができます [H61, G62]。このアイデアはシンプルで、MMU に 1 つ以上の基準と境界レジスタのペアを導入するのではなく、アドレス空間内の各論理セグメント(segment)に対してペアを与えます。セグメントはアドレス空間内の連続した固定長の領域であり、典型的なアドレス空間には 3 つの論理的に異なるセグメントがあります:コード、スタック、ヒープ。セグメンテーションのメカニズムにより、オペレーティングシステムは異なるセグメントを異なる物理メモリ領域に配置できるため、仮想アドレス空間内の未使用部分が物理メモリを占有するのを避けることができます。 ^7265636-7u2LJkG3F
- 💭 なるほど
- ⏱ 2021-10-14 12:41:45
第 46 章 分散についての対話#
ハイライトコメント#
- 📌 再送信、再試行、さまざまな他のテクニック。人々は時間の経過とともに、障害を検出し、障害から回復するためのこれらのテクニックを開発しました。 ^7265636-7uG9Uidei
- 💭 分散
- ⏱ 2021-11-09 10:11:04
第 47 章 分散システム#
ハイライトコメント#
- 📌 最初の(最適な)場合、ページはすでにマシン上のローカルページであるため、データを迅速に取得できます。2 番目のケースでは、ページは現在他のマシンにあります。ページフォールトが発生し、ページフォールトハンドラは他のコンピュータにメッセージを送信してページを取得し、要求されたプロセスのページテーブルにロードし、その後実行を続けます。 ^7265636-7uGaS0mwP
- 💭 実用的ではない。安定性とパフォーマンスの問題
- ⏱ 2021-11-09 10:25:46
ハイライトコメント#
- 📌 受信者が重複したメッセージ転送を検出できるようにするために、送信者は各メッセージを何らかのユニークな方法で識別し、受信者は各メッセージをすでに見たかどうかを追跡する必要があります。 ^7265636-7uGaER0eS
- 💭 なるほど、シーケンス番号はこうして生まれるのですね。確認が失われる可能性があります。
- ⏱ 2021-11-09 10:22:32
ハイライトコメント#
- 📌 受信者が重複したメッセージ転送を検出できるようにするために、送信者は各メッセージを何らかのユニークな方法で識別し、受信者は各メッセージをすでに見たかどうかを追跡する必要があります。 ^7265636-7uGaC1Akt
- 💭 シーケンス番号
- ⏱ 2021-11-09 10:21:50