服務器端高併發IO的keep alilve方案

案例一、服務器端高併發IO的keep alilve方案,滿足一下幾個需求
1. 每個IO都有自己的時間戳
2. 每個IO收到自己的beat後,重置自己的定時器
3. 若IO定時沒有收到,則執行IbeatO的回調函數,並重置定時器
4. 若再次沒有收到beat,銷燬IO,註銷定時器。

首先建立一個時間紅黑樹,紅黑樹每個節點包括時間戳,超時回調函數,連接描述符,在線程的主循環中,每次遍歷紅黑樹找到超時的節點,然後執行超時回調函數,並且從該紅黑樹中刪除該節點。
新連接來到的時候通過epoll來接受連接,然後建立一個事件放到一個消息隊列裏面,在檢測紅黑樹的線程每次在遍歷紅黑樹之前先從該消息隊列取事件,如果有需要加入紅黑樹的事件,則執行插入紅黑樹的操作,插入完成後執行查找紅黑樹 超時的I節點。其中紅黑樹插入一個新節點的時間複雜度爲log(N),遍歷的時間複雜度爲O(N)
type struct MQNode
{
int fd;
int type;
int timeStap;
}
void startNetThread()
{
//使用epoll接受網絡IO
//如果是新連接,消息類型爲新連接,放入消息隊列
int type = 1;
//消息對列節點
MQNode* node;
//fd爲連接描述符
node->:fd = fd;
node->timeStap = 當前時間;
if( newClient )
{
type = 1
}
//否則,消息類型爲老連接,放入消息隊列
else
{
type = 2
}
putMq(node)
}

void putMq((MQNode* node)
{
//插入消息隊列鏈表
}
//從消息隊列拿出節點,操作紅黑樹
void startRBTreeThread()
{
//構建新的紅黑樹
while(ture)
{
//從消息隊列拿出節點,
//判斷類型如果是新連接,則插入紅黑樹
//否則,則遍歷紅黑樹,修改節點的時間戳,重構紅黑樹
//遍歷紅黑樹看是否有過期的節點,如果有則調用IO銷燬函數
//並且從紅黑樹中刪除該節點
}

}

//測試代碼後續補上。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章