目的
C言語でアプリを開発することではない。
Linux・nginx・PHP・MariaDB・AWSなどが
なぜそのように動くのか
を理解することが目的。
なぜC言語を学ぶのか
Linuxカーネル
nginx
PHP
MariaDB
OpenSSL
Git
Redis
これらの多くはC言語で書かれている。
つまり、
WordPressで発生しているCPU使用率やメモリ使用量は、
最終的にはC言語の処理になる。
学ぶべき順番
電子
↓
CPU
↓
機械語
↓
C言語
↓
Linux
↓
nginx
↓
PHP
↓
WordPress
第1章 C言語とは
理解すること
- C言語はCPUに近い言語
- コンパイルとは何か
- 実行ファイルとは何か
理解できるようになること
main()
↓
コンパイル
↓
機械語
↓
CPU実行
第2章 メモリ
最重要。
理解すること
- RAM
- アドレス
- バイト
- int
- char
- 配列
イメージ
メモリ
0x1000
↓
10
0x1004
↓
20
CPUは
「アドレス」
を使って読む。
第3章 ポインタ
サーバーエンジニアが最初につまずく場所。
しかし一番重要。
理解すること
値
ではなく
住所
例えば
int a = 10;
int *p = &a;
ここで
a
↓
10
ではなく
a
↓
0x1000
という考え方になる。
第4章 関数
printf()
malloc()
free()
fork()
open()
など
Linuxも関数の集まり。
第5章 構造体
Linuxでは超重要。
例えば
struct process
のように
プロセス情報をまとめる。
nginxもMariaDBも大量に使う。
第6章 ポインタと構造体
ここまで理解すると
Linuxソースコードが読めるようになる。
第7章 malloc()
メモリ確保。
malloc()
↓
RAMを借りる
free()
↓
返す。
第8章 スタックとヒープ
超重要。
Stack
↓
関数呼び出し
Heap
↓
malloc()
PHP-FPMやMariaDBでも重要。
第9章 システムコール
Linuxへお願いする命令。
例えば
read()
write()
open()
close()
fork()
exec()
これで
「ファイルを読む」
「プロセスを作る」
などを行う。
第10章 プロセス
fork()
↓
子プロセス
nginx
PHP-FPM
MariaDB
全部これ。
第11章 スレッド
pthread
CPUコアとの関係が分かる。
第12章 ファイル
Linuxでは
全部ファイル
という考え方。
ソケットも
パイプも
デバイスも。
第13章 ソケット
HTTP通信の正体。
socket()
bind()
listen()
accept()
nginxが毎秒何万回も呼んでいる。
第14章 epoll()
nginx最大の特徴。
epoll_wait()
これがあるから
何万接続も処理できる。
第15章 まとめ
最終的に
WordPress
↓
PHP
↓
C言語
↓
Linux API
↓
CPU命令
↓
CPU
↓
電子
まで頭の中でつながるようになる。
サーバーエンジニアとして最優先で理解したいもの
★★★★★
- メモリ
- ポインタ
- スタック
- ヒープ
- プロセス
- システムコール
★★★★☆
- 構造体
- ソケット
- epoll
- fork
- exec
★★★☆☆
- ビット演算
- マクロ
- プリプロセッサ
- Makefile
★★☆☆☆
- GUI
- ゲーム開発
- 数値計算
(サーバーエンジニアでは優先度は低い)
最終目標
以下の流れを頭の中で説明できるようになる。
ブラウザ
↓
HTTP
↓
nginx
↓
socket()
↓
epoll()
↓
PHP-FPM
↓
fork()
↓
PHP
↓
MariaDB
↓
read()
↓
CPU
↓
RAM
↓
HTML生成
↓
ブラウザへ返却
この流れを理解すると、CPU・メモリ・負荷・ボトルネック・キャッシュ・インスタンスタイプ選定まで、すべてが一本の線で理解できるようになる。