1. 程式人生 > >每天3分鐘作業系統修煉祕籍(17):程序間通訊(3):套接字

每天3分鐘作業系統修煉祕籍(17):程序間通訊(3):套接字

點我檢視祕籍連載

套接字

套接字(Socket)用於協調不同計算機上的程序間通訊,也就是基於網路的通訊。當然,也可以在本機上使用套接字進行程序間的通訊。

套接字通訊的方式非常多,有Unix域套接字、TCP套接字、UDP套接字、鏈路層套接字等等。但最常用的肯定是TCP套接字。所以,這裡介紹下TCP Socket通訊方式,稍後再單獨介紹Unix域套接字。

TCP Socket用於客戶端、服務端的基於TCP協議的通訊,所以在客戶端和服務端均需要建立一個套接字。建立TCP套接字時會返回這個套接字的檔案描述符,可通過這個檔案描述符對套接字進行讀和寫操作。

對比一下,當一個程式需要對一個磁碟檔案同時進行讀寫操作(在命令列下似乎沒有找到這種命令,但通過程式設計方式是很容易實現的)時,由於只通過單個檔案描述符同時負責讀和寫,很可能需要通過不斷移動檔案指標的方式來改變讀寫的位置,否則資料很容易錯亂。

而TCP套接字也是通過單個檔案描述符進行讀寫套接字的,為了保證讀和寫的位置不錯亂,作業系統在核心空間為每個TCP套接字維護了兩個buffer空間,一個buffer用於寫、一個buffer用於讀。提供讀的buffer空間稱為recv buffer,提供寫的buffer空間稱為send buffer,它們統稱為socket buffer。

所以,服務端和客戶端通過兩個套接字通訊就簡單了,一端向send buffer寫資料,該buffer的資料會通過已經建立好的TCP連線傳送到另一端的recv buffer,於是另一端只需從recv buffer中讀資料即可實現不同計算機上的程序間通訊。過程如圖。

Unix域套接字

Unix域套接字是套接字的一種,用於本機程序間通訊,一般用來實現雙向通訊的管道。Unix域套接字是比網路套接字輕量級且高效的多,因為它不涉及網路通訊,不需要監聽連線,不需要繫結地址,不需要關心協議型別,等等。

建立Unix域套接字後返回兩個檔案描述符,這兩個檔案描述符均對套接字可讀、可寫,從而實現全雙工的雙向通訊。

同樣的,為了避免使用單個檔案描述符同時讀、寫造成的資料錯亂,Unix域套接字也有兩個buffer空間。

相關推薦

每天3分鐘作業系統修煉祕籍17程序通訊(3)

點我檢視祕籍連載 套接字 套接字(Socket)用於協調不同計算機上的程序間通訊,也就是基於網路的通訊。當然,也可以在本機上使用套接字進行程序間的通訊。 套接字通訊的方式非常多,有Unix域套接字、TCP套接字、UDP套接字、鏈路層套接字等等。但最常用的肯定是TCP套接字。所以,這裡介紹下TCP Socket

每天3分鐘作業系統修煉祕籍2並行的假象和分時系統

點我檢視祕籍連載 假象:“並行”執行多個程序 現代作業系統都支援多工同時執行。在這裡,作業系統對我們使用者“營造了一種假象”,讓CPU看上去是用不完的,能夠不斷地新增新的程式使它們同時執行。 但每核CPU在某一時刻都只能執行一個程序。使用作業系統的人是不會去關注CPU是單核還是多核的,每個人都希望作業系統能同

每天3分鐘作業系統修煉祕籍8虛擬記憶體分段

點我檢視祕籍連載 程序的地址空間佈局:分段 Linux的虛擬地址空間採用“分段+分頁”結合的方式實現。先看分段,之後再介紹分頁。 分段是將記憶體劃分成各個段落(Segment),每個段落的長度可以不同,且虛擬地址空間中未使用的空間不會對映到實體記憶體中,所以作業系統不會為這段空間分配實體記憶體。這樣的話,核心

每天3分鐘作業系統修煉祕籍9棧空間之使用者棧和核心棧

棧空間:使用者棧和核心棧 程式的執行流程 程序其實都是在執行任務,而任務其實就是函式定義的(函式也稱為方法、子程式等,本質都一樣),所以程序的作用就是不斷的執行函式。程式啟動時,第一個要執行的函式是main()函式(有些語言隱藏了這個函式,但任何程式一定會有一個程式入口函式),然後在main()函式中呼叫其它

每天3分鐘作業系統修煉祕籍13兩個緩衝空間Kernel Buffer和IO Buffer

點我檢視祕籍連載 兩個緩衝空間:kernel buffer和io buffer 先看一張圖,稍後將圍繞這張圖展開描述。圖中的fd table、open file table以及兩個inode table都可以不用理解,只需要知道它們體現出來的檔案描述符和磁碟檔案之間的對應關係:檔案描述符fd(例如圖中的fd=

每天3分鐘作業系統修煉祕籍14IO操作和DMA、RDMA

點我檢視祕籍連載 I/O操作和DMA、RDMA 使用者程序想要執行IO操作時(例如想要讀磁碟資料、向磁碟寫資料、讀鍵盤的輸入等等),由於使用者程序工作在使用者模式下,它沒有執行這些操作的許可權,只能通過發起對應的系統呼叫請求作業系統幫忙完成這些操作。這裡因為系統呼叫產生中斷將陷入到核心,進行一次上下文切換操作

每天3分鐘作業系統修煉祕籍24程序狀態以及狀態轉換

點我檢視祕籍連載 程序狀態以及狀態轉換 程序並非總是處於執行中,例如CPU沒執行在它身上時它就是非執行的。程序在建立之後會改變狀態,不同的狀態之間可以實現狀態切換,可以通過ps或top等命令捕獲程序的狀態。包含以下幾種狀態: 建立態(new):程序正在被建立中,過程非常短暫,使用者無法捕捉 執行態(run

每天3分鐘作業系統修煉祕籍25程序排程演算法圖解說明

點我檢視祕籍連載 程序排程 在這裡簡單介紹一些程序排程相關的演算法策略,雖然瞭解這些對於使用Linux來說不會有很大幫助,但是卻能幫助我們瞭解程序排程追求的是什麼,它和生活中的很多案例都類似。 程序排程的兩個關鍵性指標是:響應時間和週轉時間。 響應時間:程序未執行到下次被選中執行的時間間隔。例如程序剛被建立

每天5分鐘玩轉 OpenStack17

本節按照以下步驟部署 DevStack 實驗環境,包括控制節點和計算節點 建立虛擬機器 按照物理資源需求建立 devstack-controller 和 devstak-compute 虛擬機器 安裝作業系統 安裝 Ubuntu 14.04,

從零開始學習比特幣--P2P網路建立的流程之的讀取和傳送

寫在前面: 本篇文章接續 從零開始學習比特幣開發(四)–網路初始化,載入區塊鏈和錢包,匯入區塊啟動節點 從零開始學習區塊鏈技術(三)-接入比特幣網路的關鍵步驟解析、建立比特幣錢包,以及重要rpc指令 從零開始學習區塊鏈技術(二)–如何接入比特幣網路以及其原理分析 從零開始學習

AndroidIPC進程通訊1詳解Binder由來?

模塊 分配 寫入 img roi 核心 足夠 因此 images 完整原文:http://tryenough.com/android-ipc1 Android開發的進程間通訊,整個Android的應用都依賴於binder做底層通信機制。而Linux中提供的進程間通訊方式並沒

計算節點宕機了怎麼辦?- 每天5分鐘玩轉 OpenStack43

Rebuild 可以恢復損壞的 instance。 那如果是宿主機壞了怎麼辦呢? 比如硬體故障或者斷電造成整臺計算節點無法工作,該節點上執行的 instance 如何恢復呢? 用 Shelve 或者 Migrate 可不可以? 很不幸,這兩個操作都要

3分鐘快速入門RocketMQ

RocketMQ 叢集部署模式單 master 模式也就是隻有一個 master 節點,稱不上是叢集,一旦這個 master 節點宕機,那麼整個服務就不可用。優點:部署簡單。缺點:存在單點故障。注意:該模式一般只用來個人學習,或者作為開發環境使用,生產環境不推薦使用該模式。多 master 模式多個 mast

每天5分鐘玩轉 OpenStack155

這是 OpenStack 實施經驗分享系列的第 5 篇。 對於 Linux 映象,cloud-init 負責 instance 的初始化工作。cloud-init 功能很強大,能做很多事情,而且我們可以通過修改配置檔案靈活定製 cloud-init。 cloud-ini

每天5分鐘玩轉 OpenStack4

本節演示如何使用 virt-manager 啟動 KVM 虛機。 首先通過命令 virt-manager 啟動圖形介面 # virt-manager 點上面的圖示建立虛機 給虛機命名為 kvm1,這裡選擇從哪裡啟動虛機。如果是安裝新的 O

VXLAN 概念Part II- 每天5分鐘玩轉 OpenStack109

上一節我們介紹了 VXLAN 的封裝格式以及 VTEP。 今天我們將通過例子討論 VXLAN 封裝和轉發包的過程,以及 Linux 對 VXLAN 的原生支援。 VXLAN 包轉發流程 VXLAN 在 VTEP 間建立隧道,通過 Layer 3 網

每天5分鐘玩轉 OpenStack9

網路虛擬化是虛擬化技術中最複雜的部分,學習難度最大。 但因為網路是虛擬化中非常重要的資源,所以再硬的骨頭也必須要把它啃下來。 為了讓大家對虛擬化網路的複雜程度有一個直觀的認識,請看下圖 這是 OpenStack 官網上給出的計算節點(可以理解為 K

每天5分鐘玩轉 OpenStack47

本節我們將詳細講解 Cinder 的各個子服務。 cinder-api cinder-api 是整個 Cinder 元件的門戶,所有 cinder 的請求都首先由 nova-api 處理。cinder-api 向外界暴露若干 HTTP REST AP

instance “error” 了怎麼辦?- 每天5分鐘玩轉 OpenStack159

這是 OpenStack 實施經驗分享系列的第 9 篇。 OpenStack 用多了,經常會遇到這種情況:對 instance 執行某個操作如果失敗了就會處於 “error” 狀態:

3分鐘快速入門RocketMQ

簡介 用官方的話來說,RcoketMQ 是一款低延遲、高可靠、可伸縮、易於使用的訊息中介軟體,具有以下特性(ps:對於這些特性描述,大家簡單過一眼就即可,深入學習之後自然就明白了): 支援釋出/訂閱(Pub/Sub)和點對點(P2P)訊息模型在一個佇列中可靠的先進先出(FIFO)和嚴格的順序傳遞支援拉(p