技術共有

コンピュータの仕組み(プログラマーのための基礎知識)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. コンピュータ開発の歴史

コンピューティングの必要性は人類の歴史の中で広く普及しており、その発展は一般的なコンピューティング ツールから機械式コンピューター、そして現在の電子コンピューターに至るまでの開発プロセスを経てきました。
人類はコンピューティングを必要としているため、継続的にコンピューターを発明し、改良する必要があります。現在は「電子計算機」の時代であり、より高速、より安定、より小型に発展する傾向にあります。
おすすめの本: 「コンピュータの歴史」

2. フォン・ノイマン建築

ポイント1
最新のコンピューターのほとんどは次の規格に準拠しています。フォン・ノイマン建築
ここに画像の説明を挿入します

  • CPU中央処理装置:算術演算や論理判断を行います。
  • メモリ: 外部メモリと内部メモリに分かれており、データの保存に使用されます (バイナリ ストレージを使用)
  • 入力デバイス: ユーザーがコンピュータにコマンドを与えるために使用するデバイス
  • 出力デバイス: コンピュータが結果をユーザーに報告するために使用するデバイス
    保管スペース用
    ハードディスク>メモリ>CPU
    データアクセス速度について
    CPU>>メモリ>ハードディスク

フォン・ノイマン (コンピューターの父) の紹介

ジョン・フォン・ノイマン(1903年12月28日 - 1957年2月8日)、ハンガリー系アメリカ人の数学者、コンピューター科学者
科学者、物理学者、そして20世紀で最も重要な数学者の一人。フォン・ノイマンはブダペスト大学の数学博士であり、現代のコンピューター、ゲーム理論、核兵器、生物兵器の分野で最も多才な科学者の一人です。現代コンピュータの父」そして「ゲーム理論の父」。
ここに画像の説明を挿入します

3. 基本的な CPU ワークフロー

次に、プロセスを使用して CPU を段階的に構築します。このプロセスを使用して、CPU やメモリなどのコンピュータの主要コンポーネントの動作原理を理解できます。

3.1 論理ゲート

電子スイッチ – メカニカルリレー
ここに画像の説明を挿入します
電子スイッチを使用すると、一見無駄に見える 1 ビット (ビット) の論理演算を実装できますが、少なくとも機能しますよね。
電子スイッチを使用して、本当に有用なロジック コンポーネントを組み合わせる方法について詳しく学びます。
将来の真空管とトランジスタの本質は、同様の仕事を完了することですが、物理原理はより複雑であるため、詳細な説明は省略します。

3.2 ゲート回路

次に、電子スイッチを使用していくつかの有用なコンポーネント、つまり 1 ビットの基本的な論理演算を実現するゲート回路を構築する方法を学びます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.3 算術論理演算ユニット ALU (Arithmetic & Logic Unit)

ALU は、コンピュータの算術演算および論理演算の中核コンポーネントであり、コンピュータの数学的頭脳です。次に、上で構築した論理ゲートを使用して独自の ALU を完成させ、その動作モードを学習して理解します。現代のコンピューター原理の基礎についての理解をさらに深めます。
ここに画像の説明を挿入します

3.3.1 16 進法の理解

ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.3.2 演算器

演算装置は、四則演算などのコンピューター内のすべてのデジタル演算を担当します。もちろん、それ以外のことも行うことができます。次に、これをカバーする 8 ビット加算器 (加算器) の実装方法を説明します。プロセス全体とその他の操作については、これ以上説明しません。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
この時点で、8 ビット加算器を最初から作成しました。もちろん、演算ユニットの演算はこれらよりもはるかに多く、論理ゲートを組み合わせ続けることで、演算ユニットは加算、減算、乗算、除算、さらに多くの算術演算を実行できますが、デモとしては加算器で十分です。実際、乗算器と除算器は加算器や減算器よりも難易度が高いので、興味があればさらに学習してみてください。

3.3.3 ロジックユニット

論理ユニットは主に論理演算を実行するために使用されます。最も基本的な演算は AND、OR、NOT 演算ですが、これらは 1 ビットの数値の比較だけではありません。
ここに画像の説明を挿入します

3.3.4 ALU シンボル

经过我们的努力,通过基本的逻辑门电路,我们⼀步步地做出了⼀个 8 位(bits) ALU,甚至比 Intel 74181 还要强大,Intel 74181 只是⼀个 4 位(bits) ALU(😀)。当然现代的计算机中的 ALU 部件非常强大,复杂度远远超过了我们的想象,32 位 甚至 64 位基本已经普及全球了。但无论如何,再复杂的ALU 也是芯片工程师像我们这样,一层又一层, 一步又一步地将其抽象出来的。ALU 是第⼀次将人类历史上的数学和逻辑学学科有机地结合起来,可以视为人类智慧发展的现代巅峰.
ここに画像の説明を挿入します

3.4 レジスタ(Register)とメモリ(RAM)

ALU だけでは十分ではありません。ALU 用のストレージ コンポーネントを提供することはできません。次に、ゲート回路を使用してストレージの製造について簡単に説明します。ただし、図には明確に示されていませんが、これらのストレージ要件は電源がオンになっている必要があります。つまり、これらのストレージは揮発性 (揮発性) です。
ここに画像の説明を挿入します
途中でいくつかの実装の詳細を非表示にします。最終的な効果は次のとおりです。無効化ラインが設定されている場合、入力は 1 であり、入力が 0 である場合、0 は保存されます。 、書き込みは無効です。
ドアロックを使用して、必要なレジスタとメモリを構築できます。
ここに画像の説明を挿入します
メモリの構築はこれより少し複雑ですが、基本原理は同じです。この方法で構築されたメモリは RAM (ランダム アクセス メモリ) と呼ばれ、任意の場所のデータにアクセスするために O(1) の時間計算量をサポートできます。これは、配列添字のアクセス操作が O(1) であることを意味します。
ハードウェアのサポート。

ここに画像の説明を挿入します

3.5 コントロールユニットCU(コントロールユニット)

ALU とストレージができましたが、これではコンピューターを動作させるにはまだ十分ではありません。ALU にどのような計算を実行するかを指示するコンポーネントが必要です。このコンポーネントがコントロール ユニット (CU) です。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

3.6 CPUのコアパラメータ

ポイント2

3.6.1 コア数

ここに画像の説明を挿入します
上の図のボックスの数はコアの数と考えることができます。図に示されているように、16 コアの CPU です。
初期の CPU は単一のコアを備えていましたが、時代の発展に伴い、CPU の処理速度に対する要求はますます高くなり、より高速に計算できるようにする必要があります。この時点で、古典力学は無効になり、プロセスへの挑戦はますます大きくなります。
このとき、マルチコアという概念が提案されている。

3.6.2 周波数

ここに画像の説明を挿入します

CPU の計算速度は周波数で表され、単純に 1 秒間に実行できる命令の数として理解できます (厳密ではありません)。たとえば、上記の速度は、CPU が 1 秒あたり約 34 億回の計算を行うと理解できます。 。
CPU の周波数はワークロードに応じて動的に変化します。周波数が増加すると、消費電力が増加し、過熱による CPU の焼損を防ぐために、周波数が自動的に低下します。

3.7 CPUが命令を実行する処理(命令)

ポイント3

3.7.1 命令一覧

まず、必要な手順を紹介します。
いわゆる命令、つまりCPUに作業を指示するコマンドは、主にオペレーションコード+オペランドで構成されます。
オペコードは、どのようなアクションが実行されるかを示すために使用され、オペランドは、この命令によって操作されるデータであり、メモリ アドレスやレジスタ番号などが考えられます。
命令自体も数値であり、メモリの特定の領域にバイナリ形式で保存されます。
私たちがプログラミング言語で作成したプログラムは、最終的には「CPU 上で実行されるバイナリ命令」に変換される必要があります。命令は、CPU によって実行されるタスクの基本単位です。
命令も機械語(バイナリ)とアセンブリ言語です。機械語とアセンブリ言語は一対一に対応しています。
異なる CPU は、x86 命令や arm 命令など、マイクロ レベルで異なる命令をサポートするため、互換性の問題が発生します。
ここに画像の説明を挿入します
CPU が実行できる命令は、CPU が最初に設計されたときに規定されていると考えられます。上の図は、いくつかの命令を簡略化して示しています。
8 ビット命令は 2 つの部分に分割できます。
最初の 4 ビットは、命令が何を行うかを示すオペレーション コード (opcode) です。
最後の 4 ビットはオペランド (パラメータと同様)
上の表のレジスタ名 AB は架空のもので、実際の CPU レジスタの名前は、eax、ebx、esp、ebp の形式です。

3.7.2 命令実行の基本プロセス

CPU には「プログラム カウンター」という特別なレジスタがあり (exe がメモリにロードされた後、システムによって自動的に設定されます)、次に命令が実行されるメモリ位置を保存します。命令が実行されると、それに応じて「プログラム カウンタ」の値も更新されます。ジャンプ ステートメントが発生すると、デフォルトでは +1 の自動インクリメント プロセスになります。 as (if、while、for、関数呼び出し...) の場合は、別の値に設定されます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
命令の実行を次の 3 つの段階に分けます。
1) 命令フェッチ。CPU は命令の内容をメモリから CPU に読み取ります (読み取った命令を保存するための特殊レジスタがあります)。
2) 命令を分析し、その機能、対応する関数とオペランドを特定します。
3) 命令の実行
各命令の実行には上記の 3 つのステップを経由する必要があり、タスクを完了するには上記の命令を複数実行する必要があり、たとえば加算処理には上記の 3 つの命令が必要になる場合があり、非常に面倒に思えますが、CPU の計算により実現されます。非常に高速で (上記の操作は 1 秒間に 10 億回以上実行できます)、コンピューターにとってはそれほど時間はかかりません。

4. プログラム言語

4.1 プログラム

いわゆるプログラムは、一連の命令と、この命令セットによって処理されるデータです。狭い意味では、プログラムは通常、ファイルのセットとして私たちに見えます。
プログラム = 命令 + 命令によって処理されるデータ。
ここに画像の説明を挿入します

4.2 初期のプログラミング

ここに画像の説明を挿入します
ここに画像の説明を挿入します
これは以前に広まった興味深い小さな話ですが、もちろん真実ではありません。しかし、初期のコンピューターではプログラミングが本当に必要でした
0と1でプログラムしました(Σ(っ°Д °;)っ)
下の写真は、初期のマイクロコンピューターの 1 つである Altair 8800 コンピューターを示しています。ユーザーはスイッチを制御し、プログラムを少しずつコンピュータに入力する必要があります。
ここに画像の説明を挿入します
すべてのコンピュータ ユーザーがバイナリ プログラミングを使用する必要がある場合、これは敷居が高すぎます。そこでプログラミング言語が登場しました。

4.3 プログラミング言語の開発

プログラミングの効率を向上させるために、まずアセンブリ言語の概念が作成されました。実際、アセンブリ言語と機械語 (つまり命令) は直接 1 対 1 に対応しています。数字の 0 と 1 に対して、人間がそれらを覚えて理解できるようにいくつかの記号が発明されているだけです。表示される内容は LOAD_A、LOAD_B などと似ています。プログラマはプログラミングを完了した後、アセンブラを使用してアセンブリ言語を機械語に翻訳する必要があります。
アセンブリによってプログラマのメモリ コストは削減されますが、それでもプログラムはコンピュータ ハードウェアに関するすべての知識を習得する必要があります。コンピュータ メーカーの数が増加しているため、一度に作成されるプログラムは 1 種類のコンピュータにしか適していないことがよくあります。これでは十分ではないため、ハードウェアの詳細を保護し、プログラマーがより高いレベルでビジネスについて考えることができるようにする、より高度な言語が誕生しました。ここでは C 言語を例に挙げます。プログラマーはプログラムの作成を終えた後、コンパイラーとリンカーを使用してプログラムをアセンブリ言語に変換し、さらにアセンブラーを使用してそれを最終的な機械語に変換する必要があります。
カプセル化のアイデアの助けを借りて、プログラミングを学ぶことがますます簡単になります。ただし、抽象度が高いため、多くのプログラマーはコンピューターをブラックボックスとして認識し、自分のプログラムがどのように動作するかを完全に理解できなくなります。私たちの誰もがそのようなプログラマーにならないことを願っています。
私たちが使用する Java 言語は C 言語よりも少し高度ですが、基本的な抽象原則に大きな違いはないため、ここでは詳しく説明しません。
ここに画像の説明を挿入します
注: 高級言語のステートメントは、多くの場合、完了するための多くの命令に対応します。

5. オペレーティングシステム

ポイント4
オペレーティングシステムとは、コンピュータのリソースを管理するソフトウェアの総称です。現在、一般的なオペレーティング システムには、Windows シリーズ、Unix シリーズ、Linux シリーズ、OSX シリーズ、Android シリーズ、iOS シリーズ、Hongmeng などが含まれます。
異なるシステムで実行されているプログラムは異なります (kpi が異なるため、プログラムには互換性がありません)

5.1 オペレーティングシステムの位置付け

ここに画像の説明を挿入します
オペレーティング システムには 2 つの基本的な機能があります。
1) 時空間アプリケーションによるハードウェアの悪用を防止します。KPI をアプリケーションに提供し、アプリケーションがそれを呼び出してさまざまな機能を実行できるようにします。
2) 複雑で多くの場合広範囲に異なる低レベルのハードウェア デバイスを制御するための、シンプルで一貫したメカニズムをアプリケーションに提供します。

オペレーティング システムは主に次の 2 つのことを行います。
1) さまざまなハードウェア デバイスを管理するコンピュータは、コード スキャナ、医療機器、B-超音波装置などの多くのデバイスにアクセスできます。
2) ソフトウェアに安定した動作環境を提供する。現代のオペレーティング システムでは、複数のプログラムが同時に実行される必要があり、1 つのプログラムにバグが発生しても、他のプログラムに影響を与えないようにする必要があります。 。

6. プロセス/タスク

各アプリケーションが最新のオペレーティング システム上で実行される場合、オペレーティング システムは、あたかもこのプログラムのみがシステム上で実行されており、すべてのハードウェア リソースがこのプログラムによって使用されているかのように抽象化を提供します。この錯覚は、おそらくコンピューター サイエンスで最も重要で成功した概念の 1 つであるプロセスの概念を抽象化することによって実現されます。
プロセスは、オペレーティング システムによる実行中のプログラムの抽象化です。つまり、プロセスは、オペレーティング システム内でのリソース割り当ての基本単位であると同時に、プログラムの実行中のプロセスとみなすことができます。オペレーティングシステムによって。

6.1 プロセスの概念

ポイント5
プロセスとは、コンピューター上で実行されているアプリケーションのことです (アプリケーションについて話すとき、2 つの状態があります。実行されていないときは、ハードディスク上にある exe ファイルです。実行されているときは、exe が実行されます。)がメモリにロードされ、CPU が内部の命令を実行します。
ここに画像の説明を挿入します
プロセスは、オペレーティング システムによるリソース割り当ての基本単位です。

6.2 プロセス管理

ポイント6
システム上には多くのプロセスがあるため、それらを管理する必要があります
1) 記述は構造体/クラスを通じてプロセスのさまざまな属性を表現します (主流のシステムは C/C++ によって実装されます)
2)組織は、上記の複数の構造(記述)をデータ構造で結び、さらに様々な追加、削除、修正、検査を行う・・・。
たとえば、Linux オペレーティング システムでは、「PCB」と呼ばれる構造を使用してプロセス情報を記述します (PCB はプロセス コントロール ブロックの略です)。簡単に言うと、上記の複数の PCB がリンクされたリストを介して結合され、プロセスが作成されます。 exe をクリックしてプログラムを実行します) プロセスの破棄は、接続リストから PCB を削除し、PCB 構造を解放することを意味し、接続リストをたどって対応する情報を順番に表示することを意味します。 。
PCB は多くの属性を含む非常に複雑な構造です。以下でいくつかの重要な情報を学びましょう。
1.PIDプロセス識別子
同時に、PID はマシン上の複数のプロセス間で一意であり、システム内の多くの内部操作は PID を通じて対応するプロセスを見つけます。
ここに画像の説明を挿入します
2. メモリポインタ(セット)
プロセスに依存する命令とデータが保存される領域について説明します。
オペレーティング システムが exe を実行すると、exe 内の命令とデータが読み取られ、メモリ (メモリ アドレス) にロードされます。
側面から見ると、プロセスの実行には特定のメモリ リソースが必要であることがわかります。
3. ファイル記述テーブル(シーケンステーブル/配列)
ハードディスク上のデータに対応して、プロセスによってどのファイルが開かれるかを説明します。
プロセス中にファイルが開かれると、読みやすいように項目がシーケンス テーブルに追加されます。
次の項目は共同してプロセスのスケジュールを決定します。これは私たちの日々の開発に密接に関係しています。
ポイント7
オペレーティング システムのプロセス スケジューリングの鍵時分割多重化
現在のオペレーティング システムはすべて、複数のプロセスを同時に実行できる「マルチタスク システム」です。以前のオペレーティング システムは「シングル タスク システム」と呼ばれ、同時に 1 つのプロセスしか実行できませんでした。
時分割多重の理解:ある瞬間にCPUがプロセス1を実行し、しばらく実行し、CPUがプロセス2を実行し、しばらくしてプロセス3を実行する... CPUの演算速度とスイッチング速度が非常に速いため、肉眼ではわかりませんが、人間から見ると同時実行、つまり「同時実行」に相当します。
並列実行: マルチコア CPU により、各コアおよびコア間で異なるプロセスを微細レベルで同時に実行できるようになりました。
同時実行性または同時実行性は、オペレーティング システム カーネルによって均一にスケジュールされており、プログラマや通常のユーザーには認識できないため、通常、並列処理と同時実行性は総称して「同時実行性」と呼ばれ、対応するプログラミング技術は「同時プログラミング」とも呼ばれます。
4. プロセスステータス
準備完了状態: いつでも命令を実行できるようにプロセスを CPU にスケジュールできます。
ブロックされた状態: プロセスが CPU 上で命令を実行するようにスケジュールできません。プロセスがブロックされる理由は、IO 操作 (ハードディスクの読み取りと書き込み、ネットワーク カードの読み取りと書き込みなど) などの他の操作を実行する必要があるためです。ユーザー入力が必要な場合、プロセスはブロック状態になります)。
上記の 2 つは主な 2 つのプロセス状態です。他にも状態があるため、詳しくは説明しません。
5. プロセスの優先順位
優先順位とは文字通り、処理の順番のことです。
6. プロセスのコンテキスト
タイムシェアリング多重化。プロセスはしばらく実行された後、CPU に転送され、最後の実行結果とともに実行されます。前回の実行の中間結果 (CPU レジスタ内のさまざまな値) は、次回使用するために保存されます。
7. プロセスの会計情報
優先順位のサポートにより、さまざまなプロセスによって消費されるリソースはますます異なってくる可能性があります...
上記の属性は、スケジューリング プロセスの同時実行をサポートするために使用されます。

7. メモリ割り当て⸺メモリ管理(Memory Manage)

オペレーティング システムは、空間モデルを使用してメモリ リソースを割り当てます。異なるプロセスは、互いに干渉することなくメモリの異なる領域を使用します。

8. プロセス間通信

前述したように、プロセスはオペレーティングシステムによるリソース割り当ての最小単位であり、各プロセスはお互いの存在を感じることができません。これは、プロセスという概念を抽象化するというオペレーティングシステムの本来の意図です。プロセス 彼らは互いに「孤立」しています。
ただし、現代のアプリケーションでは、プロセスを単独で実行することはできず、アプリケーションの目的を達成するためにプロセスとプロセスが常に連携する必要があります。プロセス間通信の必要性が歴史的な瞬間に浮上しました。
Java には現在、ネットワーク (ソケット) を介した主要なプロセス間通信方法が 1 つだけあります。
ネットワークは比較的特殊な IPC メカニズムであり、同じホスト上の 2 つのプロセス間の通信をサポートするだけでなく、同じネットワーク内の異なるホスト上のプロセス間の通信もサポートします。