プロセスとスレッドの関係

3187 ワード

スレッドは何ですか?プロセスは何ですか?両者にはどんな違いと連絡がありますか。


答え:1つのプログラムには少なくとも1つのプロセスがあり、1つのプロセスには1つのスレッドがありません.プロセス:1つのプログラムの1回の実行で、実行中に独立したメモリユニットを持ち、複数のスレッドが1つのメモリを共有します.
スレッド:スレッドとは、プロセス内の実行単位です.連絡:スレッドはプロセスの基本構成単位の違いである:(1)スケジューリング:スレッドはスケジューリングと割り当ての基本単位とし、プロセスはリソースを持つ基本単位として(2)同時性:プロセス間だけが同時実行可能であり、同じプロセスの複数のスレッド間でも同時実行可能である(3)リソースを持つ:プロセスはリソースを持つ独立した単位であり、スレッドはシステムリソースを持つが、プロセスに属するリソースにアクセスできる.(4)システムオーバーヘッド:プロセスの作成または取り消し時に、システムがリソースを割り当てて回収するため、システムのオーバーヘッドはスレッドの作成または取り消し時のオーバーヘッドより明らかに大きい.オペレーティングシステムには複数のソフトウェアが実行されています(QQ、office、音楽など)、これらはすべて1つのプロセスですが、各プロセスには多くのスレッドがあります(例えばQQ、同時にチャットしたり、ファイルを送信したりすることができます).
スレッドとRunLoopの間には1つの対応があり,その関係は1つのグローバルなDictionary里に保存される.プログラムが作成されたばかりの頃はRunLoopはありませんでしたが、自分から取得しなければ、それはずっとあります.RunLoopの作成は初回取得時に発生し,RunLoopの破棄はスレッド終了時に発生する.1つのスレッドの内部でのみRunLoopを取得できます(メインスレッドを除きます).
プライマリ・スレッドを過剰に負担させるには、常に.UImitはメインスレッド上ですべての作業を行うため、レンダリング、チューブタッチ反応、応答入力などが必要です.プライマリ・スレッドをずっと使用するリスクは、コードが本当にプライマリ・スレッドをブロックした場合、appが反応を失うことです.

iOSマルチスレッド


iOSの中のマルチスレッドは、Cocoaフレームワークの下のマルチスレッドであり、Cocoaのパッケージを通じて、私たちにもっと四角い使用スレッドを使用させることができます.C++をしたことがある学生はスレッドに対してもっと多くの解を持っているかもしれません.例えば、スレッドの創立、信号、共有変すなわち,スレッドのオブジェクト化抽象は,我々のエンジニアリング,プロバイダの頑丈性を減少させる.
  • GCDは(Grand Central Dispatch)の略で、システムレベルから提供される1つの敷地マルチスレッドクラスライブラリであり、動作時の特徴を持ち、マルチコアハードウェアを十分に利用することができる.GCDのAPIインタフェースはC言語の関数であり、関数パラメータの多くにはBlockがあり、Blockの使用についてはこれを参照し、強力な「インタフェース」を提供し、GCDの使用については本論文
  • を参照する.
  • NSOperationとQueue NSOperationは抽象クラスであり、スレッドの詳細な実装をカプセル化しており、このオブジェクトをサブクラス化し、NSQueueを加えることでオブジェクト向けの思考と、マルチラインプログラムを管理することができる.具体的には、NSOperationベースのマルチスレッドネットワークアクセスのプロジェクトを参照してください.
  • NSThreadは、NSOperation抽象のようにスレッドの実行を制御するオブジェクトであり、それによってスレッドを手に入れ、制御することができます.しかし、NSThreadのスレッド間の同時制御は、NSConditionによって実現できるように、私たち自身が制御する必要があります.iOSマルチスレッドプログラミングNSThreadの使用
  • を参照

    NSThread

     
     
     
     -NSObject  
    

    NSOperation

    NSInvocationOperation
    NSBlockOperation
      
    

    GCD

     
     
      
    

    スレッド同期

    NSLock 
    @synchronized 
     -- GCD 
     --  
    

    dispatch_asyncとdispatch_sync区別


    前者は同期が進行するとメインスレッドがブロックされます
    dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_sync(concurrentQueue, ^(){
        NSLog(@"2");
        [NSThread sleepForTimeInterval:10];
        NSLog(@"3");
    });
    NSLog(@"4");
    

    出力:
    11:36:25.313 GCDSeTest[544:303] 1
    11:36:25.313 GCDSeTest[544:303] 2
    11:36:30.313 GCDSeTest[544:303] 3// 
    11:36:30.314 GCDSeTest[544:303] 4
    

    後者は非同期で行われる
     dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"1");
    dispatch_async(concurrentQueue, ^(){
        NSLog(@"2");
        [NSThread sleepForTimeInterval:5];
        NSLog(@"3");
    });
    NSLog(@"4");
    

    出力:
     11:42:43.820 GCDSeTest[568:303] 1
     11:42:43.820 GCDSeTest[568:303] 4
     11:42:43.820 GCDSeTest[568:1003] 2
     11:42:48.821 GCDSeTest[568:1003] 3//