淺談程序設計中的線程、進程、分佈式系統

  • 單線程與多線程的比較:

        單線程就是我們學習編程時最開始接觸的,比如寫一個"hello world"。而在多線程中,其共享code、data、files,同時,它們有各自的registers和stack。

        簡單地說,多線程有如下的複雜性特點:

1、對資源、數據的安全性:鎖保護

2、原子性:數據操作是天然互斥的

3、同步等待:如wait()、notify()、notifyAll()

4、死鎖:多個線程對資源互鎖,造成死鎖

5、容災:任何線程出現錯誤,整個進程都會停止

        但多線程也有如下優勢:

1、內存空間共享,信息數據交互效率高

2、提高CPU的使用效率

3、開發便捷

4、輕量級,創建、銷燬的開銷小

 

  • 線程與進程的比較

看到一段用英文描述的進程與線程之間的比較,感覺還不錯

大概的意思是:

1、進程是重量級的,線程是輕量級的

2、進程是資源分配和保護的單元,線程是CPU使用的單元

3、進程的創建在資源項目是消耗較大的,線程創建是消耗較小的

4、程序作爲進程執行相對線程慢,而線程相比進程而言快

5、一個進程不能使用其它進程所屬的內存空間,線程可以共享其所屬同一進程裏面其它線程的內存空間

6、進程轉換是消耗較多時間的,線程轉換比較快

7、一個進程可以包含許多線程,一個線程屬於一個確定的進程

 

  • 進程間通信的方式

1、管道(PIPE)

2、信號(SIGNAL)

3、消息隊列:Posix以及system V,現在用得較多的MQ,在不同程序間通過發佈訂閱、廣播、主題等方式進行消息傳遞,主要有離線和在線。一般在線是在大規模集羣上運行的,所以一般需要用錢買服務,騰訊雲和阿里雲等有提供這種消息隊列的服務。而離線一般在小規模或單機上實現不同程序之間的消息傳遞,一些比較成熟的開源庫有RabbitMQ,ActiveMQ,Kafka,Redis等。後面有時間再專門探討一下消息隊列。

4、共享內存:速度最快,需要結合信號量達到進程間的同步和互斥

5、信號量:用於數據同步

6、Socket:可以標準化,可以用於多機

 

  • 分佈式系統

​​​​​​​        在學習分佈式系統之間,首先我們要對程序設計中的思想與步驟進行充分了解,其是一個過程:

從我們寫的程序代碼(program) 👉 作爲進程運行(process) 👉 進程間通信傳遞消息(message) 👉 消息需要封裝成包(packet) 👉 消息包傳輸之前需要規定協議(protocol) 👉 消息包傳輸時需要網絡連接(network) 👉 同時需要組件的支持,如相關硬件等(component) 👉 衆多上述的軟硬件程序以及它們之間進行通信的網絡協議等構成一個分佈式系統

分佈式系統具有如下的優點:

概括起來,就是容錯性、高可用性、修復性、持續性、大規模、可預期展示、安全


隨便找了一個簡要的分佈式系統框架圖

        這裏主要實現的功能時用爬蟲程序(crawler)爬取數據。

        搭建分佈式系統時,通常需要一個Master對整個集羣進行管理,可以看到,爬蟲爬去的原始網頁數據存入HBase,同時,Master主要起管理作用,對比如Redis和Mongo的Server任務進行管理,分配集羣中分佈式系統各個主機任務的優先級,同時有一個Console方便我們進行監控操作,或者通過Web Service進行可視化展示控制。

        類似這種方式的分佈式系統通常是Master-Slave結構,一個主機對集羣的所有服務器進行管理,對整體進行控制,同時有的可以作爲集羣中信息共享的橋樑,與控制複雜均衡。


        在分佈式系統設計過程中,還有一些用到了遠程調用,Socket通信等方式,後續學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章