日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
面試薪水被壓?那是你還不懂多線程和高并發(fā)

1.引言

大家好,我是小,一個漂泊江湖多年的 985 非科班程序員,曾混跡于國企、互聯(lián)網(wǎng)大廠和創(chuàng)業(yè)公司的后臺開發(fā)攻城獅。

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

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

圖片

日常工作中,隨著移動互聯(lián)網(wǎng)應(yīng)用的興起和發(fā)展,我們面對的系統(tǒng)任務(wù)和問題也變得越來越復(fù)雜。

無論是構(gòu)建大規(guī)模的 Web 應(yīng)用、處理龐大的數(shù)據(jù)集,還是開發(fā)高性能的游戲,都需要應(yīng)對一個共同的挑戰(zhàn):高并發(fā)。

1.1 什么是高并發(fā)?

高并發(fā)是指在同一時間段內(nèi)有大量用戶或程序在訪問和使用某個服務(wù)或資源。

這意味著我們需要在同一時間內(nèi)處理大量的請求、數(shù)據(jù)和任務(wù)。如何高效地處理這種情況,就成了一項(xiàng)關(guān)鍵的技術(shù)任務(wù)。

高并發(fā)是一個充滿挑戰(zhàn)的領(lǐng)域,但同時也是一個充滿機(jī)會的領(lǐng)域。

1.2 多線程和高并發(fā)有啥關(guān)系?

解決高并發(fā)問題不僅能夠提高系統(tǒng)的性能,還能夠改善用戶體驗(yàn),為企業(yè)帶來更多的商機(jī)。

而多線程技術(shù),正是應(yīng)對高并發(fā)挑戰(zhàn)的重要工具之一。

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

相信無論你是初級程序員還是有一定經(jīng)驗(yàn)的開發(fā)者,都能夠在這篇文章中找到有用的信息。

2. 高并發(fā)

2.1 并發(fā)與并行

并發(fā)

并發(fā)是指多個任務(wù)在相同的時間段內(nèi)執(zhí)行。在單核處理器上,多個線程之間通過時間片輪轉(zhuǎn)方式切換執(zhí)行,造成了并發(fā)場景。

圖片

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

并行

在多核處理器上,真正的并發(fā)可以實(shí)現(xiàn)多個線程同時執(zhí)行不同的任務(wù)——也就是并行。

圖片

并行是指多個任務(wù)在同一時刻執(zhí)行,通常需要多核處理器。并行是并發(fā)的一個子集,只有當(dāng)硬件支持多個并行執(zhí)行單元時才能實(shí)現(xiàn)真正的并行。

思考題

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

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

2.2 多高的并發(fā)才算高并發(fā)?

了解了并發(fā)的概念,現(xiàn)在我們來聊一聊高并發(fā)。

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

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

2.3 高并發(fā)的挑戰(zhàn)

高并發(fā)雖然帶來了許多機(jī)會,但也伴隨著很多挑戰(zhàn)。

比如,高并發(fā)系統(tǒng)需要在短時間內(nèi)處理大量請求,而不降低系統(tǒng)的性能或響應(yīng)速度。

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

在分布式系統(tǒng)中,不管是多個用戶訪問,還是多個客戶端訪問服務(wù)器,歸根到底都是各服務(wù)器的業(yè)務(wù)線程來訪問共享資源,所以,高并發(fā)的挑戰(zhàn)幾乎都是與多線程相關(guān)的。

在面對高并發(fā)時,具體會出現(xiàn)以下幾個問題。

圖片

1. 競態(tài)條件

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

2. 死鎖

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

3. 資源爭用

多線程訪問共享資源時,可能導(dǎo)致資源爭奪問題,降低性能。例如,多個線程同時競爭數(shù)據(jù)庫連接,導(dǎo)致數(shù)據(jù)庫響應(yīng)變慢。

4. 線程安全

需要確保多線程訪問共享數(shù)據(jù)時不會引發(fā)錯誤。例如,在多線程環(huán)境下,需要確保對數(shù)據(jù)的讀寫是安全的。

5. 調(diào)試難度

由于多線程的執(zhí)行順序是不確定的,問題可能出現(xiàn)在不同的時機(jī)。所以多線程程序的調(diào)試相對復(fù)雜,問題難以重現(xiàn)。

2.4 解決高并發(fā)問題

為了解決高并發(fā)問題,需要采用適當(dāng)?shù)募夹g(shù)和方法,具體有以下幾種。

圖片

1. 鎖機(jī)制

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

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

具體實(shí)現(xiàn)細(xì)節(jié)可以使用編程語言提供的鎖機(jī)制,如 Java 中的 synchronized 關(guān)鍵字或 Python 中的 threading.Lock。

2. 并發(fā)數(shù)據(jù)結(jié)構(gòu)

使用并發(fā)數(shù)據(jù)結(jié)構(gòu),如并發(fā)隊(duì)列和哈希表,減少資源爭用。這些數(shù)據(jù)結(jié)構(gòu)經(jīng)過優(yōu)化,能夠在多線程環(huán)境下高效工作。

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

3. 線程池

管理和重用線程,提高性能。線程池可以控制線程的數(shù)量,避免線程過多導(dǎo)致資源浪費(fèi)。

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

4. 消息傳遞

通過消息傳遞模型進(jìn)行線程間通信,避免共享內(nèi)存。消息傳遞可以確保線程之間的數(shù)據(jù)安全傳遞,減少競態(tài)條件。

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

5. 原子操作

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

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

3. 多線程

3.1 進(jìn)程與線程

當(dāng)并發(fā)工作中的某一個任務(wù)完成后,會從一段程序切換到另一段程序上執(zhí)行,而上一段程序運(yùn)行的一系列狀態(tài)如果不保存,就會丟失,因此操作系統(tǒng)引入了進(jìn)程來進(jìn)行資源隔離。

進(jìn)程

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

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

因此,進(jìn)程的切換都發(fā)生在內(nèi)核態(tài),由計(jì)算機(jī)核心程序來統(tǒng)一調(diào)度。

小知識:

操作系統(tǒng)分為內(nèi)核態(tài)與用戶態(tài),處于內(nèi)核態(tài)的 CPU(Central Processing Unit,核心處理器)可以訪問任意的數(shù)據(jù)。

包括網(wǎng)卡、硬盤等外圍設(shè)備,并且在占用的 CPU 不會發(fā)生搶占的情況。

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

線程

當(dāng)進(jìn)程切換時,由于要切換內(nèi)核狀態(tài),因此資源消耗比較大,對此又引入了線程的概念。

線程是操作系統(tǒng)調(diào)度的最小單位,是程序內(nèi)部的一個執(zhí)行流程。一個進(jìn)程可以包含多個線程,它們共享進(jìn)程的資源,如內(nèi)存空間和文件句柄,但各自有獨(dú)立的棧內(nèi)存。

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

線程好比與同一個進(jìn)程里面的線程共享同一片土地資源,但是線程有各自的辦公樓,線程之間切換時也是由操作系統(tǒng)統(tǒng)一調(diào)度。

小知識:線程分為內(nèi)核態(tài)線程與用戶態(tài)線程,用戶態(tài)線程必須要綁定到內(nèi)核態(tài)線程中,才可運(yùn)行。

3.2 多線程概念

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

創(chuàng)建和管理線程

多線程的創(chuàng)建和管理涉及到操作系統(tǒng)的調(diào)度機(jī)制,在不同編程語言中有不同的實(shí)現(xiàn)方式。我們以 Python 為例:

import threading

def my_function():
   # 線程要執(zhí)行的任務(wù)

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

線程同步與互斥

當(dāng)多個線程同時訪問共享資源時,可能會導(dǎo)致競態(tài)條件,即多個線程之間相互競爭資源,可能導(dǎo)致數(shù)據(jù)不一致。

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

import threading

lock = threading.Lock()

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

3.3 多線程應(yīng)用

多線程不僅可以提高程序的性能,還可以改善用戶體驗(yàn)。在現(xiàn)實(shí)生活中,我們經(jīng)常遇到多線程應(yīng)用的場景。

Web服務(wù)器

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

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

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

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

數(shù)據(jù)庫系統(tǒng)

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

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

游戲交互

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

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

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

4. 總結(jié)

當(dāng)談?wù)摱嗑€程和并發(fā),就好像是我們?nèi)粘I钪械姆泵诸^,每個人都在處理自己的事情,但同時也需要協(xié)調(diào)與他人的互動。

這些不同的活動和任務(wù)就好比多線程中的多個線程,它們在同時運(yùn)行,互相影響,但也需要有效的協(xié)調(diào)和管理。

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

除了應(yīng)對面試,多線程和高并發(fā)也是我們?nèi)粘I畹目s影,它們讓不同的任務(wù)可以同時進(jìn)行,提高了效率和體驗(yàn)。但同時也需要良好的協(xié)調(diào)和管理,以避免混亂和沖突。

多線程和高并發(fā)是現(xiàn)代計(jì)算機(jī)科學(xué)的一部分,也是我們生活中的一種常態(tài)。

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


新聞名稱:面試薪水被壓?那是你還不懂多線程和高并發(fā)
文章鏈接:http://www.dlmjj.cn/article/cojgsij.html