偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

五分鐘幫您理解Linux網(wǎng)絡(luò)核心知識(shí)點(diǎn)——Socket和Epoll

開(kāi)發(fā) 前端
當(dāng)有客戶(hù)端連接服務(wù)端時(shí),服務(wù)端 Socket 文件中會(huì)寫(xiě)入這個(gè)客戶(hù)端 Socket 的文件描述符。進(jìn)程可以通過(guò) accept() 方法,從服務(wù)端 Socket 文件中讀出客戶(hù)端的 Socket 文件描述符,從而拿到客戶(hù)端的 Socket 文件。

關(guān)于linux網(wǎng)絡(luò)相關(guān)的基礎(chǔ)知識(shí)點(diǎn),最熱的兩個(gè)就是socket和epoll,接下來(lái)我就用最簡(jiǎn)單的方式把他倆說(shuō)清楚便于大家理解!

Socket

Socket 是一種進(jìn)程間通信的方法,它允許位于同一主機(jī)(計(jì)算機(jī))或使用網(wǎng)絡(luò)連接起來(lái)的不同主機(jī)上的應(yīng)用程序之間交換數(shù)據(jù)。

Socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文件”,都可以用“打開(kāi)open> 讀寫(xiě)write/read > 關(guān)閉close”模式來(lái)操作。Socket就是該模式的一個(gè)實(shí)現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對(duì)其進(jìn)行的操作(讀/寫(xiě)IO、打開(kāi)、關(guān)閉)

Socket實(shí)現(xiàn)細(xì)節(jié)

當(dāng)有客戶(hù)端連接服務(wù)端時(shí),服務(wù)端 Socket 文件中會(huì)寫(xiě)入這個(gè)客戶(hù)端 Socket 的文件描述符。進(jìn)程可以通過(guò) accept() 方法,從服務(wù)端 Socket 文件中讀出客戶(hù)端的 Socket 文件描述符,從而拿到客戶(hù)端的 Socket 文件。

程序猿實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)服務(wù)器的時(shí)候,會(huì)先手動(dòng)去創(chuàng)建一個(gè)服務(wù)端 Socket 文件。服務(wù)端的 Socket 文件依然會(huì)存在操作系統(tǒng)內(nèi)核之中,并且會(huì)綁定到某個(gè) IP 地址和端口上。以后凡是發(fā)送到這臺(tái)機(jī)器、目標(biāo) IP 地址和端口號(hào)的連接請(qǐng)求,在形成了客戶(hù)端 Socket 文件之后,文件的文件描述符都會(huì)被寫(xiě)入到服務(wù)端的 Socket 文件中。

應(yīng)用只要調(diào)用 accept 方法,就可以拿到這些客戶(hù)端的 Socket 文件描述符,這樣服務(wù)端的應(yīng)用就可以方便地知道有哪些客戶(hù)端連接了進(jìn)來(lái)。而每個(gè)客戶(hù)端對(duì)這個(gè)應(yīng)用而言,都是一個(gè)文件描述符。如果需要讀取某個(gè)客戶(hù)端的數(shù)據(jù),就讀取這個(gè)客戶(hù)端對(duì)應(yīng)的 Socket 文件。如果要向某個(gè)特定的客戶(hù)端發(fā)送數(shù)據(jù),就寫(xiě)入這個(gè)客戶(hù)端的 Socket 文件。



epoll

與 socket 的交互,最核心的場(chǎng)景就是網(wǎng)絡(luò) IO 的處理, epoll 會(huì)協(xié)助我們高效完成。我們新建立一個(gè)網(wǎng)絡(luò) socket 的時(shí)候,交給 epoll 就可以了,當(dāng)網(wǎng)絡(luò) IO 有數(shù)據(jù)到來(lái)時(shí)它會(huì)通知我們,當(dāng)我們要往網(wǎng)絡(luò) IO 寫(xiě)數(shù)據(jù)時(shí),epoll 也會(huì)自動(dòng)幫我們發(fā)送,本質(zhì)上epoll實(shí)現(xiàn)了IO 多路復(fù)用。

Epoll數(shù)據(jù)結(jié)構(gòu)如下:

· rbr:被 epoll 所管理的所有 socket 都存儲(chǔ)在紅黑樹(shù)中。

· rdllist:存儲(chǔ)著所有就緒的 socket(所謂"就緒",意思指有網(wǎng)絡(luò)數(shù)據(jù)到來(lái),或者有數(shù)據(jù)要發(fā)送出去。)

就緒列表是 epoll 能夠高效的核心,對(duì)于每一個(gè)就緒的 socket,會(huì)直接放入 rdllist 中,epoll_wait 獲取到就緒的 socket 時(shí),直接從 rdllist 中進(jìn)行獲取就可以了,無(wú)需再進(jìn)行查找。epoll 是基于事件回調(diào)機(jī)制地,當(dāng) epoll 所管理地 socket 有數(shù)據(jù)到來(lái)時(shí),會(huì)觸發(fā)事件回調(diào)函數(shù),將就緒的 socket 放置在 rdllist 中,并且通知 epoll_wait 所在的進(jìn)程來(lái)處理數(shù)據(jù)。epoll的優(yōu)點(diǎn)如下:

  • 支持海量并發(fā)連接。
  • 使用時(shí)間復(fù)雜度為 O(logn)的紅黑樹(shù)管理所有的 socket。
  • 提高 CPU 的使用率,高效地使用 CPU 時(shí)間片處理所管理的 socket 連接。
  • 基于事件回調(diào)機(jī)制處理消息,而不是主動(dòng)輪詢(xún)機(jī)制。

除了epoll,內(nèi)核還提供了select和poll,但是二者效率較差,這里就不再進(jìn)行介紹了。

最后的總結(jié)

不同的客戶(hù)端與服務(wù)端通信通過(guò)Socket實(shí)現(xiàn),而epoll使得通信變更加高效!

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2022-04-08 07:51:31

JavaJVM垃圾回收

2021-01-15 08:35:49

Zookeeper

2020-11-06 00:50:16

JavaClassLoaderJVM

2021-12-30 08:17:27

Springboot數(shù)據(jù)訪(fǎng)問(wèn)DataSourceB

2025-01-07 14:10:46

SpringBoot開(kāi)發(fā)Java

2020-05-19 14:40:08

Linux互聯(lián)網(wǎng)核心

2012-10-12 09:23:04

JavaEEUMLObject

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2019-08-09 10:33:36

開(kāi)發(fā)技能代碼

2021-01-06 13:52:19

zookeeper開(kāi)源分布式

2020-10-26 10:40:31

Axios前端攔截器

2023-07-26 07:11:50

LVM底層抽象

2011-08-08 09:22:10

Python

2021-04-13 08:25:12

測(cè)試開(kāi)發(fā)Java注解Spring

2024-03-04 08:10:00

C#多線(xiàn)程語(yǔ)言

2024-11-04 09:00:00

Java開(kāi)發(fā)

2025-03-26 11:30:40

2021-01-11 09:33:37

Maven數(shù)目項(xiàng)目

2023-12-06 08:48:36

Kubernetes組件

2024-04-23 14:25:16

Python備忘清單
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)