自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

1.引言

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

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

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

圖片圖片

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

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

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

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

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

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

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

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

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

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

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

2. 高并發(fā)

2.1 并發(fā)與并行

并發(fā)

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

圖片圖片

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

并行

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

圖片圖片

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

思考題

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

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

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

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

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

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

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

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

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

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

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

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

圖片圖片

1. 競態(tài)條件

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

2. 死鎖

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

3. 資源爭用

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

4. 線程安全

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

5. 調(diào)試難度

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

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

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

圖片圖片

1. 鎖機制

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

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

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

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

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

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

3. 線程池

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

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

4. 消息傳遞

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

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

5. 原子操作

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

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

3. 多線程

3.1 進程與線程

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

進程

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

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

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

小知識:

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

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

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

線程

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

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

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

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

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

3.2 多線程概念

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

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

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

import threading

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

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

線程同步與互斥

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

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

import threading

lock = threading.Lock()

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

3.3 多線程應用

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

Web服務器

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

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

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

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

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

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

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

游戲交互

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

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

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

4. 總結(jié)

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

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

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

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

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

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

責任編輯:武曉燕 來源: xin猿意碼
相關(guān)推薦

2023-08-09 09:03:49

CPU密集型運算

2017-09-27 15:50:42

Java多線程并發(fā)

2018-12-20 09:30:59

分布式高并發(fā)多線程

2020-06-30 09:12:34

高并發(fā)薪資并發(fā)量

2021-09-06 07:58:47

鏈表數(shù)據(jù)結(jié)構(gòu)

2020-10-13 07:44:45

理解分布式

2019-01-24 09:42:55

系統(tǒng)高并發(fā)面試

2021-04-28 08:00:16

多線程高并發(fā)操作

2023-10-08 09:34:11

Java編程

2019-07-31 09:06:35

Java跳槽那些事兒文章

2020-05-20 22:13:26

JVM加載機制虛擬機

2019-05-27 08:11:13

高并發(fā)Synchronize底層

2020-11-09 09:03:35

高并發(fā)多線程ThreadLocal

2019-11-29 10:16:36

高并發(fā)系統(tǒng)緩存

2023-10-18 15:19:56

2009-03-12 10:52:43

Java線程多線程

2021-04-30 05:45:41

多線程Java基礎面試題

2022-02-18 06:56:18

Wi-Fi路由器局域網(wǎng)

2021-10-06 19:01:45

高并發(fā)熔斷預熱

2021-02-05 12:34:33

線程池系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號