Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ふつうのLinuxプログラミング-プロセスとハードウェア

sksat
June 09, 2020

 ふつうのLinuxプログラミング-プロセスとハードウェア

研究会の輪講でやったやつ.多少がんばった&評価も高めだったし使いまわせそうなので上げておく.

sksat

June 09, 2020
Tweet

More Decks by sksat

Other Decks in Programming

Transcript

  1. おさらい:デジタルデータの表現 ・ビット(bit):情報の最小単位 ・0/1, yes/no, ON/OFF, +/-, N/S ・2進数の1桁 ・バイト(byte):8bit ・電子計算機ではデータをだいたい

    1〜数バイト単位で処理 ※実は1byte != 8bit.まあほとんどは8bitだが...(明示的に8bitだと言う場合はオクテット)
  2. メモリの読み書き 0xaf 0xbe 0xad 0xde 〜 0x0000 0x0001 0x0002 0x0003

    0x0004 0xffff 0xfffe 0xfffd 0xfffc 0xfffb CPU \addr=0x002のデータが1byteホシイ/ 0xab \addr=0xfffeに0xabを入れたい/ 0xad 0xab
  3. メモリのアクセス速度 ・メモリ:数十〜数百サイクル ・昔はCPUの動作速度が大したことなかったのでなんとかなった ・今:CPU「俺の”速さ”についてこられるかな?」 ・int a = 1 + 2; ← a,

    1, 2がレジスタかメモリ上かで数十〜数百倍速度が変わってしまう!? ・コンパイラの最適化でできる限りレジスタが使われるようになってる ・めでたしめでたし・・・とはいかない ・思い出すシリーズ:レジスタはクソ小さい ・じゃあどうすんねん
  4. キャッシュメモリのしくみ ・発想:アクセスしそうなデータがいいかんじに キャッシュに載っているとうれしい! メモリ キャッシュメモリ addr=0x01, data=0xbe addr=0x03, data=0xde addr=0x05,

    data=0xba addr=0x09, data=0x1f 0x00: 0xef 0x01: 0xbe 0x02: 0xad 0x03: 0xde 0x04: 0xbe 0x05: 0xba 0x06: 0xfe 0x07: 0xca 0x08: 0x8b 0x09: 0x1f 0x0a: 0x00 addr=0x0a, data=0x00
  5. MMIO ・Memory Mapped I/O ・メモリとデバイスが繋がっている (!?) ・マイコンだとよくある ・PCだとVRAM(Video RAM) ・「(x=10,

    y=20)を紫に」とかを入出力命令でやってたら遅すぎる ・メモリの一部の領域がディスプレイと接続 VRAM 0xA0000 0xAFFFF
  6. 機械語 ・CPUはバカ ・int a = 1 + 2; ← こんなの難しすぎてわからん ・面接官「あなたは何ができるんですか?」

    ・CPU「計算がとても速くできるくらいです ...」 ・思い出すシリーズ:電子計算機 ・機械語:CPUが理解できる「言葉」 ・いくつか[要出典]の命令 ?
  7. 機械語の種類 ・算術命令:add, sub, mul, divなど ・add eax, 0x05:EAXレジスタの値に5を足す ・論理演算命令:and, or,

    not, xorなど ・ビットシフト ・メモリの読み書き ・入出力命令 ・ジャンプ命令:実行位置を変更
  8. プログラム実行のしくみ add r0, 5 sub r1, [0x20] inc r1 add

    r0, r1 jmp -2 実行中 PC: 0x01 r0: 0x05 r1: 0x00 memory[0x20] = 0x03 メモリ
  9. プログラム実行のしくみ add r0, 5 sub r1, [0x20] inc r1 add

    r0, r1 jmp -2 実行中 PC: 0x02 r0: 0x02 r1: 0x00 memory[0x20] = 0x03 メモリ
  10. プログラム実行のしくみ add r0, 5 sub r1, [0x20] inc r1 add

    r0, r1 jmp -2 実行中 PC: 0x03 r0: 0x02 r1: 0x01 memory[0x20] = 0x03 メモリ
  11. プログラム実行のしくみ add r0, 5 sub r1, [0x20] inc r1 add

    r0, r1 jmp -2 実行中 PC: 0x04 r0: 0x03 r1: 0x01 memory[0x20] = 0x03 メモリ
  12. プログラム実行のしくみ add r0, 5 sub r1, [0x20] inc r1 add

    r0, r1 jmp -2 実行中 PC: 0x02 r0: 0x03 r1: 0x01 memory[0x20] = 0x03 メモリ
  13. プログラム実行のしくみ add r0, 5 sub r1, [0x20] inc r1 add

    r0, r1 jmp -2 実行中 PC: 0x03 r0: 0x03 r1: 0x02 memory[0x20] = 0x03 メモリ
  14. 同時に動いているとでも?それは残像だ ・「時分割」処理 ・短い時間で区切って実行タスクを切り替える ・適度に高速に切り替えられれば人間からは同時に動いているように見える ・TSS:Time Shareing System CPU1 時間→ 端

    末 ゲ | ム ブ ラ ウ ザ カ | ネ ル ゲ | ム ブ ラ ウ ザ 端 末 カ | ネ ル ゲ | ム 端 末 カ | ネ ル ゲ | ム ブ ラ ウ ザ ゲ | ム 端 末 ゲ | ム
  15. いろいろなmalloc ・glibc malloc: ふつうこれ ・K&R malloc: いにしえ ・dlmalloc: 移植性が高い(自作OSでお世話になる) ・jemalloc:

    FreeBSDのlibc,マルチコア環境での性能, Facebook ・tcmalloc: Google ・mimalloc: Microsoft
  16. プログラムができるまで コンピュータ黎明期:機械語を書けばええ(パンチカード,コアロープメモリ, ...) いま:int main(int argc, char **argv){ printf(“hello, world!”);

    return 0; } ・ソースコード(人間が理解できるもの) → 機械語 ・コンパイル型言語:コンパイラで事前に機械語にしておく ・インタプリタ型言語:インタプリタが解釈しながら実行 ・C/C++はコンパイル型言語 ・C/C++コンパイラ:gcc, clang, icc, aocc, ...
  17. プリプロセス ・#から始まるアレを処理する アレ:プリプロセッサディレクティブ マクロとも ・基本的に単純な(ソースコードの)書き換え ・#define -> 値に書き換えられる ・#include -> ファイルの中身がそのまま展開される

    ・gcc -E a.c / cpp a.c でプリプロセスだけできる ・定数/関数の定義 ← 毎回同じものを定義するのはめんどい → ヘッダとしてまとめて,プリプロセス時にそのまま展開してくれればいい → #include Linux「えっ,マクロで関数が作れるのか.使いまくったろ」  C++「templateだいすき!ヘッダに実装を書くプラよ〜」 ctags「ア゜」 C++20「C++の最新の妹です.兄が迷惑をおかけしました. moduleです.STLはまだです.」
  18. プログラムができるまで:まとめ C ソ | ス コ | ド ア セン

    ブリ ソ | ス コ | ド Cコンパイラ アセンブラ オ ブ ジェ クト ファ イ ル リンカ コンパイル 元のCソースコード プ リ プ ロ セ ス アセンブル C ソ | ス コ | ド ア セン ブリ ソ | ス コ | ド Cコンパイラ アセンブラ オ ブ ジェ クト ファ イ ル コンパイル アセンブル 静的ライブラリ リンク 実 行 バ イ ナ リ フ ァ イ ル ローダ 動的リンク プ ロ セ ス イ メ | ジ 動的ライブラリ これはメモリ上
  19. プログラムができるまで:まとめ C ソ | ス コ | ド ア セン

    ブリ ソ | ス コ | ド Cコンパイラ アセンブラ オ ブ ジェ クト ファ イ ル リンカ コンパイル 元のCソースコード プ リ プ ロ セ ス アセンブル C ソ | ス コ | ド ア セン ブリ ソ | ス コ | ド Cコンパイラ アセンブラ オ ブ ジェ クト ファ イ ル コンパイル アセンブル 静的ライブラリ リンク 実 行 バ イ ナ リ フ ァ イ ル ローダ 動的リンク プ ロ セ ス イ メ | ジ 動的ライブラリ これはメモリ上 広義での「コンパイル」