[RC]第4週コンセプト-マルチスレッド


[Thread vs Multi - Thread]


1.Threadは行/ストリーム/シーケンスです。


2.Threadの属性

  • 連続性
  • 流れ
  • 自律性
  • 独立性
  • 今は上の話がどういう意味か分かりません.後で文章を見れば分かる.
    説明する前に、アプリケーションの作成方法を見てみましょう.UIを作成したり、Logicを構成したり、UIやデータを更新したりします.このとき,Logic構成とUI/データ更新をTask(ワークセル)と呼ぶ.

    1つの授業の例でThreadを表現すると、次の画像のように表現できます.

    下の写真を見ると、授業とノートが別々に行われているという気まずいところがあります.上記のように、授業が行われると、先生は授業を開始し、授業を停止し、学生はメモを取り始め、先生は授業を再開する形で行われます.
    しかし、実際の授業は先生がメモを取り続け、学生がたまにメモを取る形で行われています.この授業でもう1枚絵を描きます.

    この場合はマルチスレッドであり,以前はクラスノートが1つのスレッドで繰り返されていたのが単一スレッドであった.
    今このような状況をiOSに変えると、次のように変わります.
  • Main Threadは閉じることができず、UIを担当する.
  • データパッチ、すなわちデータインポート完了後にMainに通知する.この通知を受け取ったMainはUIを変更します.
  • データ修正後Mainに通知する.この通知を受け取ったMainはUIを変更します.
  • Table Viewと比較して、追加データはMain Threadにデータを追加し、削除(修正)データはMain Threadからデータを削除します.

    マルチスレッドが発生した原因は何ですか?

  • 過負荷防止
  • MainはUIの描画を担当し、Mainに演算を加えると、演算中にアプリケーションの画面が停止する場合があります.これは未亡人化です.
  • 省時間
  • 同時処理業務
  • マルチスレッドフレンドリー?


    通帳に200万ウォンが入っていると仮定した場合、MacBookを購入して家賃を払う.MacBookを購入して家賃を支払うとしたら、MacBookを購入すると10秒後に通帳のお金が切れ、家賃がすぐに消えてしまうことを想像してみてください.そうなると130万ウォンの残高が残る.

    コードで書くと
    전역 var money = 2000000
    
    func apple() {
    	var myMoney = money
        usleep(10000000)//10초
        myMoney -= 1500000 
        money = myMoney
    }
    
    func houseMoney() {
    	var myMoney = money
        myMoney -= 700000 
        money = myMoney
    }
    
    //최종적으로 우리는 멕북도 사고 월세도 냈지만 1300000원이 잔고로 남게된다. 
    この問題は共有リソースの問題です.
    マルチスレッド操作を続行すると、このような問題が発生する可能性があります.
    この問題を解決する方法は肝心な部分,Mutex,細い麻布で解決できる.
  • キーポイント:コードのエリア
  • ミューテックス:臨界領域の問題を解決する開発ツール
  • 細麻布語:Mutexの確定版
  • 上の概念を読んでも意味がわかりません.したがって,概念というより,動作原理について説明する.
    1つの共有リソース、2つのThread(?)考えてみろ.
    共有リソースにAという名前のThreadが働いている間に、Bという名前のThreadが入ってきて仕事をすることができますか?
    あり得ない.このように1つのThreadが作業状態に入り、まだ作業が完了していない場合は、もう1つのThreadが入らないことを意味します.
    今ここで改めて質問しよう
    マルチスレッドはいいですか?
    正解じゃない
    単一スレッドの欠点のように,マルチスレッドにも欠点がある.
    チームメンバーを例にとると、単一スレッドを独自に完了できるチームメンバーが3人、マルチスレッドに乗る能力のあるチームメンバーが3人いると考えると、チームの効率はもちろん向上します.
    また、チームメンバーが独自に完了したタスクを4人のメンバーがいるチームメンバーに渡すと、完了できますか?個人別に計算できますが、オペレーティングシステム別に計算すると、各チームメンバーに実行可能なタスクがあるため、実行できません.また、マルチスレッド内のタスクを単一スレッドで実行することもできます.したがって,マルチスレッドのみがよいと考える考えは正しくない.

    シングルスレッドのメリット


  • リソースアクセスの同期の問題を考慮する必要はありません.
    複数のスレッドが共有するリソースを使用する場合、各スレッドは共通のリソースへのアクセスを制御する必要があります.これにより、プログラマは多くの努力を払って、多くのオーバーヘッドを発生する必要があります.単一スレッドモデルでは、これらの操作を実行する必要はありません.

  • 転職は不要です.
    タスク転送は、複数のプロセスが1つのプロセッサを共有するときに発生するタスクであり、コストがかかります.
  • 単一スレッドの欠点


  • 複数のCPUは使用できません.
    プロセッサを最大限に利用するには、クラスタモジュールを使用するか、外部で複数のプログラムインスタンスを実行する方法を使用する必要があります.

  • 2つのタスクを1つのスレッドとして処理するか、短時間で2つのスレッドが交互に実行される2つのスレッドとして処理すると仮定します.だから同時に2つの任務が処理されていると感じた.

  • ただし、2つのスレッドを使用する時間は、スレッド間のタスク切り替え(context switching)に時間がかかるため、単一スレッドを使用する時間よりも長い場合があります.

  • したがって,CPUのみを用いて計算を行うと,マルチスレッドに比べて単一スレッドのプログラミング効率が高くなる.
  • マルチスレッドの利点


    新しいプロセスを作成するよりも、既存のプロセスでスレッドを作成するほうが速いです.
  • プロセスのリソースとステータスを共有して効率的に実行できる.
  • スレッドのタスク変換は、/45577917、プロセスのタスク変換よりも高速です.

    マルチスレッドの欠点

  • 実行時に実行時間が逆に遅れるスレッドが1つしかない.
  • マルチスレッドはオペレーティングシステムのサポートが必要です.
  • スレッドスケジューリングに注意.
  • リファレンス


    https://velog.io/@eunjin/OS-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%9D%98%EB%AF%B8