2.1 ppc/tpc模型
這兩個模型就是有個連線來了就給分配個程序/
執行緒,前者肯定更費資源了,因為這麼多程序
/執行緒不是吃素的,都要時間和空間,開銷大,
所以併發只有幾百?
(也沒說epoll
是如何分配的?)
也就是說那兩個得遍歷所有,和連線數有關!epoll也遍歷,但是只遍歷活躍的所以效率高。(強調實際網路環境,網路延時,實際同時互動的有限)
獲取事件的時候,它無須遍歷整個被偵聽的
描述符集
,只要遍歷
那些被核心io事件非同步喚醒而加入
ready佇列
的描述符集合就行了。
但是,如何確定「活躍」?
這是因為在核心實現中epoll是根據每個fd上面的callback函式實現的。那麼,只有
"活躍"的socket才會主動的去呼叫 callback函式
,其他idle狀態socket則不會,在這點上,epoll實現了乙個"偽"aio,因為這時候推動力在linux核心
(所以不用自己篩選了,不用選擇到底誰是活躍的了,是被動式的。)
epoll
沒有最大併發連線的限制,上限是
最大可以開啟檔案的數目
,這個數字一般遠大於
2048,
一般來說這個數目和
系統記憶體關
系很大,具體數目可以
cat /proc/sys/fs/file-max
察看。1g記憶體大概是10萬?我這81萬是8g記憶體?
32位機器,8g記憶體可以看到?!!!如何定址?
32位linux
不開啟pae
,則最多只能識別出
4gb記憶體,若開啟
pae,則最多可以識別出
64gb
記憶體。但是
32位系統下的程序一次最多只能定址
4gb的空間。64位
linux
則沒有32
位系統的限制。因此對於記憶體大於
4gb的機器來說,最好安裝
64位系統。
pae又是什麼?見底層附
select的
fd_setsize
預設1024
/2048
(linux是1024
)。方法就是重新設定fd_setsize(fd集的大小)!重新編譯核心!
那這樣是不是就能滿足im伺服器的
最大連線數需求
了?確實,數量是不是問題了,問題是效能了,
因為遍歷方式沒變——
仍然是遍歷所有連線數
,fd_size的改變也意味著
遍歷時間的增長
,類似於cpu有太多時間片輪轉的後果,每乙個都要等很久,拖累效能。
至於poll的最大連線數限制,是多少?
使用的開源庫中作者使用了非阻塞connect使用select() 來等待超時,但是並未檢查fd_setsize,當檔案描述符數目大於這個數目之後就會出現記憶體越界錯誤,造成
coredump。
這點實際上涉及到epoll的具體實現了。核心
/使用者空間
記憶體拷貝問題,如何讓核心把
fd訊息通知給
使用者空間呢?
在這個問題上
select
採取了記憶體拷貝方法。
poll也是麼?應該是,poll和select基本無區別?(肯定多少還有點區別,只是這些缺點是相同的)
既然是記憶體拷貝,因為也要拷貝啊,還是慢!
對於poll來說需要將使用者傳入的 pollfd 陣列拷貝到核心空間,因為拷貝操作和陣列長度相關,時間上這是乙個o(n)操作,當事件發生,poll返回將獲得的資料傳送到使用者空間並執行釋放記憶體和剝離等待佇列等善後工作,向使用者空間拷貝資料與剝離等待佇列等操作的的時間複雜度同樣是o(n)。
而epoll是共享記憶體,拷貝都不用,相對來說應該會更快。epoll是通過核心與使用者空間mmap同一塊記憶體實現的。
mmap是什麼
mmap操作提供了一種機制,讓使用者程式直接訪問裝置記憶體,這種機制,相比較在使用者空間和核心空間互相拷貝資料,效率更高。在要求高效能的應用中比較常用。mmap對映記憶體必須是頁面大小的整數倍,面向流的裝置不能進行mmap,mmap的實現和硬體有關。
(涉及到核心和使用者空間的概念,共享記憶體有沒有安全隱患?)
epoll除了水平觸發level trigger,還有個邊緣觸發edge trigger。按電氣層面就是高低電平的區分和高低變化的邊緣?
水平觸發和邊緣處罰的含義?不是電訊號
層面的含義!是用在epoll這個層面什麼含義?那天那個人好像「背」過。
epoll除了提供select/poll那種io事件的
水平觸發
(level triggered)外,還提供了
邊緣觸發
(edge triggered),
這就使得
使用者空間程式有可能快取io狀態
,減少epoll_wait/epoll_pwait的呼叫,提高
應用程式
效率。。
什麼意思?
難道就是做迴圈,一大堆鏈結,加壓力?
想知道檔案和socket的fd
是否共用空間,看看
socket
的跨程序共享也許有一定參考性,至少跨了!!!另外,應該可以程式設計測試,不過
socket的fd
按檔案的介面去操作不知道什麼後果?話說!
好像都是write
和read
操作(fwrite
和fread
好像是特例。)
fd 是
(file descriptor)
,這種一般是
bsd socket
的用法,用在
unix/linux
系統上。在
unix/linux
系統下,乙個
socket
控制代碼,可以看做是乙個檔案,在
socket
上收發資料,相當於對乙個檔案進行讀寫,所以乙個
socket
控制代碼,通常也用表示檔案控制代碼的
fd來表示。
(雖然說相當於檔案,但是還沒說完全等同)
physical address extend
實體地址擴充套件
「linux pae」一搜一堆的,有空可以去看,留意的話可以注意到某些核心都有「-pae」字樣
怎麼看我這個開了
pae?
我這台機器支援大記憶體,通過命令找pae
找到三個結果,應該是這三個檔案都設定了。
pae能讓
32位系統去按
64位定址?總之是支援
64gb
記憶體,然後(有人說)不支援定址?那還有什麼用?
想想也是,以前伺服器也要很大記憶體,而64
位沒那麼普及,難道
4g就是伺服器記憶體極限?或者伺服器確實很早普及
64位?其實技術上也沒什麼難的,讓
32位去定址
64gb
記憶體也就是
64位定址,只需要硬體有個小調整,就是那個位址暫存器吧(具體名詞怎麼叫都忘了)。應該也不對,是其他手段吧?因為只是軟體設定啊!不然就是硬體已經相容了這個功能,軟體想開啟就能開啟,還是去搜
pae詳細資料吧。
4g記憶體用32位都是加了中間層的,在ubuntu上叫ape核心,效能會損失。
Epoll實驗總結
2012 09 06 15 54 10 分類 network program 標籤 epoll c 舉報 字型大小 訂閱 我的 書 一 超時實驗 建立乙個阻塞模式的tcp連線到乙個沒有監聽的服務埠 肯定連不上,然後等待超時 然後將這個socket描述符,交由epoll管理。註冊的epoll事件為 e...
epoll使用總結
epoll的使用總結 使用epoll來實現乙個tcp server,中間碰到了不少使用細節上的問題,總結一下。man epoll裡推薦的使用方法 define max events 10 struct epoll event ev,events max events intlisten sock,c...
內部類特點總結
一 內部類需要注意事項 1.內部類可以直接訪問外部成員。包括私有 2.外部類要訪問內部類必須要建立物件 3.如果其他類要訪問內部類,首先的定義外部類。格式 outer.inner in new outer.new inner 這樣定義可以訪問內部類的成員及方法。4.如果內部類的成員名與外部類的成員名...