プロセスとスレッド Linux&Ruby
linuxのはなし
プロセスとスレッド - プロセスはプログラムのインスタンス - 1プロセスで同時に動くのは1プロセス - スレッドはプロセスを細かくした実行単位 - プロセスの中で平行に動かしたいものをスレッドという単位で分ける
それだと効率が悪いので Kernelから見たら、 - 1プログラムは、1プロセスとして扱う - 1プロセスの中でスレッドが複数あったら、それらをライトウェイトプロセスとして扱い、プロセス同様に処理する。
Rubyのはなし
Thread.new // スレッド -> Rubyのprocessは1つ # Ruby のスレッドスケジューリングはネイティブスレッドのそれを利用 (ruby-2.1.0) Process.fork // プロセス -> Rubyのprocessは3つ
さらにRubyだと、ノンプリエンプティブな軽量スレッド(以下ファイバーと呼ぶ)を提供
している。
参考
Head First C (2) ポインタ
ポインタ
ポインタに対する理解はメモリに対する参照でしょー?程度。笑笑笑
ポインタは コピーの回避 と データ共有 の両方に役立つ。
関数内で変数を宣言すると、 スタック と呼ばれるメモリ部分に変数を格納。 関数の外側で宣言すると、 グローバル セクションに格納される。 ヒープ???
Cは引数を値として渡す。 ポインタを使うことによって、メモリ共有が簡単になる。
int x = 4; printf("xの格納位置は%p\n", &x); // %pフォーマットは、16進数形式で位置を出力する // intを格納するためのポインタ変数 int *address_of_x = &n;
Head First C (1)
バニラの状態では文字列をサポートしてない => 文字の配列を使う
文字列の最後に番兵文字を追加して実現する。\0
=> ヌル文字
シングルクォートは個々の文字に使う。ダブルクオートは必ず文字列に使う。
“ほげほげ” => 文字列リテラル : 定数なので変更できない 文字配列 : 変更できる
Cのブール値は数値 : 偽 = 0, 真 = それ以外の値
&
operator, |
operator は必ず両方の条件をチェックする
=> 主にビット演算に使われる
case ‘K’: case ‘B’: puts(“hoge”)
‘K’ or ’B’のときに当てはまるように書ける => rubyのでもいけるのかな? ただし、switchで文字列や配列を調べることはできない
while () {}
=> 0回以上のルーブ実行
do { } while ()
=> 1回以上のループ実行
breakはループからすぐ抜けられる if からは抜け出せない
mainのreturn文を忘れたら、C99企画の場合は入れてくれる。 -std=c99でcompileすると可能
GCC = GNU Compiler Collection Collectionなのはいろいろな言語のコンパイルができるから。