メモリ管理(セグメント)
セグメント(セクション)
通常プログラムやデータはメインメモリの連続した領域を単位として管理される。
このプログラムやデータの管理単位となる連続した領域のことをセグメントと呼ぶ。
Programセクション(Pセクション)
プログラムコードが格納されるセクション。Textセクションとも呼ばれるよ。
Constセクション(Cセクション)
定数データが格納されるセクション。
Dataセクション(Dセクション)
初期値ありのグローバル変数が格納されるセクション。
BSSセクション(Bセクション)
初期値なしのグローバル変数が格納されるセクション。
例
以下のサンプルプログラムhello.cでの実行結果を示す。
#include <stdio.h> int main(void) { puts("hello world"); return 0; }
sizeコマンドやobjdumpコマンドでセクションの確認ができる。
$ gcc -c hello.c $ size hello.o text data bss dec hex filename 89 0 0 89 59 hello.o $ size hello text data bss dec hex filename 1182 552 8 1742 6ce hello $ objdump -h hello.o hello.o: ファイル形式 elf64-x86-64 セクション: 索引名 サイズ VMA LMA File off Algn 0 .text 00000015 0000000000000000 0000000000000000 00000040 2**0 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 0000000000000000 0000000000000000 00000055 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 0000000000000000 0000000000000000 00000055 2**0 ALLOC 3 .rodata 0000000c 0000000000000000 0000000000000000 00000055 2**0 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .comment 00000035 0000000000000000 0000000000000000 00000061 2**0 CONTENTS, READONLY 5 .note.GNU-stack 00000000 0000000000000000 0000000000000000 00000096 2**0 CONTENTS, READONLY 6 .eh_frame 00000038 0000000000000000 0000000000000000 00000098 2**3 CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
プログラム実行時に必要となるメモリ量
静的なメモリサイズと動的なメモリサイズの両方を考慮する必要がある。
- 静的なメモリサイズ(コード・データ)
- 動的なメモリサイズ(スタック・ヒープ等)
参考
x86系CPU
「x86系CPU」といった場合インテル製の CPU に加えアスロンなどのインテル互換CPU も含まれる
x86のここがすごい
- 世界中のPCとサーバの90%以上で使われているx86系
- 1970年代後半のコンピューティング技術で残っているのはコンピュータの命令セット
- でもスマホやタブレット系はARMが主流らしい urashita.com
- でも直近IntelはARMにシェアで負けたらしい urashita.com
x86の語源
初期のプロセッサの型番が「8086」「80186」「80286」「80386」「80486」と続いたため、総称して「80x86」、更に型番の下2桁が共通するところから「x86」(エックスはちろく、ペケはちろく)や「86系」などと呼ばれるようになった
8bit CPU
8080
16bit CPU
8086:1978年に登場。x86系列の始祖 80286:保護モードを搭載
32bit CPU
80386(i386): Pentium:i586の名称が特許で認められなかったため数字以外の名称が採用された。CPUに初めて冷却ファンが搭載されたのもここから。
参考
Intel CPUの歴史を代表モデルで振り返るとこうなる - GIGAZINE gigazine.net http://ja.uncyclopedia.info/wiki/CPU%E3%81%AE%E6%AD%B4%E5%8F%B2
CPUのbit数
CPUのbit数の定義
- CPUに関連するbit数は多岐に渡る。
CPUを表現する場合のビット数の意味は以下の通りである。 - アドレス幅(内部のアドレスレジスタ幅、外部アドレスバス幅) - データバス幅(内部データ幅、外部データバス幅) - 内部演算幅(=演算装置の幅と整数レジスタ幅) - 命令語長
- 実際のCPU内部は以下のように更に複雑である。
これらはCPUのデータ幅やアドレス幅による単純な分類方法であり、実際のCPUではデータ信号線やアドレス指定方法に工夫することで、外部的に少ないデータバス幅や内部的に少ないアドレス幅でも効率的にメモリ・アクセスできるようにしているものがある
- そのためXX bitCPUの厳密な定義は存在しない。
- 64bitCPUは商業的なインパクト目的?
32bit系CPU
x86_64 amd64
64bit系CPU
i386 i686 x86
実行例
x86_64とあるので64bit
$ uname -a Linux pide-VirtualBox 4.13.0-39-generic #44~16.04.1-Ubuntu SMP Thu Apr 5 16:43:10 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
参考
まさか個人でCPUをハードウェア的に実装するという超人がいたとは。。 diode.matrix.jp hiroakiuno.hatenablog.com CPU - Wikipedia
教師あり学習の分類
どれも昔大学院でお世話になった懐かしい名前です。ベイズ推定とかもう一度勉強しなおしたいなぁ。
- 決定木
- 遺伝的手法
- ニューラルネットワーク
- サポートベクターマシン
⇒分類境界とデータの距離が最大になるようにするモデル - ベイズ学習
CPUモード
カーネルモード(OSの核となる処理)
- デバイスドライバ
- プロセス管理システム
- プロセススケジューラ
- メモリ管理システム
ユーザモード
例
CPUのモード遷移
- プロセス実行時にCPUは通常ユーザモードになっている。
- プロセスがシステムコールを発行するとCPUに割り込みが発生する。
- これに伴いCPUはユーザモードからカーネルモードに遷移してカーネルの処理が始まる。
確認
- sarコマンドでCPUモードを確認できる。
- userとniceの合計がユーザモードで動作している時間であり、systemの合計がカーネルモードで動作している時間。
$ sar -P ALL 1 Linux 4.13.0-39-generic (pide-VirtualBox) 2018年04月30日 _x86_64_ (1 CPU) 00時09分08秒 CPU %user %nice %system %iowait %steal %idle 00時09分09秒 all 5.05 0.00 1.01 0.00 0.00 93.94 00時09分09秒 0 5.05 0.00 1.01 0.00 0.00 93.94
参照
okn-yu.hatenablog.com CPUモード - Wikipedia www.geocities.jp qiita.com