メインコンテンツまでスキップ

hardware

Overview

ハードウェア関連をまとめたセクション。

CPUとGPUの違い

参考URL

GPU

GPUは、特定の3Dレンダリング・タスクの加速化のための専門的ASICとして開発された

内蔵グラフィックスとは

内蔵または共有グラフィックスはCPUと同じチップに組み込まれている。
CPUによっては専用グラフィックス、ディスクリート・グラフィックスに依存するのではなくGPUを内蔵しているものもあります。 また、IGPまたは統合グラフィックス・プロセッサーとも呼ばれ、CPUとメモリーを共有します。


静的領域

グローバル変数はプログラムの開始から終了までずっと有効な変数のためずっとメモリ上に割り当てられている必要がある プログラム開始時に割り当てられて終了時に開放されればよいため、グローバル変数のメモリ割当・解放はコンパイラによって自動的に行われる。 このときにグローバル変数が配置されるメモリ領域を静的領域という。

スタック領域

ローカル変数はスコープ範囲内で有効なため、スコープの始まりでメモリを確保しスコープの終わりでメモリを解放すれば十分。 ローカル変数の割当と解放もコンパイラによって自動的に行われる。このときに配置さえるメモリ領域をスタック領域という。

ヒープ領域

プログラムを設計する上で、何らかの情報をスコープの範囲を超えて扱いたいことがある
このような場合に利用するのがヒープ領域

ヒープ領域は柔軟に使える分、プログラマが責任を持って割り当て・解放を行わなければなりません。 また、ヒープ領域はポインタを介して読み書きを行う必要があります。 ヒープ領域はメモリを有効活用したい場合のためのものです。 メモリ有効活用する必要のない場合は、予めグローバル変数として必要な分だけメモリを確保しておけば十分なことが多いです。


標準入力と標準出力

コマンドは必要に応じて何らかのデータを受け取り、処理をして結果を出力する。 とくに何も指定していない場合、入力はキーボード, 出力は画面となる。これをそれぞれ標準入力標準出力という。

  • パイプ dmesg | more はdmesgコマンドの標準出力を、moreコマンドの標準入力につなげている
  • リダイレクト 標準出力を画面ではなく別のモノに向けるのがリダイレクトで、「>」という記号で表します。リダイレクト先は、通常はファイルですが、プリンターなどに送ることも可能です。

ファイルディスクリプター(FD)

ファイルへの通り道に割り振られる番号で、ファイルを識別するための目印 なおUNIX系(Linuxとか)ではファイル以外もファイルとして扱われる。


NIC(ネットワークインターフェースカード): Network Interface Card

パソコンの部品 LANケーブルを挿す穴がくっついている。


0.0.0.0

参考URL

ローカルマシン上のすべてのIPv4アドレスのこと。 仮想環境(Docker)で起動したRailsはlocalhostのipアドレス 127.0.0.1 でアクセスできない。
そのため仮想外部からアクセスできるようにipを 0.0.0.0 に紐付けする必要がある。

前提として マシンというのは複数のネットワークインターフェースを持っている(つまりは複数のIPアドレスを持っている) ifconfig でネットワークインターフェースを見ることができる。 grepで狭めた場合

$ ifconfig | grep "inet"
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet6 fe80::cc17:43ff:fe09:e1c3%anpi0 prefixlen 64 scopeid 0x4
inet6 fe80::cc17:43ff:fe09:e1c4%anpi1 prefixlen 64 scopeid 0x5
inet6 fe80::cbf:271e:5f59:bcc8%en0 prefixlen 64 secured scopeid 0xb
inet 192.168.41.129 netmask 0xfffffe00 broadcast 192.168.41.255
inet6 fe80::489a:4ff:fe60:9744%awdl0 prefixlen 64 scopeid 0xc
inet6 fe80::489a:4ff:fe60:9744%llw0 prefixlen 64 scopeid 0xd
inet6 fe80::1576:a19c:489f:4f7%utun0 prefixlen 64 scopeid 0x10
inet6 fe80::8cb0:20f5:91f6:815b%utun1 prefixlen 64 scopeid 0x11
inet6 fe80::ce81:b1c:bd2c:69e%utun2 prefixlen 64 scopeid 0x12
inet6 fe80::1e0c:7f5:3e27:321d%utun3 prefixlen 64 scopeid 0x13
inet6 fe80::b552:fea9:c144:f6c9%utun4 prefixlen 64 scopeid 0x14
inet6 fe80::b47a:b5be:25ac:5b6%utun5 prefixlen 64 scopeid 0x17
inet6 fe80::fc09:e8a2:beb6:2447%utun6 prefixlen 64 scopeid 0x18

0.0.0.0のipアドレスは表示されたipアドレスすべてを表している。

UNIXドメインソケットとソケット

参考URLs

ルートパーティション

ルートディレクトリを含むディスクパーティションを指すUNIX用語 UNIXでは、ルートパーティション以外のパーティションは、ルートパーティション(またはそこにマウントされたパーティション)のどこかにマウントされることで、ファイルシステムからアクセス可能になる。

マイコン

参考URL

Ephemeralポート

Ephemeralポートとは、PCがサーバーにアクセスするときに一時的に利用するポートのことです。
mac OSだと49152―65535、Amazon Linuxだと32768―61000といったようにOSの種類やバージョンによって異なる。
すべてのポートに対応させるためには、ポート範囲として1024―65535を設定しておけば問題ないでしょう。

マウントの概念

ファイルシステムをマウントするというのは、そのファイルシステムをオペレーティングシステムがアクセスできるようにするプロセスを指す。
マウントされたファイルシステムは、ディレクトリ構造の一部として組み込まれ、ファイルやフォルダーへのアクセスが可能になる。

オペレーティングシステムは、ハードドライブ、SSD、USBドライブ、またはネットワーク上のストレージなど、異なるストレージデバイスに保存されているデータにアクセスする必要があります。これらのストレージデバイスには、それぞれファイルシステムがフォーマットされており、データの格納と整理のためのルールが定められています。

オペレーティングシステムがデバイス上のファイルシステムにアクセスするには、そのファイルシステムをマウントする必要があります。マウントとは、特定のファイルシステムをオペレーティングシステムのディレクトリツリーに組み込む作業のことを指します。マウントポイント(ディレクトリ)を指定してファイルシステムをマウントすると、そのディレクトリを通じてマウントされたファイルシステム内のデータにアクセスできるようになります。

マウントの例

たとえば、LinuxやUNIX系のオペレーティングシステムでは、mount コマンドを使ってファイルシステムをマウントします。以下は、/dev/sdb1 というデバイス上のファイルシステムを /mnt/data ディレクトリにマウントする例です。

mount /dev/sdb1 /mnt/data

このコマンドを実行すると、/dev/sdb1 デバイス上のファイルシステムが /mnt/data ディレクトリにマウントされ、このディレクトリを通じてファイルシステムにアクセスできるようになります。

マウントは、一時的に行うことも、システムの起動時に自動的に行われるよう設定することもできます。自動マウントの設定は、Linuxでは /etc/fstab ファイルに記述されます。

ファイルシステムのマウントは、データへのアクセス方法を提供し、複数のストレージデバイスをオペレーティングシステムがシームレスに扱えるようにするための重要なプロセスです。

CPUは単純な処理が得意

回路をシンプルに保つため、CPUは足し算しかできない。
引き算・掛け算・割り算ができるのはその仕組みが備わっているから。

では引き算の概念がないものに 5-3 を行わせたい場合は 5+(-3) という計算ができれば足し算と同じ結果を得ることができる。
つまり引き算を知らなくても「負の値」を表現できれば足し算の回路だけで両方できるようになる。

2進数

各ビットの2のべき乗。

ビット位置2進数のビット10進数の値
70128
6064
5132
4016
318
214
102
001

PCでの負の値を表現する方法

コンピューターでは負数を扱うために「2の歩数表現」を使用する。
補数を用いて表現する。
2進数では「1の補数」と「2の補数」という2つの補数を使う。
このことからコンピューターは負の数を表すのに2の補数を使う。

2の補数は次の構文で簡単に求められる。
Image from Gyazo

2の補数表現で負数を表す理由

負数を2の補数表現で表す場合、すべてのビットが1であるnビットの2進数が-1を表す理由について説明。

コンピュータでは負数を扱うために「2の補数表現」を使用します。この表現では、次のような手順で負数を得ることができます。

  1. 正数の2進数を表す:まず、正数を2進数で表現します。
  2. ビットを反転する:次に、その2進数の全てのビットを反転します(0は1に、1は0に)。
  3. 1を足す:最後に、反転した数に1を足します。

この操作により、負数を表現します。

すべてのビットが1(111…111)である場合

例として4ビットで考えてみましょう。

  • 4ビットの最大値は0111(+7)です。
  • それを負数にしたいとき、2の補数を使います。

+1の2の補数

まず、+1を2進数で表すと0001です。

  1. ビットを反転する → 1110
  2. 1を足す → 1111

これが-1を表す2の補数になります。

なぜすべてのビットが1は-1なのか

nビットの2の補数表現では、すべてのビットが1(つまり111...111)のとき、それは-1を意味します。この場合、最上位ビットが符号ビットとして働き、負の値を示します。残りのビットがすべて1であることから、これは-1として解釈されます。

数式的な説明

nビットの2の補数で、すべてのビットが1の場合、その値は次の式で表されます。

-(2^n - 1) = -1

例えば、4ビットの場合は次のようになります:

1111 = -(2^4 - 2^0) = -(16 - 1) = -1

よって、すべてのビットが1であるnビットの2進数は、-1を表すことになります。

このように、2の補数表現では、ビットがすべて1であれば-1を意味するという仕組みになっています。

この説明をMarkdownで記述しているので、そのままコピペしてもレイアウトが崩れないと思います。

かけ算や割り算をコンピューターが行う方法

シフト演算を用いて掛け算や割り算を行う。

論理シフト

シフト演算の中で符号を考慮せずに行うシフト操作が論理シフト。

  • 左論理シフト
    • ビット列全体を左にずらすのが左論理シフト。シフト後の数は元の数を2倍したもの
  • 右論理シフト
    • ビット列全体を右にずらす。シフト後の値は元の数を1/2倍したもの
ヒント

1がはみ出したときの各論理シフト。

  • 左論理シフト
    • 演算の結果、そのビット数で表せる範囲を超えてしまったとなる
    • オーバーフローという
  • 右論理シフト
    • 余りがはみ出してくる。

算術シフト

符号を考慮して行うシフト演算が算術シフト。
算術シフトでは先頭の符号ビットを固定にして、それ以降のビットだけを左右にシフトする。

ヒント

符号ビットと異なる数字がはみ出した場合に、オーバーフローを起こす。

3とか7とかの半端な数字で行う計算