成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇學會阿里面試問的 Select、Poll、Epoll 模型

開發 前端
epoll沒有這個限制,它所支持的FD上限是最大可以打開文件的數目,這個數字一般遠大于1024,舉個例子,在1GB內存的機器上大約是10萬左右,具體數目可以cat /proc/sys/fs/file-max察看,一般來說這個數目和系統內存關系很大。

這一篇要說的select、poll、epoll這三個的區別,大家對于IO多路復用都了解吧,這個問題也是面試官最最愛問的問題之一了。

操作系統在處理IO的時候,主要客源分為兩個階段:

  • 等待數據傳遞到IO設備。
  • IO設備將數據復制到用戶空間user space。

也就可以將上述過程簡化理解為:

等待數據到kernel內核區域。

kernel內核區域將數據復制到用戶區域user space,用戶區域可以理解為JVM區域,即進程或者線程的緩沖區。

BIO

這是屬于最簡單的同步阻塞IO模型

當應用層有數據過來的時候,會調用recvfrom方法,但是這個時候應用層的數據還沒有復制到kernel內核區,也就是上面說的第一個過程,這個過程需要時間,所以recvfrom會阻塞。

當內核kernel中的數據準備好了之后,recvfrom方法并不會返回,而是會發起一個系統調用將kernel中的數據復制到JVM的進程中的緩沖區中,也就是用戶空間user space。

當這個復制也完成之后,也就是上面說的兩個階段全部完成之后,recvfrom才會返回并且解除程序的阻塞。

圖片

默認情況下,所有的文件操作都是阻塞的,在進程調用期間的recvfrom,直到數據包達到并且被復制到JVM進程緩沖區或者發生錯誤的時候才會返回,在此期間一直阻塞。

在阻塞期間,CPU不能執行IO操作,但是CPU還是可以去做別的事情的,阻塞了,但沒有完全阻塞。

我們再看操作系統處理IO的兩個步驟

  • 等待數據到kernel內核區域
  • kernel內核區域將數據復制到用戶區域user space

阻塞IO模型,其實就是把這兩個階段合并在一起,一起阻塞。

NIO

非阻塞其實就是把第一個過程的阻塞變成非阻塞,也就是recvfrom函數會不斷的去詢問kernel內核區域中的數據是否準備好。

如果數據沒有準備好,就返回EWOULDBLOCK錯誤,不斷的去進行輪詢檢查,知道發現kernel內核中的數據準備好了,就會返回。

第二個階段屬于系統調用,是必須阻塞的,就是將數據從kernel內核區域拷貝到用戶區域,也就是進程緩沖區中。

圖片

Linux系統將所有設備都當作文件來處理,而Linux用文件描述符fd來標識每個文件對象。

問題

阻塞模型在沒有收到數據的時候就會阻塞卡主,如果一個線程需要接受到多個客戶端的socket的fd連接,這樣會導致在處理這種情況效率比較低。

必須處理完前面的所有fd,才可以處理后面的fd,即使后面的fd可能比前面的fd提前準備好了,但是也得等,這樣會導致客戶端的嚴重延遲。

于是為了處理多個請求,有的小伙伴可能會想到用多個線程來改善,可以引入線程池改善這個情況,并且通過線程池的最大數量來控制這個限度,但是這并沒有從根本上解決問題。

應用:適用于針對大量的io請求的情況,對于服務器必須在同時處理來自客戶端的大量的io操作的時候,就非常適合。

圖片

Select工作流程

單個進程可以同時處理多個網絡連接的IO請求,就是調用select之后,整個程序就阻塞了。

此時需要把所有的fd集合都從JVM用戶空間拷貝到kernel內核空間,這個開銷很大。

然后去輪詢檢查所有的select負責的fd,當找到一個client中的數據準備好了之后,select就會返回,此時將數據從kernel復制到進程的緩沖區中。

圖片

缺點:

  • 每次都需要把fd集合從用戶態拷貝到內核態,消耗資源。
  • 每次調用需要進行輪詢所有傳遞進來的fd,也比較消耗資源。

你想啊,要是有十萬個連接,而活躍的只有幾個,那每次都要遍歷這十萬個,豈不是很糟糕。

  • 支持的fd數量有限,根據fd_size的定義,它的大小為32個整數大小(32位機器為32*32,所有共有1024bits可以記錄fd),每個fd一個bit,所以最大只能同時處理1024個fd。

每一次呼叫select都需要先從 user space把 FD_SET復制到 kernel(約線性時間成本)。

為什么 select 不能像epoll一樣,只做一次復制就好呢?

每一次呼叫 select()前,FD_SET都可能更動,而 epoll 提供了共享記憶存儲結構,所以不需要這里的kernel內核區域和用戶區域之間的全量數據復制。

Poll

poll的原理與select非常相似,但是呢,有兩點的不同之處。

一個是存儲fd的集合不同,select是有限的,而poll的方式存儲是鏈式的,沒有最大連接數的限制。

另一點就是水平觸發,也就是通知程序fd就緒后,這次沒有被處理,那么下次poll的時候會再次通知同個fd已經就緒。

Epoll

epoll既然是對select和poll的改進,就應該能避免上述的三個缺點。那epoll都是怎么解決的呢?

在此之前,我們先看一下epoll和select和poll的調用接口上的不同,select和poll都只提供了一個函數——select或者poll函數。而epoll提供了三個函數,epoll_create,epoll_ctl和epoll_wait。

epoll_create是創建一個epoll句柄;epoll_ctl是注冊要監聽的事件類型;epoll_wait則是等待事件的產生。

對于每次都需要把數據從用戶區全量復制到kernel內核區這個缺點,epoll的解決方案在epoll_ctl函數中。

每次注冊新的事件到epoll句柄中時(在epoll_ctl中指定EPOLL_CTL_ADD),會把所有的fd拷貝進內核,而不是在epoll_wait的時候重復拷貝。epoll保證了每個fd在整個過程中只會拷貝一次。

對于第二個每次都需要輪詢所有fd這個缺點

epoll的解決方案不像select或poll一樣每次都把current輪流加入fd對應的設備等待隊列中,而只在epoll_ctl時把current掛一遍(這一遍必不可少)并為每個fd指定一個回調函數,當設備就緒,喚醒等待隊列上的等待者時,就會調用這個回調函數,而這個回調函數會把就緒的fd加入一個就緒鏈表)。

epoll_wait的工作實際上就是在這個就緒鏈表中查看有沒有就緒的fd(利用schedule_timeout()實現睡一會,判斷一會的效果,和select實現中的第7步是類似的)。

把主動權交給了每一個連接,當設備就緒的時候,調用回調函數才會加入到這個就緒的集合。

對于第三個數量的缺點

epoll沒有這個限制,它所支持的FD上限是最大可以打開文件的數目,這個數字一般遠大于1024,舉個例子,在1GB內存的機器上大約是10萬左右,具體數目可以cat /proc/sys/fs/file-max察看,一般來說這個數目和系統內存關系很大。

圖片

責任編輯:武曉燕 來源: 左耳君
相關推薦

2025-01-07 00:07:17

2020-11-04 07:49:04

Select

2021-05-31 06:50:47

SelectPoll系統

2022-02-22 08:55:29

SelectPoll/ Epoll

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2023-11-06 07:27:38

模型NLP領域

2022-06-30 22:53:18

數據結構算法

2021-08-01 07:19:16

語言OpenrestyNginx

2021-12-04 22:05:02

Linux

2021-10-26 10:40:26

代理模式虛擬

2022-05-17 08:02:55

GoTryLock模式

2021-07-02 09:45:29

MySQL InnoDB數據

2021-07-06 08:59:18

抽象工廠模式

2023-01-03 08:31:54

Spring讀取器配置

2021-07-05 22:11:38

MySQL體系架構

2023-11-28 08:29:31

Rust內存布局

2021-05-11 08:54:59

建造者模式設計

2022-08-23 08:00:59

磁盤性能網絡

2022-08-26 09:29:01

Kubernetes策略Master
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频中文字幕 | 北条麻妃99精品青青久久主播 | 欧美日韩在线成人 | 麻豆久久| 国产一级片免费在线观看 | 精品国产aⅴ | 日本一区二区在线视频 | 久久久久久亚洲欧洲 | 91视频.com | 91xh98hx 在线 国产 | 国产成人综合久久 | 久久精品免费一区二区三 | 日日干日日操 | 久久伦理电影 | 欧美日韩综合一区 | 日韩中文在线 | 亚洲国产成人精品女人久久久 | 一区二区三区电影在线观看 | 久久com | 综合色影院 | 亚洲国产精久久久久久久 | 久久久久久久久蜜桃 | 99国产精品一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 亚洲狠狠丁香婷婷综合久久久 | а_天堂中文最新版地址 | 91看片在线观看 | 超碰国产在线 | 国产免费一级一级 | 亚洲精品视频在线播放 | 免费在线观看av网址 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 精品国产一区二区三区久久 | 亚洲免费精品 | 国产精品久久久久一区二区三区 | 在线精品一区 | 日本久久精品视频 | 国产精品黄色 | 国产亚洲精品久久久久动 | 日韩亚洲一区二区 | 中文字字幕一区二区三区四区五区 |