分布式系統中的線程與進程


進程  

  雖然進程構成了分布式系統中的基本組成單元,但是操作系統提供的用於構建分布式系統的進程在粒度上還是太大了,而就粒度而言,將每個進程細分為若干控制線程的形式則更加合適。

  為了程序執行的需要,操作系統創建多個虛擬處理器,每個虛擬處理器運行一個程序。為了保持對這些虛擬處理器的跟蹤,操作系統中有一張進程表。其包含的條目中存儲着CPU寄存器值內存映像打開的文件統計信息特權信息等。

  操作系統特別注意確保獨立的進程不會有意或無意地破壞其他獨立進程運行的正確性。也就是說,多個進程並發地共享同一個CPU以及其他硬件資源這樣一個事實是透明的。一般來說,操作系統需要硬件支持來實現這種隔離。要得到這種並發透明性需要付出相對較高的代價。例如:每次創建一個進程的時候,操作系統必須分配一個完整的獨立地址空間。空間分配意味着要對內存段進行初始化,比爾先對數據段清零,然后將相關的程序復制到文本段中,隨后為臨時數據建立堆棧等。

  在兩個進程之間切換CPU的開銷同樣會比較大,除了要保存CPU環境(包括寄存器值、程序計數器、堆棧指針等)以外,操作系統還必須修改內存管理單元的寄存器,並且將位於轉換后備緩沖器中的地址轉換緩存內容標記為無效,另外,如果操作系統支持同時運行的進程數目超出主存容納能力,則必須在切換進程之前現在主存和磁盤之間進行交換。

 

非分布式系統中的線程用法

  多線程最顯著的好處來自以下事實:那就是在只擁有單線程的進程中,一旦執行了造成阻塞的系統調用,整個進程就被阻塞了。

  多線程技術在大型應用程序上下文中也是很有用的。這種應用程序一般是作為一組寫作的程序開發出來的,其中每一個程序都通過獨立的進程進行。例如UNIX系統,程序間寫作是通過進程間通信(IPC)機制實現的。這套機制中通常包括已命名管道消息隊列以及共享內存段。左右IPC機制都有一個主要的缺陷,就是其中的通信需要開銷龐大的上下文切換

  

  由於IPC需要內核干預才能進行,因此,要進行IPC的進程一般首先要從用戶模式切換到內核模式,需要改變MMU中的內存映像,同時還要刷新TLB。在內核中進行進程上下文的切換,隨后就可以從內核模式切換回用戶模式以使得通信的另一方能夠激活。后一次切換也同樣需要改變MMU映像並且刷新TLB。

  一般采用用戶級線程內核級線程的混合模式(LWP),LWP運行在單個重量級進程上下文中,每個進程可以包含多個LWP,除了LWP外,系統還提供用戶級線程包,向應用程序提供了創建和銷毀線程等普通操作。另外,包中還提供了用於線程同步的工具,比如互斥變量和條件變量。重要的是,線程包完全在用戶空間中實現的。也就是說,執行這些線程操作不需要內核的干預。

  

 

分布式系統中的線程

1、多線程客戶

  在廣域網上構建的分布式系統需要隱藏較長的進程間消息傳播的時間。在廣域網中,傳輸的延遲很容易達到上百毫秒,甚至幾秒。

  在很多情況下,Web文檔是由HTML文件組成的,HTML文件中包含有純文本文件以及圖像組、圖標等。為了獲得Web文檔中每一個組成部分,瀏覽器必須建立TCP/IP連接,讀取輸入數據並將數據傳遞給顯示組件。首先將文本顯示出來以便用戶查看,並且提供頁面滾動之類的功能,同時繼續獲取組成頁面的其他文件,比如圖像等。在收到這些文件之后再顯示它們。用戶不必等待瀏覽器取得整個頁面的所有組件就能夠查看頁面。

  以多線程客戶的模式來開發瀏覽器可以顯著地使問題簡化。每個線程都與服務器簡歷一個獨立連接以獲取數據。在使用多線程客戶的時候,可以與不同服務器副本建立連接,這樣就可以並行地進行數據傳輸了,並且確保整個Web文檔完全顯示出來所需的時間與使用無復制的服務器的情況相比要短得多。

2、多線程服務器

  考慮一下文件服務器的組織結構,該文件服務器可能會偶爾由於等待磁盤操作而阻塞。文件服務器一般等待輸入的文件操作請求,隨后執行該請求,最后送回應答。下圖中,有一個稱為分發器(dispatcher)的線程,由它來讀取文件操作請求。客戶發送請求到服務器的某個已知端點。在對請求進行檢查以后,服務器選擇一個空閑的(也就是阻塞的)工作着線程,由它來處理該請求。

  工作者線程在本地文件系統上執行阻塞的read調用,執行該調用將會導致該線程被掛起直到數據從磁盤上讀出為止。如果該線程被掛起了,就選擇另一個線程接着執行。

 

 

簡單總結下服務器集群。

  簡單說,服務器集群只是一組經網絡連接的機器,每台機器運行一個或多個服務器,這里所講的服務器集群是特指經局域網連接的機器,能提供高帶寬和低延遲。

  大多數情況下,服務器集群邏輯上由三層組成,第一層是一個邏輯上的交換機,由它分配客戶請求給服務器。在功能上比如:傳輸層交換機接收TCP連接請求,再轉發給集群中的某個服務器。

  

  就像所有的多層客戶-服務器體系結構一樣,很多服務器集群也包含了專用於應用處理的服務器。在集群計算中,這通常是運行在高性能硬件上專用於提供計算能力的服務器。然而,在企業服務器集群中,應用程序可能只需運行在相對低端的機器上,因為在這里的平靜不是計算能力而是數據存取。 當然現在的諸如Hadoop分布式計算框架已經不是三層結構,每台機器都有自己的本地存儲,把應用和數據處理集成在單個服務器中。

  第一層:一個重要的服務器集群設計目標是隱藏有多個服務器的事實。也就是說,運行在遠程機器上的客戶應用程序不應該需要知道集群的內部組織結構。這種存取透明性通過單個訪問點來實現(就好比你調用spark的thriftserver服務,傳入一個sql,並返回結果給你,你並不知道是由幾個節點運算的)。

  一個標准的存取服務器集群的方式是簡歷一個TCP連接,在這之上應用級別的請求可作為一個會話的一部分來發送。通過撤除連接可結束會話。在傳輸層交換機的情況下,交換機接受到來的TCP連接請求,轉發一些請求給一台服務器。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM