エラーの分類

大きく分けてコンパイルエラーランタイムエラーからなる。 実際問題としてはソフトウェア試験で問題になるのはランタイムエラーに対して適切なエラー処理の実装がなされているかである。

コンパイルエラー(シンタックスエラー)

コンパイル時に発生するエラー。シンタックス誤りなど。

ランタイムエラー

コンパイル時には発生しないが実行時に発生するエラー。
プログラム実行に必要な設定ファイルが存在しなかった場合など。

メモリ管理(セグメント)

セグメント(セクション)

通常プログラムやデータはメインメモリの連続した領域を単位として管理される。
このプログラムやデータの管理単位となる連続した領域のことをセグメントと呼ぶ。

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

80386i386): Pentiumi586の名称が特許で認められなかったため数字以外の名称が採用された。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

教師あり学習の分類

どれも昔大学院でお世話になった懐かしい名前です。ベイズ推定とかもう一度勉強しなおしたいなぁ。

機械学習の分類

大きく分けると教師あり学習教師なし学習強化学習の3つに分類される。

教師あり学習

教師データ*1を用いて学習する。

教師なし学習

教師データを用いずに学習する。

強化学習

環境とのフィードバックから教師データを得る。

転移学習

学習済みモデルを他のモデルに適用する。

半教師あり学習

いくつかの例の教師データが与えられる。

弱学習

大雑把な教師データが与えられる。

*1:与えられたデータに対して正解が対応しているデータ。

CPUモード

  • CPUにはカーネルモードとユーザモードの2つのモードがある。
  • CPUモードはCPUとしての機能(アセンブラとして提供)ではなくて、プログラムとしての機能だと思うのだが実際はどうなのだろう?

カーネルモード(OSの核となる処理)

ユーザモード

  • プロセスはユーザモードで動作する
  • HW制御(ドライバ)は全てカーネルモードである。HW機能を利用したい場合はシステムコールを利用してカーネルモードの処理を呼び出す。

  • 全てのIO処理はカーネルモードでしか実行できない。
  • そのためにプロセスがIO処理を実行する場合は(直接的に or 間接的に)システムコールのwrite等を行う。

CPUのモード遷移

  1. プロセス実行時にCPUは通常ユーザモードになっている。
  2. プロセスがシステムコールを発行するとCPUに割り込みが発生する。
  3. これに伴い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