成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試薪水被壓?那是你還不懂多線程和高并發

開發 架構
當并發工作中的某一個任務完成后,會從一段程序切換到另一段程序上執行,而上一段程序運行的一系列狀態如果不保存,就會丟失,因此操作系統引入了進程來進行資源隔離。

1.引言

大家好,我是小?,一個漂泊江湖多年的 985 非科班程序員,曾混跡于國企、互聯網大廠和創業公司的后臺開發攻城獅。

作為開發者,不管是求職面試,還是在日常工作中,相信大家對高并發和多線程都不會陌生。

求職面試時,卷出天際的后臺招聘要求,往往都會要求我們熟悉高并發、多進程/多線程:

圖片圖片

日常工作中,隨著移動互聯網應用的興起和發展,我們面對的系統任務和問題也變得越來越復雜。

無論是構建大規模的 Web 應用、處理龐大的數據集,還是開發高性能的游戲,都需要應對一個共同的挑戰:高并發。

1.1 什么是高并發?

高并發是指在同一時間段內有大量用戶或程序在訪問和使用某個服務或資源。

這意味著我們需要在同一時間內處理大量的請求、數據和任務。如何高效地處理這種情況,就成了一項關鍵的技術任務。

高并發是一個充滿挑戰的領域,但同時也是一個充滿機會的領域。

1.2 多線程和高并發有啥關系?

解決高并發問題不僅能夠提高系統的性能,還能夠改善用戶體驗,為企業帶來更多的商機。

而多線程技術,正是應對高并發挑戰的重要工具之一。

所以,在本篇文章中,小?將帶大家一起深入探討高并發和多線程,并熟悉多線程的工作原理、應用場景以及解決高并發問題的實際方案。

相信無論你是初級程序員還是有一定經驗的開發者,都能夠在這篇文章中找到有用的信息。

2. 高并發

2.1 并發與并行

并發

并發是指多個任務在相同的時間段內執行。在單核處理器上,多個線程之間通過時間片輪轉方式切換執行,造成了并發場景。

圖片圖片

相當于我們的錄像,當視頻幀數夠高時(即一秒內切換多張圖片),我們的肉眼就會把它當成是一個連續而流暢的視頻。

并行

在多核處理器上,真正的并發可以實現多個線程同時執行不同的任務——也就是并行。

圖片圖片

并行是指多個任務在同一時刻執行,通常需要多核處理器。并行是并發的一個子集,只有當硬件支持多個并行執行單元時才能實現真正的并行。

思考題

場景1:為什么我們在玩游戲時,很難一邊激烈團戰,一邊集中注意接電話?

場景2:我們在開車時,可以一邊聽音樂,一邊撥弄方向盤而互不影響。大家不妨猜一下,我們的大腦是并發還是并行運行的呢?

2.2 多高的并發才算高并發?

了解了并發的概念,現在我們來聊一聊高并發。

或許和我們平常想象的不同,不是說 QPS(Queries Per Second)每秒查詢率 或 HPS(Hits Per Second)每秒點擊數 等指標很高才算是高并發。

高并發是一個相對的概念,它取決于系統的性能和處理能力。通常,當系統需要處理的請求或事務數量超出其正常負載的范圍時,就可以稱之為高并發。

2.3 高并發的挑戰

高并發雖然帶來了許多機會,但也伴隨著很多挑戰。

比如,高并發系統需要在短時間內處理大量請求,而不降低系統的性能或響應速度。

這可能涉及到多個用戶同時訪問一個網站、多個客戶端同時請求服務器數據、或多個線程同時訪問共享資源。

在分布式系統中,不管是多個用戶訪問,還是多個客戶端訪問服務器,歸根到底都是各服務器的業務線程來訪問共享資源,所以,高并發的挑戰幾乎都是與多線程相關的。

在面對高并發時,具體會出現以下幾個問題。

圖片圖片

1. 競態條件

多個線程同時訪問共享資源,可能導致數據不一致問題。例如,多個線程同時向同一個銀行賬戶存款,可能導致余額錯誤。

2. 死鎖

多個線程相互等待對方釋放資源,導致系統停滯。例如,線程 A 等待線程 B 釋放鎖,而線程 B 又等待線程 A 釋放鎖,就形成了死鎖。

3. 資源爭用

多線程訪問共享資源時,可能導致資源爭奪問題,降低性能。例如,多個線程同時競爭數據庫連接,導致數據庫響應變慢。

4. 線程安全

需要確保多線程訪問共享數據時不會引發錯誤。例如,在多線程環境下,需要確保對數據的讀寫是安全的。

5. 調試難度

由于多線程的執行順序是不確定的,問題可能出現在不同的時機。所以多線程程序的調試相對復雜,問題難以重現。

2.4 解決高并發問題

為了解決高并發問題,需要采用適當的技術和方法,具體有以下幾種。

圖片圖片

1. 鎖機制

使用鎖來保護共享資源,確保同時只有一個線程可以訪問。

鎖可以分為互斥鎖和讀寫鎖,互斥鎖用于獨占資源,讀寫鎖允許多個線程同時讀取資源,但只允許一個線程寫入。

具體實現細節可以使用編程語言提供的鎖機制,如 Java 中的 synchronized 關鍵字或 Python 中的 threading.Lock。

2. 并發數據結構

使用并發數據結構,如并發隊列和哈希表,減少資源爭用。這些數據結構經過優化,能夠在多線程環境下高效工作。

例如,Java提供了ConcurrentHashMap,它是一個線程安全的哈希表,可以在高并發環境下使用而無需顯式加鎖。

3. 線程池

管理和重用線程,提高性能。線程池可以控制線程的數量,避免線程過多導致資源浪費。

在 Java 中,你可以使用ExecutorService來創建和管理線程池。這樣可以避免線程的頻繁創建和銷毀,提高效率。

4. 消息傳遞

通過消息傳遞模型進行線程間通信,避免共享內存。消息傳遞可以確保線程之間的數據安全傳遞,減少競態條件。

例如,在 Go 語言中,你可以使用通道(channel)進行消息傳遞,確保數據的安全傳遞。

5. 原子操作

原子操作是不可分割的操作,它們可以確保多個線程對共享變量的操作是安全的。原子操作通常由第三方庫或者特性支持,可以用于實現各種同步機制。

在 C/C++ 中,你可以使用原子操作來操作共享變量,例如使用atomic庫。在 MySQL 中,InnoDB 引擎的事務線程能夠自帶原子性的特點。

3. 多線程

3.1 進程與線程

當并發工作中的某一個任務完成后,會從一段程序切換到另一段程序上執行,而上一段程序運行的一系列狀態如果不保存,就會丟失,因此操作系統引入了進程來進行資源隔離。

進程

進程是用來劃分程序運行時所需的基本資源單位,它擁有獨立的地址空間,獨立的堆棧,當進程切換時,就可以保證各自的數據存儲不受影響。

由于進程涉及到大量資源的消耗,所以由計算機操作系統嚴格管控(可以理解為:每個省市的土地資源審批,都是十分謹慎的,特別是一線城市,所以由核心部門統一管控)。

因此,進程的切換都發生在內核態,由計算機核心程序來統一調度。

小知識:

操作系統分為內核態與用戶態,處于內核態的 CPU(Central Processing Unit,核心處理器)可以訪問任意的數據。

包括網卡、硬盤等外圍設備,并且在占用的 CPU 不會發生搶占的情況。

而處于用戶態的 CPU 只能受限地訪問內存,不允許訪問外圍設備,用戶態下的 CPU 可能會被其它程序搶占。

線程

當進程切換時,由于要切換內核狀態,因此資源消耗比較大,對此又引入了線程的概念。

線程是操作系統調度的最小單位,是程序內部的一個執行流程。一個進程可以包含多個線程,它們共享進程的資源,如內存空間和文件句柄,但各自有獨立的棧內存。

線程本身幾乎不占用任何資源,它和本進程的其它線程共享地址空間,共享堆,所以調度時耗費比較小,但是它擁有獨立的 CPU 上下文(包括 CPU 寄存器、程序計數器等)。

線程好比與同一個進程里面的線程共享同一片土地資源,但是線程有各自的辦公樓,線程之間切換時也是由操作系統統一調度。

小知識:線程分為內核態線程與用戶態線程,用戶態線程必須要綁定到內核態線程中,才可運行。

3.2 多線程概念

多線程是一種并發執行的方式,它可以讓一個程序分為多個獨立的線程,每個線程可以獨立執行任務。這就好比在一塊土地資源上,可以同時施工而互不影響。

創建和管理線程

多線程的創建和管理涉及到操作系統的調度機制,在不同編程語言中有不同的實現方式。我們以 Python 為例:

import threading

def my_function():
   # 線程要執行的任務

thread = threading.Thread(target=my_function)
thread.start()  # 啟動線程

線程同步與互斥

當多個線程同時訪問共享資源時,可能會導致競態條件,即多個線程之間相互競爭資源,可能導致數據不一致。

為了解決這個問題,我們使用鎖機制,保證在同一時間只有一個線程可以訪問共享資源。

import threading

lock = threading.Lock()

def my_function():
   lock.acquire()  # 獲取鎖
   # 訪問共享資源
   lock.release()  # 釋放鎖

3.3 多線程應用

多線程不僅可以提高程序的性能,還可以改善用戶體驗。在現實生活中,我們經常遇到多線程應用的場景。

Web服務器

想象一個熱門的社交媒體網站,數百萬用戶同時在不同時間訪問該網站。

這些用戶會請求不同的頁面、上傳照片、發表帖子,同時還有一些后臺任務,如數據備份、新帖子推送等。

此時,Web 服務器需要同時處理來自多個用戶的請求。每個用戶的請求可以看作一個線程,多線程允許服務器同時響應多個請求。

例如,一個用戶可以請求查看自己的個人資料,而另一個用戶可以請求發布新的狀態更新。這兩個請求可以由不同的線程同時處理,提高了服務器的響應速度。

數據庫系統

假設一個在線銀行系統,數千名客戶同時訪問其賬戶信息,檢查余額、轉賬等。此外,銀行系統還需要處理客戶的存款和取款操作。

此時,數據庫系統需要同時處理多個客戶的請求。每個客戶請求可以看作一個線程,多線程可以同時查詢數據庫,確保每個客戶的賬戶信息都是最新的。

游戲交互

一個多人在線游戲,數十名玩家同時參與游戲。這個游戲需要同時處理玩家的操作、物理模擬、AI 計算和多人游戲互動。

此時,游戲引擎可以使用多線程來處理不同方面的任務。一個線程可以負責渲染游戲畫面,另一個線程可以處理玩家的操作,還有一個線程可以負責模擬游戲中的物理效果。

有了多線程,游戲系統的反饋會更加流暢,玩家也可以享受到高度互動的游戲體驗。

4. 總結

當談論多線程和并發,就好像是我們日常生活中的繁忙街頭,每個人都在處理自己的事情,但同時也需要協調與他人的互動。

這些不同的活動和任務就好比多線程中的多個線程,它們在同時運行,互相影響,但也需要有效的協調和管理。

高并發就像是一個繁忙的咖啡店需要應對顧客一樣,每個員工都在制作不同的咖啡,有人負責濃縮咖啡,有人負責蒸奶,有人負責服務顧客。這些員工就好比不同的線程,它們同時工作,但需要協調好咖啡的制作,以確保每杯咖啡都是完美的。

除了應對面試,多線程和高并發也是我們日常生活的縮影,它們讓不同的任務可以同時進行,提高了效率和體驗。但同時也需要良好的協調和管理,以避免混亂和沖突。

多線程和高并發是現代計算機科學的一部分,也是我們生活中的一種常態。

希望這篇文章能幫助大家更好地理解并欣賞多線程和高并發在我們的數字世界中的作用。

責任編輯:武曉燕 來源: xin猿意碼
相關推薦

2023-08-09 09:03:49

CPU密集型運算

2017-09-27 15:50:42

Java多線程并發

2021-09-06 07:58:47

鏈表數據結構

2018-12-20 09:30:59

分布式高并發多線程

2020-06-30 09:12:34

高并發薪資并發量

2020-10-13 07:44:45

理解分布式

2020-05-20 22:13:26

JVM加載機制虛擬機

2019-01-24 09:42:55

系統高并發面試

2021-04-28 08:00:16

多線程高并發操作

2019-07-31 09:06:35

Java跳槽那些事兒文章

2023-10-08 09:34:11

Java編程

2019-05-27 08:11:13

高并發Synchronize底層

2020-11-09 09:03:35

高并發多線程ThreadLocal

2022-02-18 06:56:18

Wi-Fi路由器局域網

2019-11-29 10:16:36

高并發系統緩存

2021-02-05 12:34:33

線程池系統

2021-04-30 05:45:41

多線程Java基礎面試題

2009-03-12 10:52:43

Java線程多線程

2023-10-18 15:19:56

2021-02-26 05:20:42

Java參數化泛型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美a在线 | a级在线免费 | 在线观看免费av网 | 成人影院免费视频 | 日本三级网址 | 久久精品青青大伊人av | 国产在线拍偷自揄拍视频 | 欧美一区二区在线观看视频 | 亚洲精品一区中文字幕乱码 | 国产一区在线免费观看视频 | 日韩免费看视频 | 久久精品亚洲精品国产欧美 | 成人免费看黄网站在线观看 | 国产午夜精品一区二区三区在线观看 | 国产精品777一区二区 | 日日碰碰| 国产女人与拘做受免费视频 | 国产一区二区高清在线 | 久久伊人一区二区 | 网络毛片 | 中文字幕视频在线观看 | 精品国产乱码久久久久久闺蜜 | 久久91精品国产一区二区 | 在线中文av| 久久精品97 | 久久久.com| 午夜影视在线观看 | 在线中文字幕日韩 | 久久成人综合 | 国产成人jvid在线播放 | 日韩免费av一区二区 | 99av成人精品国语自产拍 | 欧美激情国产日韩精品一区18 | 成人3d动漫一区二区三区91 | 午夜精品久久久久久久久久久久 | 久久久精品网站 | 99久久久国产精品 | 亚洲欧洲日本国产 | 喷水毛片 | 日韩毛片在线视频 | 亚洲欧洲在线看 |