1. 程式人生 > >分散式系統詳解--基礎知識(執行緒)

分散式系統詳解--基礎知識(執行緒)

                     分散式系統詳解--基礎知識(執行緒)

一、導讀

          前面跟大家講了一下  分散式系統詳解--基礎知識(概論) ,可以稍微瞭解一下大體上分散式是怎麼一回事了。這片篇文章主要是講述一下執行緒的問題分別介紹一下,什麼執行緒,程序和執行緒之間的關係,最後文章後面介紹一下多執行緒和分散式之間的關係。

二、來看看圖解定義(看圖理解定義效果更好~)

程式:就是為了解決某些特定問題或實現特定目標運用計算機語言編寫的命令序列集合(都懂吧~~不懂再百度)。

程序:程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。

執行緒:程式執行流的最小單元。

小明開了一家工廠,工廠中設立了三個車間,有30個員工。為了員工福利,蓋了一個餐廳,一個浴室,當然也有個一個廁所。

CPU:計算機的核心就是CPU。就像是一家工廠,加工製造時刻的運作著。

程序:程序呢,就像是工廠當中車間一樣,如果給車間供應的電僅僅夠一個車間使用,那麼當一個車間開工的時候其他車間只能乾瞪眼。這就說到了單個CPU一次只能執行一個程序,現在的處理器是多執行緒處理器,可以同時處理多個程序。

執行緒:車間裡的每一個員工就相當於程序中的一個執行緒,員工協同完成任務,執行緒也是協同完成一個程序。

記憶體:每個車間有固定的大小,員工的人數不易太多。對於執行緒來說也是這樣,執行緒開啟,意味著會佔用一定的記憶體。

互斥鎖:現在的公共廁所中只能允許進去一個人,進入之後,其他人就需要在外面等著。相對於記憶體而言,就是防止多個執行緒同時使用一塊共同的一塊記憶體。

共享記憶體:開的浴室,大家都可以進(當然男的進男浴室~女的進女浴室~),程序的記憶體空間是共享的,每個執行緒共享這些記憶體。

訊號量:但是浴室的人數也是有上線的,當人數達到一定程度就不能再進去了,那怎麼辦呢?就可以在門外掛上n把鑰匙,每進去一個,拿一把鑰匙,當員工出來的時候再把鑰匙掛在外面的牆上,後來有人來的時候發現門外沒有鑰匙的時候,就需要等在外面。執行緒也是如此。這叫訊號量。

好了,差不多了吧******

三、讓我們來看一看Java中的多執行緒

示意圖:

new(新建狀態):實現runnable介面或繼承Thread類。new一個例項:

Thread t = new MyThread();

在這兒需要值得注意的一個地方。為什麼實現runnable介面和繼承Thread類之後重寫run方法就行了呢?下面~~

public class java.lang.Thread implements java.lang.Runnable {

Runnable(就緒狀態):在這兒t.start();方法就可以進入到就緒狀態,該執行緒也就是做好了準備隨時準備被CPU呼叫,但這個時候還沒被執行。

Running(執行狀態):當CPU開始排程正在處於就緒狀態的執行緒時,此時執行緒得以真正進行執行。也就是說,就緒狀態是進入到執行狀態的唯一入口。

Blocked(阻塞狀態):執行緒運行當中因為某種原因,暫時放棄了CPU 的使用權,執行緒自動跑到阻塞狀態。此時他們需要經過一些等待或者被喚醒才能重新回到就緒狀態等待重新執行。而阻塞的狀態有三種類型,如圖所示:

(1)等待阻塞:執行過程中呼叫了wait()方法,進入等待阻塞。

(2)同步阻塞:執行緒在獲取synchronized同步鎖失敗,其他執行緒正在使用,他就進入了同步阻塞。

(3)其他阻塞:通過呼叫執行緒的sleep()或join()或發出了I/O請求時,執行緒會進入到阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。

死亡狀態(Dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

關於Java實現多執行緒的例子,網上一大堆,就不羅列了。

四、多執行緒在分散式下的擴充套件-叢集

       這裡再重複贅述一下叢集的概念,其實就是同一個機組之下多個節點完成同樣的事情,這就和多執行緒說到一塊兒了。在這兒要說另外的兩個定義,第一個是app叢集,第二個是資料庫叢集。

app叢集:一般有一個管理節點,它做的事情很少,但是卻非常重要,我們可以從這個管理節點中獲取每一個節點的一些應用部署和配置以及狀態資訊;另外一個是代理節點或者叫分發節點,這個作用是在管理節點之下做分發,這裡要保持session一致。叢集在這裡做到的就是一臺機器掛掉了之後,其餘的可以頂替。在這裡叢集組也就相當於一個大的執行緒組。

資料庫叢集:這個相對於app叢集來說就要難一點了。app叢集在垂直擴充套件上會很方便,但是資料庫叢集要做的是資料的一致性,實現事務級別的切換和一定的網路計算能力。記憶體中也比較複雜,因為資料讀入到記憶體中要將多個主機的記憶體配置得像一個記憶體一樣(通過心跳完成),而且需要得到動態擴充套件的能力。

引用一位大牛的話,可以自己品一品

        大型系統架構最終資料分佈,集中式管理,分散式儲存計算,業務級別橫向切割,同業務下app垂直分隔,資料級別雜湊+range+點陣圖分佈結構,異地分流容災,待命機組和資源調配的整合,這一切的基礎都來源於多執行緒的設計思想架構在分散式機組上的實現。

嗯,這是對執行緒最基本的認識,也是後期學習的必備知識,應當掌握。

歡迎訂閱關注公眾號(JAVA和人工智慧)

                                                           獲取更多免費書籍、資源、視訊資料

 

                                    

文章回顧連結:

 1,分散式系統詳解--基礎知識(概論

 2,分散式系統詳解--基礎知識(執行緒)

 3,分散式系統詳解--基礎知識(通訊)

 4,分散式系統詳解--基礎知識(CAP)

 5,分散式系統詳解--基礎知識(安全)

 6,分散式系統詳解--基礎知識(併發)

 7,分散式系統詳解--架構簡介(微服務)

 8,分散式系統詳解--Linux(許可權)

 9,分散式系統詳解--框架(Hadoop-單機版搭建)

10,分散式系統詳解--架構(Hadoop-克隆伺服器)

11,分散式系統詳解--框架(Hadoop-叢集搭建)

12,分散式系統詳解--框架(Hadoop-Ssh免密登陸配置)