1. 程式人生 > >併發、並行、高併發和多執行緒

併發、並行、高併發和多執行緒

1.併發和並行的區別

 

  • 併發:當有多個執行緒在操作時,如果系統只有一個CPU,把CPU執行時間劃分成若干個時間段,分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀態。這種方式我們稱之為併發(Concurrent)。併發=間隔發生
  • 並行:當系統有一個以上CPU時,則執行緒的操作有可能非併發。當一個CPU執行一個執行緒時,另一個CPU可以執行另一個執行緒,兩個執行緒互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。   並行=同時進行
  • 高併發是網際網路分散式系統架構設計中必須考慮的因素之一,通常是指通過設計保證系統能夠同時並行處理很多請求。
  • 區別:並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。

 

2.高併發是短時間內大量訪問和請求,例如12306搶票和天貓雙11活動,想系統能夠適應高併發狀態,則需要全面優化優化,包括,硬體、網路、系統架構、開發語言的選取、資料結構的運用、演算法優化、資料庫優化……而多執行緒只是其中解決方法之一。

多執行緒在解決高併發問題中所起到的作用就是使計算機的資源在每一時刻都能達到最大的利用率,不至於浪費計算機資源使其閒置

 

3.實現高併發需要考慮:

 

  • 系統的架構設計,如何在架構層面減少不必要的處理(網路請求,資料庫操作等)
  • 網路拓撲優化減少網路請求時間、如何設計拓撲結構,分散式如何實現?
  • 系統程式碼級別的程式碼優化,使用什麼設計模式來進行工作?哪些類需要使用單例,哪些需要儘量減少new操作?
  • 提高程式碼層面的執行效率、如何選取合適的資料結構進行資料存取?如何設計合適的演算法?
  • 任務執行方式級別的同異步操作,在哪裡使用同步,哪裡使用非同步?
  • JVM調優,是以server模式還是以clien模式執行,如何設定Heap、Stack、Eden的大小,如何選擇GC策略,控制Full GC的頻率?
  • 資料庫優化減少查詢修改時間。資料庫的選取?資料庫引擎的選取?資料庫表結構的設計?資料庫索引、觸發器等設計?是否使用讀寫分離?還是需要考慮使用資料倉庫?
  • 快取資料庫的使用,如何選擇快取資料庫?是Redis還是Memcache? 如何設計快取機制?
  • 資料通訊問題,如何選擇通訊方式?使用TCP還是UDP,是使用長連線還是短連線?NIO還是BIO?netty、mina還是原生socket?
  • 作業系統選取,是使用winserver還是Linux?或者Unix?
  • 硬體配置?是8G記憶體還是32G,網絡卡10G還是1G?