apache mina作為乙個網路應用框架,經常被用作訊息系統中,也就是說經常要去處理io,因此要實現高效的寫和讀。
最近又看了看寫的處理,始終發現不能完全的理解他的處理思路。
涉及的類
先看一下寫操作中涉及的類。
分析過程
從最底下的abstractpollingioprocessor.flush來分析
在mina的處理流程中,當processor接受到可以寫可以讀的sessions後,會將他們加入到flush佇列,而
abstractpollingioprocessor.flush就是flush的具體實現。
abstractpollingioprocessor.flush的大致流程如下:
do從flushsessions佇列中取出session
while(flushsessions佇列不為空)判斷
session
的狀態,如果是
opened
,那麼進行
flushnow
處理;
如果是關閉狀態,那麼就跳過;
如果是開啟中,那麼就加入到
flushsessions
佇列中。
上述流程中對於每個session的flush處理主要的過程是這樣:
flushnow:
flush:大致的思路如下(省略了session狀態的處理)final
boolean
hasfragmentation
=session
.gettransportmetadata
().hasfragmentation
();
final
writerequestqueue
writerequestqueue
=session
.getwriterequestqueue
();
// set limitation for the number of written bytes for read-write
// fairness. i used maxreadbuffersize * 3 / 2, which yields best
// performance in my experience while not breaking fairness much.
final
intmaxwrittenbytes
=session
.getconfig
().getmaxreadbuffersize
()
+(
session
.getconfig
().getmaxreadbuffersize
()>>>
1);
intwrittenbytes =0
;
writerequest
req
=null
;
try
session
.setcurrentwriterequest
(req
);
}
intlocalwrittenbytes =0
;
object
message
=req
.getmessage
();//獲得寫請求中的訊息內容
if(
message
instanceof
iobuffer
)
}else
if
// 當前這次寫的資料量為0,說明是核心緩衝區滿了,這個時候也對這個session重新註冊寫興趣,然後讓select去處理。
if(
localwrittenbytes ==0
)
writtenbytes
+=localwrittenbytes
;
// 累加的寫出資料大於等於最大的寫上限
// 發生這種情況,是不是說明網路狀態好,有兩種情況出現:
// 1) 一次寫出的資料的長度就超過了最大寫出上限,此時,為了公平排程各個session的寫操作,不將繼續對當前session進行寫,而是將session加入到本次flush的session隊尾,在本次flush中繼續對當前session的寫請求佇列進行處理
// 2)通過多次迴圈的將session 的寫請求佇列中的多個訊息請求連續寫出,累計的寫出長度超過了最大寫出上限,此時,也是為了公平,不能繼續對當前的session進行處理,加入到佇列尾部。
if(
writtenbytes
>=
maxwrittenbytes
)
// 寫了一次只要在前面的三種情況下,沒有返回退出,說明當前的訊息內容處理完畢,可以釋放。
if(
message
instanceof
iobuffer
)
}while
(writtenbytes
<
maxwrittenbytes
);
}catch
(..)
另外兩個函式writebuffer和write比較簡單,這裡不列出來了。do
{
獲取session
的狀態
如果是opened
flushedall
=flushnow
(...)
如果flushedall
為true
,說明正在處理的
session
的writerequest
全部被處理完了,但是,可能在處理過程中又有
writerequeset
加入到這個
session
的寫請求佇列,這個時候,將這個
session
放到flushingsessions
佇列的末尾。繼續下乙個迴圈。
如果是closed
:
...
如果是opening
:
...
while
(flushingsessions
不為空)
總結
flush函式是處理多個session的寫,主要是對處理過程中不同session狀態處理。
flushnow函式是處理單個session的寫可能出現的各種情況
writebuffer函式處理分片問題
write函式處理直接的寫
寫題過程中的debug總結
0 寫題之前 仔細讀題,要盡力理解透徹題意 確定資料範圍,如果資料達到1e9,就用long long 確定演算法 確定資料結構 1 樣例都沒過 檢查輸入 檢查變數型別 檢查是否正確輸入 仔細讀一遍程式 尤其注意迴圈變數,以及多組測試時初始化問題,除零,下標越界 仔細讀一遍題目,擯棄之前的觀念,避免思...
寫大白的過程中遇到的問題
寫大白的過程中遇到的問題,與解決方案 1,我想讓截圖與我寫的大白在一行上,但是把大白框擠到了下一行 效果如圖 原因 沒有明白行內元素與塊級元素的區別,沒有明白img是什麼元素,我開始以為是獨佔了一行,導致後面的框被擠到了下一行,後來才發現,是行內元素,不會將後面的擠到下一行,是後面的框是塊級元素,獨...
HDFS寫檔案的過程
1 副本及儲存策略 2 寫檔案的網路流量及磁碟空間 網路流量 磁碟空間 檔案size dfs.replication3 寫資料的流程 client將檔案file1劃分出blocks block1 block2 block3.client向nn發出寫block的請求 檔案file1的block1 nn...