併發編程之進程與線程

2.1 線程與進程

2.1.1 進程

  • 程序指令和數據組成,但這些指令要運行,數據要讀寫,就必須將指令加載至CPU,數據加載至內存。在指令運行過程當中還須要用到磁盤、網絡等設備。進程就是用來加載指令、管理內存、管理IO的。
  • 當一個程序被運行,從磁盤加載這個程序的代碼至內存,這時就開啓了一個進程。
  • 進程就能夠視爲程序的一個實例。大部分程序能夠同時運行多個實例進程(例如記事本、畫圖、瀏覽器等),也有的程序只能啓動一個實例進程(例如網易雲音樂、360安全衛士等)

2.1.2 線程

  • 一個線程以內能夠分爲一到多個線程。
  • 一個線程就是一個指令流,將指令流中的一條條指令以必定的順序交給CPU執行。
  • Java中,線程做爲最小調度單元,進程做爲資源分配的最小單位。在windows中進程是不活動的,只是做爲線程的容器。

2.1.3 兩者對比

  • 進程基本上相互獨立的,而線程存在於進程內,是進程的一個子集。
  • 進程擁有共享的資源,如內存空間等,供其內部的線程共享。
  • 進程間通訊較爲複雜
    同一臺計算機的進程通訊稱爲IPC
    不一樣計算機之間的進程通訊,須要經過網絡,並遵照共同的協議,例如HTTP
  • 線程通訊相對簡單,由於他們共享進程內的內存,一個例子是多個線程能夠訪問同一個共享變量
  • 線程更輕量,線程上下文切換成本通常上要比進程上下文切換低。

2.2 並行與併發

單核CPU下,線程實際仍是串行執行的。操做系統中有一個組件叫作任務調度器,將CPU的時間片(windows下時間片最小約爲15毫秒)分給不一樣的線程使用,只是因爲CPU在線程間(時間片很短)的切換很是快,人類感受是同時運行的。總結爲一句話就是 :微觀串行,宏觀並行。
通常會將這種線程輪流使用CPU的作法稱爲併發,concurrent
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
引用Rob Pike的一段描述 :編程

  • 併發(concurrent)是同一時間應對(dealing with)多件事情的能力
  • 並行(parallel)是同一個時間動手作(doing)多件事情的能力

2.3 應用

  • 應用之異步調用(案例1)
    從方法調用的角度來說,若是
    (1)須要等待結果返回,才能繼續運行就是同步
    (2)不須要等待結果返回,就能繼續運行就是異步
    注意 :同步在多線程中還有另一層意思,是讓多個線程步調一致
    1)設計
    多線程可讓方法執行變爲異步的好比說讀取磁盤文件時,假設讀取操做話費了5秒鐘,若是沒有線程調度機制,這5秒調用者什麼都作不了,其代碼都得暫停。
    2)結論
  • 好比在項目中,視頻文件須要轉換格式等操做比較費時,這時開一個新線程處理視頻轉換,避免阻塞主線程。
  • tomcat的異步servlet也是相似目的,讓用戶線程處理耗時較長的操做,避免阻塞tomcat的工做線程
  • ui程序中,開線程進行其餘操做,避免阻塞ui線程
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 應用之提升效率(案例1)
    充分利用多核cput的優點,提升運行效率。想象下面的場景,執行3個計算,最後將計算結果彙總。
    在這裏插入圖片描述
    若是是串行執行,總共話費時間是31ms。
    若是是四核cput,各個核心分別使用線程並行執行,總共話費12ms。
  • 結論
    1. 單核cpu下,多線程不能實際提升程序運行效率,只是爲了可以在不一樣的任務之間切換,不一樣線程輪流使用cpu,不至於一個線程總佔有cpu,別的線程無法幹活。
    2. 多核cpu能夠並行跑多個線程,但可否提升程序運行效率仍是要分狀況的
      (1)有些任務,通過精心設計,將任務拆分,並行執行,固然能夠提升程序的運行效率。但不是全部計算任務都能拆分
      (2)也不是全部任務都須要拆分,任務的目的若是不一樣,談拆分和效率沒有意義
    3. IO操做不佔用cpu,只是咱們通常拷貝文件使用的是【阻塞IO】,這時至關於線程雖然不用cpu,但須要一直等待IO結束,沒能充分利用線程。因此纔有非阻塞IO和異步IO優化。
相關文章
相關標籤/搜索