程序與執行緒的描述
乙個程序至少會建立乙個執行緒,多個執行緒共享乙個程式程序的記憶體。程式的執行最終是靠執行緒來完成操作的。執行緒的數量跟cpu核數有關,乙個核最多能發出兩個執行緒。執行緒的操作主要分為:一:給cpu進行程式命令的執行。二:io的操作(讀取或輸出資料)或者請求網路資料。
io復用形成原因
如果乙個i/o流進來,我們就開啟乙個程序處理這個i/o流。那麼假設現在有一百萬個i/o流進來,那我們就需要開啟一百萬個程序一一對應處理這些i/o流(——這就是傳統意義下的多程序併發處理)。思考一下,一百萬個程序,你的cpu占有率會多高,這個實現方式及其的不合理。所以人們提出了i/o多路復用這個模型,乙個執行緒,通過記錄i/o流的狀態來同時管理多個i/o,可以提高伺服器的吞吐能力
io模型
阻塞io模型
非阻塞io模型
io復用模型
訊號驅動式io模型
非同步io模型
多路復用的實現有多種方式:select、poll、epoll
select
呼叫過程
a. 從使用者空間將fd_set拷貝到核心空間優缺點b. 註冊**函式
c. 呼叫其對應的poll方法
d. poll方法會返回乙個描述讀寫是否就緒的mask掩碼,根據這個mask掩碼給fd_set賦值。
e. 如果遍歷完所有的fd都沒有返回乙個可讀寫的mask掩碼,就會讓select的程序進入休眠模式,直到發現可讀寫的資源後,重新喚醒等待佇列上休眠的程序。如果在規定時間內都沒有喚醒休眠程序,那麼程序會被喚醒重新獲得cpu,再去遍歷一次fd。
f. 將fd_set從核心空間拷貝到使用者空間
缺點:兩次拷貝耗時、輪詢所有fd耗時,支援的檔案描述符太小poll呼叫過程(與select完全一致)優缺點優點:跨平台支援
優點:連線數(也就是檔案描述符)沒有限制(鍊錶儲存)epollepoll的et與lt模式缺點:大量拷貝,水平觸發(當報告了fd沒有被處理,會重複報告,很耗效能)
lt:延遲處理,當檢測到描述符事件通知應用程式,應用程式不立即處理該事件。那麼下次會再次通知應用程式此事件。
et:立即處理,當檢測到描述符事件通知應用程式,應用程式會立即處理。
et模式減少了epoll被重複觸發的次數,效率比lt高。我們在使用et的時候,必須採用非阻塞套介面,避免某檔案控制代碼在阻塞讀或阻塞寫的時候將其他檔案描述符的任務餓死
呼叫過程
a. 當呼叫epoll_wait函式的時候,系統會建立乙個epoll物件,每個物件有乙個evenpoll型別的結構體與之對應,結構體成員結構如下。
rbn,代表將要通過epoll_ctl向epll物件中新增的事件。這些事情都是掛載在紅黑樹中。b. 檔案的fd狀態發生改變,就會觸發fd上的**函式rdlist,裡面存放的是將要發生的事件
c. **函式將相應的fd加入到rdlist,導致rdlist不空,程序被喚醒,epoll_wait繼續執行。
d. 有乙個事件轉移函式——ep_events_transfer,它會將rdlist的資料拷貝到txlist上,並將rdlist的資料清空。
e. ep_send_events函式,它掃瞄txlist的每個資料,呼叫關聯fd對應的poll方法去取fd中較新的事件,將取得的事件和對應的fd傳送到使用者空間。如果fd是lt模式的話,會被txlist的該資料重新放回rdlist,等待下一次繼續觸發呼叫。
優缺點
優點:沒有最大併發連線的限制
只有活躍可用的fd才會呼叫callback函式
記憶體拷貝是利用mmap()檔案對映記憶體的方式加速與核心空間的訊息傳遞,減少複製開銷。(核心與使用者空間共享一塊記憶體)
只有存在大量的空閒連線和不活躍的連線的時候,使用epoll的效率才會比select/poll高
io分兩階段:
1一般來講:阻塞io模型、非阻塞io模型、io復用模型(select/poll/epoll)、訊號驅動io模型都屬於同步io,因為階段2是阻塞的(儘管時間很短)。只有非同步io模型是符合posix非同步io操作含義的,不管在階段1還是階段2都可以幹別的事。.資料準備階段
2.核心空間複製回使用者程序緩衝區階段
I O復用和I O模型
由 unix網路程式設計卷1 總結而來。同時監視多個i o條件,在其中任意乙個就緒時通知程序,這樣的能力稱為i o復用。由select和poll函式支援,較新的還有posix中的pselect函式。linux中還有epoll i o復用應用場合 1 客戶同時處理多個描述符時,必須使用i o復用。2 ...
較詳細的JNI簡介
在j a中,有時候我們不得不要去使用其他語言的 比如說 1 你的應用需要訪問系統的各個特性和裝置,這些特性和裝置通過j a平台是無法訪問的。2 你已經有了大量的測試過和除錯過的用另一種語言編寫的 並且知道如何將其匯出到所有的目標平台上。3 通過基礎測試,你已經發現所編寫的j a 比用其他語言編寫的等...
IO模型 IO多路復用
用socket 一定會用到accept recv recvfrom這些方法 正常情況下 accept recv recvfrom都是阻塞的 如果setblocking false 整個程式就變成乙個非阻塞的程式了非阻塞的特點 沒有併發程式設計的機制 是乙個同步的程式 程式不會在某乙個連線的recv或...