IPC(Inter-Process Communication,進程間通信)實現方式 1)管道: - 管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程之間使用(進程的親緣關係通常是指父子進程關係) 2)有名管道(FIFO): - 有名管道也是半雙工的通信方式,但是允許在沒有 ...
IPC(Inter-Process Communication,進程間通信)實現方式
1)管道:
- 管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程之間使用(進程的親緣關係通常是指父子進程關係)
2)有名管道(FIFO):
- 有名管道也是半雙工的通信方式,但是允許在沒有親緣關係的進程之間使用,管道是先進先出的通信方式
3)信號量:
- 信號量是一個計數器,可以用來控制多個進程對共用資源的訪問
- 它常作為一種鎖機制,防止某進程正在訪問共用資源時,其他進程也訪問該資源
- 因此,主要作為進程間以及同一進程內不同線程之間的同步手段
4)消息隊列:
- 消息隊列是有消息的鏈表,存放在內核中,並由消息隊列標識符標識
- 消息隊列剋服了信號傳遞信息少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點
5)信號 ( Sinal ) :
- 信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生
6)共用記憶體( Shared Memory) :
- 共用記憶體就是映射一段能被其他進程所訪問的記憶體,這段共用記憶體由一個進程創建,但多個進程都可以訪問
- 共用記憶體是最快的IPC實現機制,它是針對其它進程間通信方式運行效率低而專門設計的
- 往往與其他通信機制(如信號量)配合使用,來實現進程間的同步和通信
7)套接字( Socket ) :
- 套接字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信
套接字通信
1、基本介紹
1)網路上的兩個進程通過一個雙向的通信連接實現數據交換,這個連接的一端就是一個套接字
2)其目的就是:允許位於同一主機或不同主機上的不同進程之間進行通信,以實現數據交換
3)套接字本質是通過編程介面(API)對TCP/IP的封裝,TCP/IP也要提供可供程式員做網路開發所用的介面,這就是 Socket API
4)HTTP協議可以理解為轎車,其提供了封裝或者顯示數據的具體形式;Socket可以理解為發動機,提供了網路通信的能力
5)進程使用埠需要向內核申請註冊,內核通過【套接字、埠】標記進程
6)相關鏈接:https://www.linuxprobe.com/socket-agreement-overview.html?comefrom=http://blogread.cn/news/
7)相關圖示:
2、套接字類型
1)根據其使用的傳輸層協議不同:
- SOCK_STREAM:TCP套接字,使用TCP埠
- SOCK_DGRAM:UDP套接字,使用UDP埠
- SOCK_RAM:RAM套接字,裸套接字,不使用TCP埠或UDP埠,直接將IP報文封裝後傳輸給目標主機
2)根據其使用的地址不同,可分為多個 Socket Domain:
- AF_INET:使用IPV4地址,AF(Address Family)
- AF_INET6 :使用IPV6地址
- AF_UNIX:同一主機上的不同進程間進行通信時使用此類,效率更高,不占用TCP/IP協議棧,不需要解封裝
3、深入瞭解
1)對於TCP、UDP套接字來說,一個IP地址擁有65536(0~65535)個埠(TCP協議頭部使用16位來保存埠號)
2)0埠是保留埠,無論是TCP還是UDP都是不能使用的,可以監聽於0埠,但內核會在bind時,指定一個隨機可用埠來監聽
3)多個客戶端通過某一隨機埠與服務端的指定監聽埠建立套接字,服務端僅需使用一個套接字即可,但是連接需要用文件描述符來標識,雖然不受套接字數量的限制,但會受到文件描述符數量的限制
4)此外,如果服務端以反向代理方式工作時,雖然其僅需使用一個套接字就可以與多個客戶端建立連接,但是其還要與後端節點建立連接,如果通過TCP、UDP套接字與後端節點通信,則會受到套接字的數量限制
5)相關鏈接
- http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml
- https://mp.weixin.qq.com/s/vaURXrvafNBzBxmEiuaGOQ
4、SocketAPI(封裝了內核中的套接字通信相關的系統調用)
1)介紹:
- socket():創建一個套接字
- bind():將套接字和進程綁定在一起(即使用)
- listen():監聽在套接字上
- accept():接收請求
- connect():請求建立連接(一般是客戶端請求)
- write():發送數據(向此套接字寫入數據也就會發送至對端套接字)
- read():接收數據
- close():請求關閉連接
2)圖示: