プロセスとスレッドについてまとめてみよう
プロセスとスレッドについてまとめてみよう。
・プロセス
プロセスという概念は、アプリを実行するためにCPU (SoCs)によって割り当てられた資源のコンテクスト(文脈)だ。
fork() システムコールによって生成される。
・スレッド
古の時代には無かった概念だ。
プロセスを生成するために fork() というシステムコールを使っていたが、このforkはかなりシステムリソースを使うため考え出されたのがスレッドだ。
スレッドは所属するプロセスの資源コンテクストを共有するため dispatch_async() してもシステムリソースを消費しない特性があるため、現在(2016年)ではひとつのアプリにプロセスは一つ、スレッドが複数用いられることがほとんどだ。
・メインスレッド (main thread)
main()関数から始まるアプリのプロセスの中でメインスレッドというものがある。
文字どおり主要なスレッドで、これは画面描画を行える唯一のスレッドだ。
普通にスレッドを意識せずプログラミングすれば、このメインスレッドで実行されることになる。
dispatch_async(dispatch_get_main_queue(), ^{ // some procedures.});
・サブスレッド(バックグラウンド・スレッド、sub thread)
サブスレッドはシリアルとコンカレントという2通りの実行方法がある。
一般的なスレッドの概念からいうとコンカレントが一般的な用法といえる。
<シリアルキュー(逐次実行キュー)>
同一キュー名にキューイングされたスレッドがファーストイン・ファーストアウトで順番に実行されることが保証されているキューである。
dispatch_async(dispatch_queue_create("app.group", NULL), ^{ // some procedures.});
<コンカレントキュー(並行実行キュー)>
いわゆるマルチタスクにスレッドが実行される。
通常の概念のスレッド手続きである。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // some procedures.});
・ブロックス
ブロックスの手続きはサブスレッド上で実行される。
メソッドの実装によってスレッドはシリアルまたはコンカレントに実行される。
[CMpedometer queryPedometerDataFromDate:startDate toDate:nowDate withHandler:^(CMPedometerData *data, NSError *error) { // on sub thread. // run on serial queue in this case.}];
・セマフォ
スレッドは他のスレッドから終了させることはできない。
シグナルを送ることで自分で終了するように仕向けるためにセマフォが利用されるのだ。
mSemaphoreForTerminate = dispatch_semaphore_create(0);dispatch_semaphore_signal(mSemaphoreForTerminate);