從根上理解高性能、高併發(七):深刻操做系統,一文讀懂進程、線程、協程

本文引用了「一文讀懂什麼是進程、線程、協程」一文的主要內容,感謝原做者的無私分享。php

一、系列文章引言

1.1 文章目的

做爲即時通信技術的開發者來講,高性能、高併發相關的技術概念早就瞭然與胸,什麼線程池、零拷貝、多路複用、事件驅動、epoll等等名詞信手拈來,又或許你對具備這些技術特徵的技術框架好比:Java的Netty、Php的workman、Go的gnet等熟練掌握。但真正到了面視或者技術實踐過程當中遇到沒法釋懷的疑惑時,方知自已所掌握的不過是皮毛。html

返璞歸真、迴歸本質,這些技術特徵背後的底層原理究竟是什麼?如何能通俗易懂、絕不費力真正透徹理解這些技術背後的原理,正是《從根上理解高性能、高併發》系列文章所要分享的。node

1.2 文章源起

我整理了至關多有關IM、消息推送等即時通信技術相關的資源和文章,從最開始的開源IM框架MobileIMSDK,到網絡編程經典鉅著《TCP/IP詳解》的在線版本,再到IM開發綱領性文章《新手入門一篇就夠:從零開發移動端IM》,以及網絡編程由淺到深的《網絡編程懶人入門》、《腦殘式網絡編程入門》、《高性能網絡編程》、《鮮爲人知的網絡編程》系列文章。laravel

越往知識的深處走,越以爲對即時通信技術瞭解的太少。因而後來,爲了讓開發者門更好地從基礎電信技術的角度理解網絡(尤爲移動網絡)特性,我跨專業收集整理了《IM開發者的零基礎通訊技術入門》系列高階文章。這系列文章已然是普通即時通信開發者的網絡通訊技術知識邊界,加上以前這些網絡編程資料,解決網絡通訊方面的知識盲點基本夠用了。git

對於即時通信IM這種系統的開發來講,網絡通訊知識確實很是重要,但迴歸到技術本質,實現網絡通訊自己的這些技術特徵:包括上面提到的線程池、零拷貝、多路複用、事件驅動等等,它們的本質是什麼?底層原理又是怎樣?這就是整理本系列文章的目的,但願對你有用。程序員

1.3 文章目錄

從根上理解高性能、高併發(一):深刻計算機底層,理解線程與線程池
從根上理解高性能、高併發(二):深刻操做系統,理解I/O與零拷貝技術
從根上理解高性能、高併發(三):深刻操做系統,完全理解I/O多路複用
從根上理解高性能、高併發(四):深刻操做系統,完全理解同步與異步
從根上理解高性能、高併發(五):深刻操做系統,理解高併發中的協程
從根上理解高性能、高併發(六):通俗易懂,高性能服務器究竟是如何實現的
從根上理解高性能、高併發(七):深刻操做系統,一文讀懂進程、線程、協程》(* 本文)

1.4 本篇概述

本系文章中的《從根上理解高性能、高併發(一):深刻計算機底層,理解線程與線程池》、《從根上理解高性能、高併發(五):深刻操做系統,理解高併發中的協程》兩篇文章,雖然都有涉及到進程、線程、協程知識,但感受仍是不夠系統,系統單獨整理了本文,但願將這方面的知識系統梳理和總結,達到完全解惑的目的。github

本篇是本系列文章的臨時續篇,本篇將由淺入深,總結進程、線程、協程這3個技術概念,將3者的技術原理、用途、關係進行了系統梳理和總結,但願有助於解決你這方面的技術困惑。數據庫

本文已同步發佈於「即時通信技術圈」公衆號,歡迎關注。公衆號上的連接是:點此進入編程

二、本文原做者

本文內容引用了「一文讀懂什麼是進程、線程、協程」一文的主要內容(原文地址已沒法查到),原做者:luoweifu,畢業於江西農業大學,現就任於阿里釘釘。我的博客地址:https://blog.csdn.net/luoweifu瀏覽器

三、什麼是進程?

3.1 基本常識

咱們須要明確一下幾個常識:

  • 1)計算機的核心是CPU,它承擔了全部的計算任務;
  • 2)操做系統是計算機的管理者,它負責任務的調度、資源的分配和管理,統領整個計算機硬件;
  • 3)應用程序則是具備某種功能的程序,程序是運行於操做系統之上的。

進程是一個具備必定獨立功能的程序在一個數據集上的一次動態執行的過程,是操做系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。進程是一種抽象的概念,歷來沒有統一的標準定義。

進程通常由程序、數據集合和進程控制塊三部分組成:

  • 1)程序用於描述進程要完成的功能,是控制進程執行的指令集;
  • 2)數據集合是程序在執行時所須要的數據和工做區;
  • 3)程序控制塊(Program Control Block,簡稱PCB),包含進程的描述信息和控制信息,是進程存在的惟一標誌。

進程具備的特徵:

  • 1)動態性:進程是程序的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;
  • 2)併發性:任何進程均可以同其餘進程一塊兒併發執行;
  • 3)獨立性:進程是系統進行資源分配和調度的一個獨立單位;
  • 4)結構性:進程由程序、數據和進程控制塊三部分組成。

3.2 爲何要有多進程?

多進程目的:提升cpu的使用率。

一個例子:一個用戶如今既想使用打印機,又想玩遊戲。

假設只有一個進程(先不談多線程):

從操做系統的層面看,咱們使用打印機的步驟有以下:

  • 1)使用CPU執行程序,去硬盤讀取須要打印的文件,而後CPU會長時間的等待,直到硬盤讀寫完成;
  • 2)使用CPU執行程序,讓打印機打印這些內容,而後CPU會長時間的等待,等待打印結束。

在這樣的狀況下:其實CPU的使用率其實很是的低。

打印一個文件從頭至尾須要的時間多是1分鐘,而cpu使用的時間總和可能加起來只有幾秒鐘。然後面若是單進程執行遊戲的程序的時候,CPU也一樣會有大量的空閒時間。

使用多進程後:

當CPU在等待硬盤讀寫文件,或者在等待打印機打印的時候,CPU能夠去執行遊戲的程序,這樣CPU就能儘量高的提升使用率。

再具體一點說,其實也提升了效率。由於在等待打印機的時候,這時候顯卡也是閒置的,若是用多進程並行的話,遊戲進程徹底能夠並行使用顯卡,而且與打印機之間也不會互相影響。

3.3 小結一下

進程,直觀點說:保存在硬盤上的程序運行之後,會在內存空間裏造成一個獨立的內存體,這個內存體有本身獨立的地址空間,有本身的堆,上級掛靠單位是操做系統。

操做系統會以進程爲單位,分配系統資源(CPU時間片、內存等資源),進程是資源分配的最小單位。

四、什麼是線程?

4.1 基本常識

早期:操做系統中並無線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執行的最小單位。任務調度採用的是時間片輪轉的搶佔式調度方式,而進程是任務調度的最小單位,每一個進程有各自獨立的一塊內存,使得各個進程之間內存地址相互隔離。

後來:隨着計算機的發展,對CPU的要求愈來愈高,進程之間的切換開銷較大,已經沒法知足愈來愈複雜的程序的要求了。因而就發明了線程。

線程是程序執行中一個單一的順序控制流程:

  • 1)是程序執行流的最小單元;
  • 2)是處理器調度和分派的基本單位。

一個進程能夠有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。一個標準的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內存空間(代碼、數據、進程空間、打開的文件)和一個或多個線程組成。

PS:讀到這裏可能有的讀者迷糊,感受這和Java的內存空間模型不太同樣,但若是你深刻的讀過《深刻理解Java虛擬機》這本書的話你就會恍然大悟。

如上圖所示:在任務管理器的進程一欄裏,有道詞典和有道雲筆記就是進程,而在進程下又有着多個執行不一樣任務的線程。

4.2 任務調度

線程是什麼?要理解這個概念,須要先了解一下操做系統的一些相關概念。

大部分操做系統(如Windows、Linux)的任務調度是採用時間片輪轉的搶佔式調度方式。

在一個進程中:當一個線程任務執行幾毫秒後,會由操做系統的內核(負責管理各個任務)進行調度,經過硬件的計數器中斷處理器,讓該線程強制暫停並將該線程的寄存器放入內存中,經過查看線程列表決定接下來執行哪個線程,並從內存中恢復該線程的寄存器,最後恢復該線程的執行,從而去執行下一個任務。

上述過程當中:任務執行的那一小段時間叫作時間片,任務正在執行時的狀態叫運行狀態,被暫停的線程任務狀態叫作就緒狀態,意爲等待下一個屬於它的時間片的到來。

這種方式保證了每一個線程輪流執行,因爲CPU的執行效率很是高,時間片很是短,在各個任務之間快速地切換,給人的感受就是多個任務在「同時進行」,這也就是咱們所說的併發(別以爲併發有多高深,它的實現很複雜,但它的概念很簡單,就是一句話:多個任務同時執行)。

多任務運行過程的示意圖以下:

▲ 操做系統中的任務調度

4.3 進程與線程的區別

前面講了進程與線程,但可能你還以爲迷糊,感受他們很相似。的確,進程與線程有着千絲萬縷的關係。

下面就讓咱們一塊兒來理一理:

  • 1)線程是程序執行的最小單位,而進程是操做系統分配資源的最小單位;
  • 2)一個進程由一個或多個線程組成,線程是一個進程中代碼的不一樣執行路線;
  • 3)進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集、堆等)及一些進程級的資源(如打開文件和信號),某進程內的線程在其它進程不可見;
  • 4)線程上下文切換比進程上下文切換要快得多。

如下線程與進程關係的示意圖。

▲ 進程與線程的資源共享關係

▲ 單線程與多線程的關係

總之:線程和進程都是一種抽象的概念,線程是一種比進程更小的抽象,線程和進程均可用於實現併發。

在早期的操做系統中並無線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執行的最小單位。它至關於一個進程裏只有一個線程,進程自己就是線程。因此線程有時被稱爲輕量級進程(Lightweight Process,LWP)。

▲ 早期的操做系統只有進程,沒有線程

後來:隨着計算機的發展,對多個任務之間上下文切換的效率要求愈來愈高,就抽象出一個更小的概念——線程,通常一個進程會有多個(也能夠是一個)線程。

▲ 線程的出現,使得一個進程能夠有多個線程

4.4 多線程與多核

上面提到的時間片輪轉的調度方式說一個任務執行一小段時間後強制暫停去執行下一個任務,每一個任務輪流執行。不少操做系統的書都說「同一時間點只有一個任務在執行」。

那有人可能就要問雙核處理器呢?難道兩個核不是同時運行嗎?

其實:「同一時間點只有一個任務在執行」這句話是不許確的,至少它是不全面的。那多核處理器的狀況下,線程是怎樣執行呢?這就須要瞭解內核線程。

_多核(心)處理器是指:_在一個處理器上集成多個運算核心從而提升計算能力,也就是有多個真正並行計算的處理核心,每個處理核心對應一個內核線程。

內核線程(Kernel Thread,KLT):就是直接由操做系統內核支持的線程,這種線程由內核來完成線程切換,內核經過操做調度器對線程進行調度,並負責將線程的任務映射到各個處理器上。

通常一個處理核心對應一個內核線程,好比單核處理器對應一個內核線程,雙核處理器對應兩個內核線程,四核處理器對應四個內核線程。

如今的電腦通常是雙核四線程、四核八線程,是採用超線程技術將一個物理處理核心模擬成兩個邏輯處理核心,對應兩個內核線程,因此在操做系統中看到的CPU數量是實際物理CPU數量的兩倍,如你的電腦是雙核四線程,打開「任務管理器 -> 性能」能夠看到4個CPU的監視器,四核八線程能夠看到8個CPU的監視器。

▲ 雙核四線程在Windows8下查看的結果

超線程技術:就是利用特殊的硬件指令,把一個物理芯片模擬成兩個邏輯處理核心,讓單個處理器都能使用線程級並行計算,進而兼容多線程操做系統和軟件,減小了CPU的閒置時間,提升的CPU的運行效率。這種超線程技術(如雙核四線程)由處理器硬件的決定,同時也須要操做系統的支持才能在計算機中表現出來。

程序通常不會直接去使用內核線程,而是去使用內核線程的一種高級接口——輕量級進程(Lightweight Process,LWP),輕量級進程就是咱們一般意義上所講的線程,也被叫作用戶線程。

因爲每一個輕量級進程都由一個內核線程支持,所以只有先支持內核線程,纔能有輕量級進程。

用戶線程與內核線程的對應關係有三種模型:

  • 1)一對一模型;
  • 2)多對一模型;
  • 3)多對多模型。

在下面的文字中,將以4個內核線程、3個用戶線程爲例對三種模型進行說明。

4.5 一對一模型

對於一對一模型來講:一個用戶線程就惟一地對應一個內核線程(反過來不必定成立,一個內核線程不必定有對應的用戶線程)。

這樣:若是CPU沒有采用超線程技術(如四核四線程的計算機),一個用戶線程就惟一地映射到一個物理CPU的內核線程,線程之間的併發是真正的併發。

一對一模型使用戶線程具備與內核線程同樣的優勢:一個線程因某種緣由阻塞時其餘線程的執行不受影響(此處,一對一模型也可讓多線程程序在多處理器的系統上有更好的表現)。

但一對一模型也有兩個缺點:

  • 1)許多操做系統限制了內核線程的數量,所以一對一模型會使用戶線程的數量受到限制;
  • 2)許多操做系統內核線程調度時,上下文切換的開銷較大,致使用戶線程的執行效率降低。

▲ 一對一模型

4.6 多對一模型

多對一模型將多個用戶線程映射到一個內核線程上,線程之間的切換由用戶態的代碼來進行,系統內核感覺不到線程的實現方式。用戶線程的創建、同步、銷燬等都在用戶態中完成,不須要內核的介入。

所以,相對一對一模型:

  • 1)多對一模型的線程上下文切換速度要快許多;
  • 2)多對一模型對用戶線程的數量幾乎無限制。

但多對一模型也有兩個缺點:

  • 1)若是其中一個用戶線程阻塞,那麼其它全部線程都將沒法執行,由於此時內核線程也隨之阻塞了;
  • 2)在多處理器系統上,處理器數量的增長對多對一模型的線程性能不會有明顯的增長,由於全部的用戶線程都映射到一個處理器上了。

▲ 多對一模型

4.7 多對多模型

多對多模型結合了一對一模型和多對一模型的優勢:將多個用戶線程映射到多個內核線程上,由線程庫負責在可用的可調度實體上調度用戶線程。

這使得線程的上下文切換很是快:由於它避免了系統調用。可是增長了複雜性和優先級倒置的可能性,以及在用戶態調度程序和內核調度程序之間沒有普遍(且高昂)協調的次優調度。

多對多模型的優勢有:

  • 1)一個用戶線程的阻塞不會致使全部線程的阻塞,由於此時還有別的內核線程被調度來執行;
  • 2)多對多模型對用戶線程的數量沒有限制;
  • 3)在多處理器的操做系統中,多對多模型的線程也能獲得必定的性能提高,但提高的幅度不如一對一模型的高。

▲ 多對多模型

在如今流行的操做系統中,大都採用多對多的模型。

4.8 查看進程與線程

一個應用程序多是多線程的,也多是多進程的,如何查看呢?

在Windows下咱們只須打開任務管理器就能查看一個應用程序的進程和線程數。按「_Ctrl+Alt+Del_」或右鍵快捷工具欄打開任務管理器。

查看進程數和線程數:

在「進程」選項卡下,咱們能夠看到一個應用程序包含的線程數。

若是一個應用程序有多個進程,咱們能看到每個進程,如在上圖中,Google的Chrome瀏覽器就有多個進程。

同時,若是打開了一個應用程序的多個實例也會有多個進程,如上圖中我打開了兩個cmd窗口,就有兩個cmd進程。若是看不到線程數這一列,能夠再點擊「查看 -> 選擇列」菜單,增長監聽的列。

查看CPU和內存的使用率:在性能選項卡中,咱們能夠查看CPU和內存的使用率,根據CPU使用記錄的監視器的個數還能看出邏輯處理核心的個數,如個人雙核四線程的計算機就有四個監視器。

▲ 查看CPU和內存的使用率

4.9 線程的生命週期

當線程的數量小於處理器的數量時,線程的併發是真正的併發,不一樣的線程運行在不一樣的處理器上。

但當線程的數量大於處理器的數量時,線程的併發會受到一些阻礙,此時並非真正的併發,由於此時至少有一個處理器會運行多個線程。

在單個處理器運行多個線程時,併發是一種模擬出來的狀態。操做系統採用時間片輪轉的方式輪流執行每個線程。如今,幾乎全部的現代操做系統採用的都是時間片輪轉的搶佔式調度方式,如咱們熟悉的Unix、Linux、Windows及macOS等流行的操做系統。

咱們知道線程是程序執行的最小單位,也是任務執行的最小單位。在早期只有進程的操做系統中,進程有五種狀態,建立、就緒、運行、阻塞(等待)、退出。早期的進程至關於如今的只有單個線程的進程,那麼如今的多線程也有五種狀態,如今的多線程的生命週期與早期進程的生命週期相似。

▲ 早期進程的生命週期

進程在運行過程有三種狀態:就緒、運行、阻塞,建立和退出狀態描述的是進程的建立過程和退出過程。

早期進程的生命週期詳細說明以下:

建立:進程正在建立,還不能運行。操做系統在建立進程時要進行的工做包括分配和創建進程控制塊表項、創建資源表格並分配資源、加載程序並創建地址空間;
就緒:時間片已用完,此線程被強制暫停,等待下一個屬於它的時間片到來;
運行:此線程正在執行,正在佔用時間片;
阻塞:也叫等待狀態,等待某一事件(如IO或另外一個線程)執行完;
退出:進程已結束,因此也稱結束狀態,釋放操做系統分配的資源。

▲ 線程的生命週期

線程的生命週期跟進程很相似:

建立:一個新的線程被建立,等待該線程被調用執行;
就緒:時間片已用完,此線程被強制暫停,等待下一個屬於它的時間片到來;
運行:此線程正在執行,正在佔用時間片;
阻塞:也叫等待狀態,等待某一事件(如IO或另外一個線程)執行完;
退出:一個線程完成任務或者其餘終止條件發生,該線程終止進入退出狀態,退出狀態釋放該線程所分配的資源。

五、什麼是協程?

5.1 基本常識

協程:英文Coroutines,是一種基於線程之上,但又比線程更加輕量級的存在,這種由程序員本身寫程序來管理的輕量級線程叫作「用戶空間線程」,具備對內核來講不可見的特性。

由於是自主開闢的異步任務,因此不少人也更喜歡叫它們纖程(Fiber),或者綠色線程(GreenThread)。

正如一個進程能夠擁有多個線程同樣,一個線程也能夠擁有多個協程。

5.2 協程的目的

對於Java程序員來講,在傳統的J2EE系統中都是基於每一個請求佔用一個線程去完成完整的業務邏輯(包括事務)。因此係統的吞吐能力取決於每一個線程的操做耗時。

若是遇到很耗時的I/O行爲,則整個系統的吞吐馬上降低,由於這個時候線程一直處於阻塞狀態,若是線程不少的時候,會存在不少線程處於空閒狀態(等待該線程執行完才能執行),形成了資源應用不完全。

最多見的例子就是JDBC(它是同步阻塞的),這也是爲何不少人都說數據庫是瓶頸的緣由。這裏的耗時實際上是讓CPU一直在等待I/O返回,說白了線程根本沒有利用CPU去作運算,而是處於空轉狀態。而另外過多的線程,也會帶來更多的ContextSwitch開銷。

對於上述問題:現階段行業裏的比較流行的解決方案之一就是單線程加上異步回調。其表明派是 node.js 以及 Java 裏的新秀 Vert.x 。

而協程的目的就是當出現長時間的I/O操做時,經過讓出目前的協程調度,執行下一個任務的方式,來消除ContextSwitch上的開銷。

5.3 協程的特色

協程的特色總結一下就是:

  • 1)線程的切換由操做系統負責調度,協程由用戶本身進行調度,所以減小了上下文切換,提升了效率;
  • 2)線程的默認Stack大小是1M,而協程更輕量,接近1K。所以能夠在相同的內存中開啓更多的協程;
  • 3)因爲在同一個線程上,所以能夠避免競爭關係而使用鎖;
  • 4)適用於被阻塞的,且須要大量併發的場景。但不適用於大量計算的多線程,遇到此種狀況,更好實用線程去解決。

5.4 協程的原理

當出現IO阻塞的時候,由協程的調度器進行調度,經過將數據流馬上yield掉(主動讓出),而且記錄當前棧上的數據,阻塞完後馬上再經過線程恢復棧,並把阻塞的結果放到這個線程上去跑。

這樣看上去好像跟寫同步代碼沒有任何差異,這整個流程能夠稱爲coroutine,而跑在由coroutine負責調度的線程稱爲Fiber。好比:Golang裏的 go關鍵字其實就是負責開啓一個Fiber,讓func邏輯跑在上面。

因爲協程的暫停徹底由程序控制,發生在用戶態上;而線程的阻塞狀態是由操做系統內核來進行切換,發生在內核態上。

所以:協程的開銷遠遠小於線程的開銷,也就沒有了ContextSwitch上的開銷。

5.5 協程和線程的比較

六、總結一下

針對上面的內容,咱們總結一下。

進程和線程的區別就是:

  • 1)調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位;
  • 2)併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也可併發執行;
  • 3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但能夠訪問隸屬於進程的資源;
  • 4)系統開銷:在建立或撤消進程時,因爲系統都要爲之分配和回收資源,致使系統的開銷明顯大於建立或撤消線程時的開銷。

進程和線程之間的聯繫就是:

  • 1)一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程;
  • 2)資源分配給進程,同一進程的全部線程共享該進程的全部資源;
  • 3)處理機分給線程,即真正在處理機上運行的是線程;
  • 4)線程在執行過程當中,須要協做同步。不一樣進程的線程間要利用消息通訊的辦法實現同步。

那麼,既然有了線程,爲啥還要有協程?

考慮這同樣一種場景:

開發者在每一個線程中只作很是輕量的操做,好比訪問一個極小的文件,下載一張極小的圖片,加載一段極小的文本等。可是,這樣」輕量的操做「的量卻很是多。

在有大量這樣的輕量操做的場景下,即便能夠經過使用線程池來避免建立與銷燬的開銷,可是線程切換的開銷也會很是大,甚至於接近操做自己的開銷。

對於這些場景,就很是須要一種能夠減小這些開銷的方式。因而,協程就應景而出,很是適合這樣的場景。

七、參考資料

[1] 進程、線程和協程之間的區別和聯繫

[2] 一篇文章理解進程、線程、協程

[3] 多進程、多線程與協程的引入

[4] 深刻計算機底層,理解線程與線程池

[5] 深刻操做系統,理解高併發中的協程

附錄:更多高性能、高併發文章精選

高性能網絡編程(一):單臺服務器併發TCP鏈接數到底能夠有多少
高性能網絡編程(二):上一個10年,著名的C10K併發鏈接問題
高性能網絡編程(三):下一個10年,是時候考慮C10M併發問題了
高性能網絡編程(四):從C10K到C10M高性能網絡應用的理論探索
高性能網絡編程(五):一文讀懂高性能網絡編程中的I/O模型
高性能網絡編程(六):一文讀懂高性能網絡編程中的線程模型
高性能網絡編程(七):到底什麼是高併發?一文即懂!
以網遊服務端的網絡接入層設計爲例,理解實時通訊的技術挑戰
知乎技術分享:知乎千萬級併發的高性能長鏈接網關技術實踐
淘寶技術分享:手淘億級移動端接入層網關的技術演進之路
一套海量在線用戶的移動端IM架構設計實踐分享(含詳細圖文)
一套原創分佈式即時通信(IM)系統理論架構方案
微信後臺基於時間序的海量數據冷熱分級架構設計實踐
微信技術總監談架構:微信之道——大道至簡(演講全文)
如何解讀《微信技術總監談架構:微信之道——大道至簡》
快速裂變:見證微信強大後臺架構從0到1的演進歷程(一)
17年的實踐:騰訊海量產品的技術方法論
騰訊資深架構師乾貨總結:一文讀懂大型分佈式系統設計的方方面面
以微博類應用場景爲例,總結海量社交系統的架構設計步驟
新手入門:零基礎理解大型分佈式架構的演進歷史、技術原理、最佳實踐
重新手到架構師,一篇就夠:從100到1000萬高併發的架構演進之路

本文已同步發佈於「即時通信技術圈」公衆號。

▲ 本文在公衆號上的連接是:點此進入。同步發佈連接是:http://www.52im.net/thread-3357-1-1.html

相關文章
相關標籤/搜索