CPUの構造

パッケージ:基盤
ダイ:集積回路、シリコンウェーハ(高純度シリコンから切り出された薄い板、ケイ素(Si))

ダイはバスインターフェイス、キャッシュメモリー、制御装置、演算装置からなる。
バスインターフェイス: 内部バス(CPU内部の回路)、外部バス(CPUとメモリ)
 L アドレスバス、データバス、コントロールバスがある
キャッシュメモリ: バスメモリーから受け取ったデータを一時的に保存
 L 一次キャッシュ、二次キャッシュ、三次キャッシュ
  キャッシュメモリーがあれば、RAMにアクセスしなくて良いため、高速になる。
制御装置: フェッチユニット、デコーダー、レジスタ
 L フェッチユニットは読み込み
 L デコーダーはdecode
演算装置:整数演算ユニット、浮動小数点数演算ユニット、レジスタ
 L 演算ユニットが複数ある場合、マルチコアとなる
 L スレッドはOS(カーネル)が認識するコア数

ピンはCPUとマザーボードとの接続。LGA1151の1151はピンの数
最近のcpuでは発熱量に応じて、自動で電圧を上げて処理速度を高める設計
gpuがcpu内にあるものもある

あら、CPUの中に更にメモリがあるんですね。
Intel Core i7-4785T 2.2GHz Quad-Core SR1QU CPU Processor
Intel Core i5-4570T 2.9GHz SR1CA 5GT/s LGA 1150
Intel Core i7-6900K 20M Broadwell-E 8-Core 3.2 GHz LGA 2011-v3 140W
Threadripper 1950X YD195XA8AEWOF(AMD) 16コア、スレッド32

これはピンが4587個あるってこと?いや、違うな、型番か?LGAの後がピンの数ですね。
こうやってみると、i7-6900Kの8core 3.2GHzの性能が一番良さそうですね。

2.2GHzはクロック周波数。CPUはクロック信号に合わせて処理されるので、クロック周波数が大きい方が、高速になる。

ターミナルから確認できる
mac:ubuntu mac$ system_profiler SPHardwareDataType
Hardware:

Hardware Overview:

Model Name: MacBook Pro
Model Identifier: MacBookPro14,1
Processor Name: Intel Core i5
Processor Speed: 2.3 GHz
Number of Processors: 1
Total Number of Cores: 2
L2 Cache (per Core): 256 KB
L3 Cache: 4 MB
Memory: 8 GB
Boot ROM Version: MBP141.0169.B00
SMC Version (system): 2.43f6
Serial Number (system): **********
Hardware UUID: A7D32EAF-45A2-5CDD-AD44-**********

Number of Processorsが、1CPUで、total number of cores:2なので2コアという意味
AWSのvCPUはスレッドの方。

コア数とスレッド数の確認。logicalcpuの4がカーネルから認識されるコア数ということになる
mac:ubuntu mac$ sysctl -n hw.logicalcpu_max
4
mac:ubuntu mac$ sysctl -n hw.physicalcpu_max
2

カーネルは認識しているコア数(演算ユニット)に割り振って処理をする
CPUメーカーはインテル(シェア80%)、AMD(ゲーム用、キャッシュメモリが多い)

intelのcpu core architectの採用情報を見てみましょう
MS or PhD in CS, EECS, ECE, or related computing discipline
Minimum 10 years of experience with the following skillsets:
o High performance CPU microarchitecture and research
o Substantial experience with CPU simulators, tracing technologies, and performance analysis.
o Quick and efficient software development and debug skills
—-
In this position, you will be involving in the training, design and development of next generation SOC/CPU for wide range of Intel products. Your responsibilities will include some of the following but not limited to:
– Assist design unit owner in Register Transfer Level RTL model functional validation. Use CAD tool extensively to simulate logic behavior and circuit performance and direction of physical design for next generation, deep sub-micron embedded circuit solutions. Verify the circuit behavior against the original simulation model and first silicon.
– Define VLSI Structural Design methodology and developing design flows. Implement structural physical designs, such as synthesis, floor planning, power-grid and clock tree designs, timing budgeting and closure, place and route, RC-extraction and integration. Verify structural physical designs, such as functional equivalency, timing/performance, noise, layout design rules, reliability and power.
– Develop Analog IP on next generation deep submicron process for the Intel’s SOC, perform tasks related to Very-large-scale integration VLSI complementary metal-oxide-semiconductor CMOS IC design, Solid state physics and physical layout. Such tasks may include: Circuit design of high speed clocking related circuits [phase-locked loop PLL, delay-locked loop DLL, bandgap] or high voltage input/output IO [double data rate DDR/LPDDR, General-purpose input/output GPIO, OPIO].
– Responsible for Integration of Third party IPs — Synthesis, functional and/or timing convergence, and pre and post-si debug of IPs developed by various external vendors as well as within the company. Handling of signals crossing power planes and clock domains, industry standard protocols including hardware and software details dealing with Memory LPDDR, storage eMMC, SATA, UFS, peripherals PCIe, USB, and MIPI interfaces in SOC devices. System integration dealing with Si/ Platform/ FW/ MW/ drivers/ OS/ Apps on Android Windows-based tablets and phones.

Intel側はダイの設計をどうするか考えているわけだ。
すると、OSのカーネル側としても、クライアント側のcore数、スレッド数、GHzだけでなく、cpu内のキャッシュメモリ・GPUの設計なども意識して書いていくわけね。

CPU

今更って感じではあるが、やはり、知っておかないといけいないようだ。

CPUの主な役割
– 単純な計算(算術計算、論理演算)、単純な判断、データのコピー、機器の制御

CPUの流れ
システムバス、メモリバス、外部バスなどで接続されている

RAMは作業用のメインメモリ、電源を消すと消える
パーソナルPCは4〜16GB、業務用だと32GB程度
SPは1〜6GB程度
mac bookのメモリとはRAMを表している。surface proでも、4GB、8GB、16GBとある
メモリ容量が多い方が高速になる。足りない分はHDD, SDDなどで補う。メモリは記憶用のICチップが付いている。DDR4が主流。LPDDRはスマホ向けメモリ。メモリスロットに取り付ける。データ転送は一般的には一度に64ビット幅の送信が可能。

EC2の場合だとメモリがRAM 0.5~32, 3904もある
AWSだと、CPUやramはそれぞれのリージョンのデータセンターにあるって理解で良いのかな?
リージョン→東京:4 ap-northeast-1a/b/c/d
Transit Center→Equinix TY2、アット東京中央データセンター
エッジロケーション:東京8
噂では、千葉市印西、江東区枝川、横浜市磯子区あたりにDCがあるとされていますね。
クラウドって言ってるけど、AWS、Azure、GCPも実態は分散オンプレミスって感じか。。

メモリバスはメモリモジュールと他の部品をつなぐモジュール
“バスクロック”で表されていて、メモリが駆動するクロック周波数で変化するデータ転送速度

ん?ってことは、CPUとメモリの接続はマザーボードがやってる?
カーネルは、マザーボードに対してどういうデータの流れで処理してるのかしら??

linuxのkernel

linuxのkernelファイル群
bpf, cgroup, configs, debug, dma, events, gcov, irq, livepatch, locking, power, printk, rcu, sched, time, trace
当然全てC言語で書かれていますね。
https://github.com/torvalds/linux/tree/master/kernel

ubuntuだとbootディレクトリの中に入っている
config-*-generic, initrd.img-*-generic, System.map-*-generic, vmlinuz-*-generic, grub

主要機能だとデバイスドライバ、スケジューラ、メモリ管理、ファイルシステム、ネットワークプロトコルスタック、システムコールあたりか。

モノシリックカーネルとマイクロカーネル

モノシリックカーネル
全OSは一つのカーネル内に存在し、カーネルスレッド上で実行される
システム構成要素間の依存関係が複雑
デバイスドライバ、スケジューラ、メモリ管理、ファイルシステム、ネットワークプロトコルスタックなどもカーネル空間におかける
Linux, FreeBSDはモノシリック
ソフトウェアが少なく高速、コードも少ない
システムコールの延長で動作する
コーディングは難しい 標準Cライブラリが使えず、GNUデバッガが必要

モノシリックカーネル
伝統的なカーネルからサーバ群に機能を移転するOS設計方針
サーバ群を可能な限りユーザ空間で動作させる
ハードウェアの抽象化とシステムコールの最小
IPC(プロセス間通信)、基本スケジューラ、基本メモリハンドラ、基本I/Oプリミティブなどはカーネル空間におかける
スケジューラ本体、メモリ管理、ファイルシステム、ネットワークスタックの大部分はユーザ空間で動作
macOS, QNX, GNU Hurdなど
マイクロカーネルは通常、アドレス空間定義部、プロセス間通信(IPC)、プロセス管理などを扱う
ハードウェア処理などの昨日はマイクロカーネルで扱わない
メモリ、ソフトウェアを多く使用し、プロセス管理が複雑
ロボット、医療用システムで使われる

ハイブリッドカーネル
macOS
通信プロトコルスタックやファイルシステムをカーネル空間で動作、一部のカーネルコードはユーザ空間で提供
サードパーティーのテクノロジーを素早く統合できる

unixはユーティリティプログラム群とカーネル
linuxカーネルは1300万行
macOSはDarwinをベースとしており、XNUと呼ばれるハイブリッドカーネルを採用
Windowsもクライアント・サーバ型階層型サブシステムモデルを採用しており、ハイブリッドカーネルと見なされている

なるほど、Linux, Windows, MacOSだと、カーネルの設計・仕組みが異なるってことか。

Kernel

kernelって、どの本にも出てくるけど、具体的に何やってんの?
→ OSの中核。アプリケーションとハードウェアのデータ処理の架け橋
ハードウェアとソフトウェアコンポーネントのやり取りを管理する
プロセスの抽象化、プロセス間通信、システムコールなどを提供する
L モノシリックカーネルは全てを一つの仮装アドレス空間に格納されたコードで実行して性能を向上
L マイクロカーネルはサービスの大部分をユーザー空間で実行し、保守性とモジュール性を向上

あれ、これ、CPU、memory, deviceと繋がってるってことは、CPU、memory、deviceのアーキテクチャを理解してないと、kernelは書けないってこと? ん?
CPU、memory、deviceも日進月歩で進化してるよね。。

– カーネルの機能
コンピュータのリソースを管理し、他のプログラムがそれらのリソースを使って動作できるようにする
 CPU(プロセッサ): 多数のプロググラムからプロセッサ群を選択する
 memory: メモリにはプログラムとデータ両方が格納される
 input, output: keyborad, hdd, usbなど
リソース管理の重要な観点は、実行領域とその領域へのアクセス調停
プロセス同士の同期も提供
マルチタスクシステム(Mac OS, Windows採用)はプロセスを高速に切り替える。プロセスには優先度が設定される。プロセス間通信(IPC)は、パイプ、共有メモリ、メッセージ、RPC、ソフトウェア割り込みなどがある。
協調型マルチタスクは、割り込まれずに実行される。

メモリ管理
ページング方式、セグメント方式による仮想アドレッシング
物理アドレスを仮想アドレスに変換している(RAMからHDDなど)

システムコール
カーネルを呼び出す

カーネルの設計
モノシリックカーネル(大部分をカーネル内に含む)とマイクロカーネルで設計に大きな違いがある
多くのカーネルは、中間のハイブリッドカーネルになっている

Solaris

Soralisはサン・マイクロシステムズによって開発され、UNIXとして認証を受けたOS
sunのマイクロプロセッサ搭載
高性能、大規模システム向け
→ 大規模ストレージ向けの高信頼性ファイルシステムZFSなど

illumosとして開発は続けられている
https://github.com/illumos/illumos-gate

後は、windows, OSXがどのように開発されているかは知っておかないと駄目ですね。。
windowsは、OS, networking, C++, C, powershellの知識が必須
MacOSでもC/C++, ARM assembly, multi-thread application,file-sytem, encryption, operating system, hardware, low-level device

なるほどー、OSが絡む開発だとどこもC/C++は運転免許証ってレベル感になってくるな。

FreeBSD

BSDの流れを組むオープンソースのUNIX系OS, linuxの次に人気が高い
主な開発ターゲットはインテルのx86系プロセッサを搭載したPC/AT互換機
Linuxはdistributionと呼ばれる配布パッケージを利用するが、FreeBSDは一通りのソフトウェアが揃っている
packageはバイナリファイルのソフトを取得導入でき、portsはソースコードを元にコンパイルを行い組み立てる
カーネルの高負荷耐性が強く、サーバー用途を志向している

-推奨設定
amd64プロセッサ
rEFIndをインストールする為のEFIシステムパーティション
4GB RAM
8GBハードドライブ空き容量
3Dアクセラレーションビデオカード
ネットワークカード
サウンドカード

freebsd github
https://github.com/freebsd/freebsd

なんだこの26万commitsって。。異次元だな。まーlinuxは90万commitsな訳だが。

あれ、これ、binディレクトリの中を見ると、linux commandがc言語で書かれていますね。はー、fedora, centos, ubuntuなどもこういう仕組みなんだー。

ってことは、linux開発やりたいなら、c言語は必須ってことじゃん。
あれ、ってことは、linux, windows, OSX向けにbuildするソフトウェア開発するには、ゴリゴリC言語書けないと話にならないってことでしょうか?まじかー

configureの作成

cc コンパイラオプション
% cc [<オプション>] <ファイル名> [<ライブラリ>]

srcdir: コンパイルされるソースに対するディレクトリ
.ac: ユーザーのアクセス権限を証明

#!/bin/bash
cat >>Makefile.am <

# ビルドしてインストール
bin_PROGRAMS=test

#コンパイルする際のコンパイルオプション
#../configureなどルートディレクトリ以外で実行した時のインクルードディレクトリ
test_CFLAGS=-g -l @srcdir@/include/

#test_LDADDはライブラリ
test_LDADD= -lm

#ソースコード
test_SOURCES=test.c 

#ライブラリ用設定
include_HEADERS=test.h 
#ライブラリ作成する際のライブラリ名
lib_LIBRARIES=libtest.a 
#libtest.aのソースコード
libtest_a_SOURCES

#ビルドしないがインストールするファイル
#prefixオプションで指定したディレクトリ以下の/share/パッケージ名に配置
pkgdata_DATA=setting
#C言語からdesineとして参照
AM_CFLAGS= -DEVENTTABLE_CSV=""$(pkgdatadir)/setting""

#再帰的にmakeを実行
SUBDIRS= subdir subdir2/subsubdir 
EOF 
vim Makefile.am 
autoscan 
touch NEWS README AUTHORS ChangeLog 
awk '{if(/AC_INIT/){print "AC_INIT(FULL-PACKAGE-NAME, 0.0.1, name@hoge.jp)";print"AM_INIT_AUTOMAKE"}else{print $0}}' configure.scan >
congifure.ac 
vim configure.ac 
aclocal 
autoheader
autoconf
automake -a -c

shell

#!/bin/bash
n=0
for i in $(seq 1000)
do
	n=$(echo $n + $i | bc)
done
echo $n

vagrant@trusty:~/other$ sh main.sh
500500

#!/bin/bash
n=0
for i in $(seq 5)
do
	echo "${i}回目の実行です"
done

vagrant@trusty:~/other$ sh main.sh
1回目の実行です
2回目の実行です
3回目の実行です
4回目の実行です
5回目の実行です

#!/bin/bash
n=0
for i in $(seq 5)
do
	echo "$i * 3" | bc
done
#!/bin/bash
for i in $(seq 5)
do
	printf "$i + "
	[ $i -eq 5 ] && printf "0\n"
done | bc

echoは改行を付与するがprintfは改行を入れない
-eq はイコール

#!/bin/bash
cnt=0
if [ -z “$1”]; then
cat <&0 else cat "$1" fi | while read line do echo "Installing $line" go get -u "$line" & (( (cnt += 1) % 16 == 0 )) && wait done wait [/code] -z "$1" : $1が指定していないときはTrueを返す &0: 標準入力(ファイルディスクリプタ 0) >> 追記する

am拡張子はautomake template

#!/bin/bash
cat >>Makefile.am < [/code]

.bashrcでターミナルプロンプトの表示名変更

.bash_profileはログイン時に一回起動、.bashrcはシェル起動時に毎回起動

ubuntu-trusty という長ったらしいの変更したい

vagrant@vagrant-ubuntu-trusty-64:~/*

\u:username
\h:hostname
\W:current directory

vim ~/.bashrc

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

PS1がプロンプトの表示
“\h”を”trusty”に書き換えてsource .bashrcで反映する

vagrant@vagrant-ubuntu-trusty-64:~/other/hello-2.7$ source ~/.bashrc
vagrant@trusty:~/other/hello-2.7$

おー、スッキリした♪♪