1. 程式人生 > >【裝】並行、併發、同步、互斥

【裝】並行、併發、同步、互斥

並行

計算機作業系統中的並行,指的是同時存在於記憶體中的多道作業都處於執行狀態。實際上都是巨集觀上並行微觀上序列,因為這些作業都是開始各自的執行,但都沒執行完畢,只是交替地使用cpu

    在作業系統中是指,一組程式按獨立非同步的速度執行,不等於時間上的重疊(同一個時刻發生)。要區別併發。併發是指:在同一個時間段內,兩個或多個程式執行,有時間上的重疊(巨集觀上是同時,微觀上仍是順序執行)。並行也指8位資料同時通過並行線進行傳送,這樣資料傳送速度大大提高,但並行傳送的線路長度受到限制,因為長度增加,干擾就會增加,資料也就容易出錯。

併發

作業系統中,是指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行,但任一個時刻點上只有一個程式在處理機上執行

併發是指兩個或多個事物在同一時間間隔內發生。簡單的理解就是在同一段時間內發生了多個事情。這裡需要著重指出的是一個時間段,而不是一個時刻。比如一個處理器同一時刻只能做一件事情,但是電腦卻可以同時做很多事情,比如一邊放音樂,一邊下電影等。整個電腦表現出來的就是併發性,很多事情同時在進行。但是我們只有一個處理器,它是通過把時間分片的機制來實現的。第一片時間來做A事情,第二片時間做B事情,第三片時間做C事情等,這樣迴圈往復的執行,這樣在一段時間內處理器同時做著多個事情,但在一個時間點上,處理器只做一件事情。從巨集觀上講,多個事情在同時斷斷續續的進行著,對外表現就是放一會音樂,下一會電影,再放音樂,再下電影。但是我們並沒有感覺出來它們之間的這種交替過程,我們感覺到的是它們在同時進行的,音樂一直在放著,電影一直在下著。並沒有一會停頓,一會繼續。那是因為處理器的頻率非常高,所以單位時間非常小,我們人類根本分辨不出來。就像日常的白熾燈,它使用的是50赫茲的交流電,即每秒中電流的方向改變50次,每次改變電壓都會從波峰經過0再到波谷,在電壓為0的時候燈是不會發光的,電壓在波峰或波谷處燈發的光是最亮的。它的理論表現就像汽車的轉向燈一樣,一閃一滅。但事實上我們感覺到的是一直在亮。因為他的閃滅週期只有0.02秒,再加上人的眼睛具有延時功能,所以正常情況感覺不到。


  在關係資料庫中,允許多個使用者同時訪問和更改共享資料的程序。SQL Server 使用鎖定以允許多個使用者同時訪問和更改共享資料而彼此之間不發生衝突。

  作業系統併發程式執行的特點:

  併發環境下,由於程式的封閉性被打破,出現了新的特點:

  ①程式與計算不再一一對應,一個程式副本可以有多個計算

  ②併發程式之間有相互制約關係,直接制約體現為一個程式需要另一個程式的計算結果,間接制約體現為多個程式競爭某一資源,如處理機、緩衝區等。

  ③併發程式在執行中是走走停停,斷續推進的。

併發和並行的區別和聯絡

   “並行”是指無論從微觀還是巨集觀,二者都是一起執行的,就好像兩個人各拿一把鐵杴在挖坑,一小時後,每人一個大坑。 而“併發”在微觀上不是同時執行的,只是把時間分成若干段,使多個程序快速交替的執行,從巨集觀外來看,好像是這些程序都在執行,這就好像兩個人用同一把鐵杴,輪流挖坑,一小時後,兩個人各挖一個小一點的坑,要想挖兩個大一點得坑,一定會用兩個小時。 從以上本質不難看出,“併發”執行,在多個程序存在資源衝突時,並沒有從根本提高執行效率

    併發,是在同一個cpu上同時(不是真正的同時,而是看來是同時,因為cpu要在多個程式間切換)執行多個程式。並行,是每個cpu執行一個程式。打個比方,併發,就像一個人(cpu)喂2個孩子(程式),輪換著每人喂一口,表面上兩個孩子都在吃飯。並行,就是2個人喂2個孩子,兩個孩子也同時在吃飯。

 併發和並行是即相似又有區別的兩個概念,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。在多道程式環境下,併發性是指在一段時間內巨集觀上有多個程式在同時執行,但在單處理機系統中,每一時刻卻僅能有一道程式執行,故微觀上這些程式只能是分時地交替執行。倘若在計算機系統中有多個處理機,則這些可以併發執行的程式便可被分配到多個處理機上,實現並行執行,即利用每個處理機來處理一個可併發執行的程式,這樣,多個程式便可以同時執行

在同一時間間隔內有多個執行緒在同時執行,就是執行緒的併發。多個執行緒在邏輯上互有前因後果的關係,所以要對他們的執行順序進行控制和協調,這就是執行緒同步。系統為了提高效能和吞吐量,採用了多執行緒併發來解決,但同時也引入了執行緒同步的問題。可以這樣理解執行緒併發和同步的因果關係。

如果執行緒在時間上能夠區分開來,比如執行緒A先執行,在指定時間後,能夠執行完畢或產生我們想要的結果,這時執行緒B使用執行緒A的結果作為輸入開始執行。像這樣通過時間能夠嚴格的加以區分的不是特別複雜的執行緒關係,可以讓執行緒休眠指定的時間來進行同步。就是採用sleep方法實現同步。

如果執行緒在時間上不能區分開,但是在先後順序上能夠區分開,比如執行緒A先執行,我們不知道它什麼時候能夠執行完,但是我們知道它必須執行完後執行緒B才能開始執行。像這樣在執行的先後順序上能夠嚴格的區分開的,而起前一個執行完,後一個才開始的,可以使用join方法來實現同步。

如果執行緒的執行比較複雜,交織在一起,那麼只能通過等待和通知,即wait和notify方法來實現執行緒的同步,採用這種方式能夠更加靈活的控制執行緒的步調,但是如果使用不慎的話會容易導致更大的問題。具體採用哪種同步方式要根據實際情況。如果你的同步過於發雜的話,最好還是重新進行演算法和邏輯的設計,因為只有良好的設計,才可能會出現巧妙的實現,最終成就健康穩定的執行。


同步

         很多人認為同步指的就是同時,可能因為在巨集觀開了同步很多時候就表現就同時,就像併發在巨集觀下表現為並行。其實這樣理解是不正確的。同步中的同,不是同時的意思,而是指的協同、協調。同步中的步,指的是步驟、步調。合起來就是協同或協調步驟或步調。就是多個事物的步調遵循一定的規範,而不是混亂不堪的。多個事物按照一定的規律進行著,可以是一個事物先進性一段時間,然後另一個事物再進行,也可以是一個事物進行完後,另一個事物再進行。總之要有一個規律把所有事物約束起來。

   同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。

  “同”字從字面上容易理解為一起動作。

  其實不是,“同”字應是指協同、協助、互相配合

  如程序、執行緒同步,可理解為程序或執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;A再繼續操作

互斥

    兩個或兩個以上的程序,不能同時進入關於同一組共享變數的臨界區域,否則可能發生與時間有關的錯誤,這種現象被稱作程序互斥.