青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我要啦免费统计



庫地址:


 


=========================


ST**表示單線程 




//開始監聽

bool Startint nMaxMonitor );

//增加一個監聽對象

bool AddMonitorSOCKET socket );

//等待事件發生,block無作用

bool WaitEventvoid *eventArrayint &countbool block );

//增加一個接受連接的操作,有連接進來,WaitEvent會返回

bool AddAccept(SOCKET listenSocket);

//增加一個接收數據的操作,有數據到達,WaitEvent會返回

bool AddRecvSOCKET socketcharrecvBufunsigned short bufSize );

//增加一個發送數據的操作,發送完成,WaitEvent會返回

bool AddSendSOCKET socketchardataBufunsigned short dataSize );











抽象控制的api

監聽套接字對象的方法,

IOCPMonitor

==========================

typedef struct IO_EVENT

{

SOCKET sock;

EventType type;

SOCKET client;

char *pData;

unsigned short uDataSize;

}IO_EVENT;

MemoryPool m_iocpDataPool;//iocp投遞參數池

typedef struct IOCP_OVERLAPPED

{

/**

 * OVERLAPPED類型指針

 * 指向完成操作參數

 * 傳遞給AcceptEx()的最后一個參數

 * 傳遞給WSARecv()的第個參數

 * GetQueuedCompletionStatus()返回的第個參數

 */

OVERLAPPED m_overlapped;

/**

 * 指向存有連接進來的客戶端局域網和外網地址的內存

 * 必須使用動態分配的內存塊

 * 傳遞給AcceptEx()的第個參數

 * 

 */

char m_outPutBuf[sizeof(SOCKADDR_IN)*2+32];

/**

 * 客戶端局域網IP信息長度

 * 傳遞給AcceptEx()的第個參數

 */

unsigned long m_dwLocalAddressLength;

/**

 * 客戶端外網IP信息長度

 * 傳遞給AcceptEx()的第個參數

 */

unsigned long m_dwRemoteAddressLength;

WSABUF m_wsaBuffer;//WSARecv接收緩沖數據,傳遞給WSARecv()的第個參數

SOCKET sock;

EventType completiontype;//完成類型recv 2send

}IOCP_OVERLAPPED;

IOCPMonitor::Start( int nMaxMonitor ) 

端口啟動 

創建完全端口 

線程數cpu數*2+2

IOCPMonitor::AddMonitor( SOCKET sock )

加入套接字到 IOCP列隊

IOCPMonitor::WaitEvent( void *eventArray, int &count, bool block )

等待一次完全端口的 事件

GetQueuedCompletionStatus( )

返回不同的iocp事件類型 或 數據 供上層循環控制

IOCPFrame : public NetEngine  

繼承了 netengine 的通用和抽象的方法,

同時針對不同的os平臺實例化不同的網絡模型 

IOCPFrame::IOCPFrame()

{

#ifdef WIN32

m_pNetMonitor = new IOCPMonitor;

#endif

IOCPFrame  控制監聽 接收 發送,集成 NetEngine   抽象

Child: one new IOCPMonitor;

class NetServer

{

friend class NetEngine;

NetEnginem_pNetCard;

Netserver為 主要控制對象,里面抽象了邏輯的控制的 函數,可以繼承城市

同時 NetServer 和 NetEngine 是friend class 

NetEngine 里面有監聽過程中的 一些寫業務的邏輯調用到 Netserver,幾個抽象的業務 接口 實現的地方 就獨立出來了。

NetEngine 業務控制抽象的幾種 業務調用

Threeadpool的任務




三種:業務實現

OnConnect

Onclose 

OnMsg

比如



監聽到鏈接的 調用NetEngine 調用了 iocpframe監聽 到連接的事件

調用父輩方法

NetEngine::OnConnectSOCKET sockbool isConnectServer )

創建一個 NetConnect對象,通過內存池分配的對象

投遞一個 連接的任務的task給線程池

Onclose 

OnMsg

類似

內存池設計

內存池 存儲 NetConnect對象,存儲管理netconnect對象 使用memorypool

//初始化內存池 預分配內存池

bool Init(unsigned short uMemorySizeunsigned short uMemoryCount);

// //分配內存(鏈表方法) 

一個線程讀 一個線程寫 無鎖隊列

Iobuffer  

包含vector 一張 Iobufferblock 表,存儲多個緩沖塊

讀取的時候

Iobufferblock 托管在內存池mempool BUFBLOCK_SIZE大小的內存塊

Iobuffer

Readdata

/**

 * IO緩沖

 * 定義宏BUFBLOCK_SIZE

 * 編譯期靜態確定類大小

 * 不能使用指針在運行時動態指定大小,參考池對象使用限制二

 */

unsigned char m_buffer[BUFBLOCK_SIZE];

//已收到數據的長度

unsigned short m_uLength;

//Recv()函數下次讀取數據的開始位置

unsigned short m_uRecvPos;

unsigned short IOBufferBlock::ReadDataunsigned char *dataunsigned short uLengthbool bDel )

從當前讀取位置開始讀取,如果越界 就用剩下的大小獲取

bool IOBuffer::ReadDataunsigned char *dataint uLengthbool bDel )

//這里檢查m_uDataSize不需要原子操作

//cpu與內存次交換最小長度就是byte,對于小于等于byte的類型的取值/賦值操作,

//本身就是原子操作

從頭來 

遍歷 所有bufferblock 如果是需要刪除的,那么原子操作減一,標志不使用了內存池,同時刪除清理block

一讀一寫,沒有線程安全問題

====================

SharedPtr

通過原子加減操作達到 引用計數操作的線程安全

ShareMemory

依靠viewmap實現 內存映射文件

/*

 * 創建/打開共享內存

 * 參數

 * key 全局標識,linux下只接收數字id

 * size 共享大小

 * if ( 是創建)

 * 則創建size大小的共享內存,

 * else //是打開已存在的共享內存

 * if ( 是文件映射&& 是linux系統)

 *   則使用當前共享內存大小與size中較大的一個,作為共享內存的大小

 * else 無效

 * else 無效

 * path 使用文件映射的共享內存,文件路徑,key為文件名

 */

ShareMemory(const char *keyunsigned long sizeconst char *path);

/*

 * 創建/打開共享內存

 * 參數

 * key 全局標識

 * size 共享大小

 * if ( 是創建)

 * 則創建size大小的共享內存,

 * else //是打開已存在的共享內存

 * if ( 是文件映射&& 是linux系統)

 *   則使用當前共享內存大小與size中較大的一個,作為共享內存的大小

 * else 無效

 * else 無效

 * path 使用文件映射的共享內存,文件路徑,key為文件名

*/

ShareMemory(const int keyunsigned long sizeconst char *path);

public:

voidGetBuffer();

unsigned long GetSize();

void Destory();

一次性獲取數據,初始化的時候指定 了大小了。

內存映射文件的方法,沒啥好看的

Signal

采用事件做信號通知,

=========================================

ThreadPool 

包含一個vect的任務隊列 里面帶的就是task

線程池 采用 事件信號通知。執行的函數 ThreadFunc

每次從 從m_tasks取任務,加了鎖地取法。

然后執行task的里面的Execute 方法 這樣就調用到 ExecutorCallMethod方法 參數從入隊進入就提交了。

Memorypool






















一、

一塊對象數據MEMERY_INFO + uMemorySize













二、一個 MemoryPool 數據結構

存儲對象本身 8Byte

每一塊數據包含信息8byte 然后就是指向 目標管理對象的對象內存

nBlockStartPos += MEMERY_INFO;

pObject = &(m_pMemery[nBlockStartPos]);

內存塊數 初始化的時候 設置的 m_uMemoryCount






三、Alloc()

找尋本身memorypool是否存在可用內存,

有,就直接獲取地址出去使用

沒有的的話遍歷到最后會發現 pBlock->m_pNext 為空,這個時候重新new memorypool對象 教導鏈表上去


m_uFreeCount 未分配的 個數

通過遍歷 查詢AtomDec  pBlock->m_uFreeCount 減1 

if ( 0 < (int32)AtomDec(&pBlock->m_uFreeCount, 1) ) break; 執行分配

class MemoryPool   voidAlloc();

 * 無鎖堆(n讀n寫并發,不需加鎖)

 *  內存池結構

 *  n個池組成鏈表

 * 

 *  池結構

 *  每個池都是一段連續內存保存在char數組中

 *  0~7byte為池地址,后面是n個用于固定長度分配的內存塊(即內存塊是定長的)

 * 

 *  內存塊結構

 *  狀態byte+留空byte+內存塊塊序號byte

 *  所以一個內存池最大可以保存的對象(內存塊)數量為unsigned short的最大值

 *

 * 狀態就個(分配/未分配),個byte就可以表示,使用byte是為了使用原子操作實現lock-free,而原子操作操作的是byte地址

 * 2byte留空,是為了保證后面用于分配的內存守地址都是byte對齊

 *  因為真實new出來的對象首地址是保證這點的,

 *  且IOCP投遞緩沖struct,也要求首地址對齊,否則返回錯誤

初始化

//預分配內存=MemoryPool對象自身地址,byte,支持位機尋址

//記錄對象地址 

//頭個字節保存對象自身地址,用于從內存地址找到內存池對象地址

if ( 8 == uAddrSize )

{

m_pMemery[nPos++] = (unsigned char)(uThis >> 56);

m_pMemery[nPos++] = (unsigned char)(uThis >> 48);

m_pMemery[nPos++] = (unsigned char)(uThis >> 40);

m_pMemery[nPos++] = (unsigned char)(uThis >> 32);

}

else

{

m_pMemery[nPos++] = 0;

m_pMemery[nPos++] = 0;

m_pMemery[nPos++] = 0;

m_pMemery[nPos++] = 0;

}

m_pMemery[nPos++] = (unsigned char)(uThis >> 24);

m_pMemery[nPos++] = (unsigned char)(uThis >> 16);

m_pMemery[nPos++] = (unsigned char)(uThis >> 8);

m_pMemery[nPos++] = (unsigned char)uThis;

//初始化內存

unsigned short i;

for ( i = 0; i < m_uMemoryCounti++ )

{

//狀態未分配

m_pMemery[nPos++] = 0;

m_pMemery[nPos++] = 0;

m_pMemery[nPos++] = 0;

m_pMemery[nPos++] = 0;

//留空字節

m_pMemery[nPos++] = 0;

m_pMemery[nPos++] = 0;

//保存內存序號

m_pMemery[nPos++] = (unsigned char) (i >> 8);

m_pMemery[nPos++] = (unsigned chari;

nPos += uMemorySize;

}

鏈表 內存池組

每個內存池 

通過對象算出索引

通過索引算出對象都很方便

詳細參考另外一個筆記


posted on 2013-06-25 20:02 閱讀(2788) 評論(3)  編輯 收藏 引用 所屬分類: 測試訓練

評論:
# re: Micro-Development-Kit 學習記錄 mdk 高性能網絡庫 2013-06-28 04:10 | buyessay
以 博主客通 返回頁首 恢復上次提交 過“恢名  回復  更多評論
  
# re: Micro-Development-Kit 學習記錄 mdk 高性能網絡庫 2014-09-15 18:52 | Amber
http://special-essays.com is one of those essay writing companies, which do their very best to make the customers 100% satisfied with their services.   回復  更多評論
  
# re: Micro-Development-Kit 學習記錄 mdk 高性能網絡庫 2014-12-17 16:16 | Ashley
hey hey!i am here accidentally and want to share with you the best site ever where you can order a unique essay for low price. http://best-essays-writers.org is a highly reputable online writing company where you can buy essays of all types at a cheap price.  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产日韩一区| 久久人人97超碰国产公开结果| 亚洲精选久久| 欧美日韩在线一二三| 久久国产精彩视频| 久久久久久久久蜜桃| 韩国成人精品a∨在线观看| 欧美激情精品久久久久久免费印度 | 美日韩免费视频| 欧美日韩国产在线播放| 久久深夜福利免费观看| 亚洲第一黄网| 亚洲欧美日本精品| 一区二区久久| 久久综合狠狠| 久久免费国产| 亚洲免费观看高清完整版在线观看熊 | 久久久一二三| 日韩午夜在线视频| 久久亚洲一区| 蜜桃av综合| 亚洲视频网在线直播| 欧美精品乱人伦久久久久久| 免费看亚洲片| 亚洲宅男天堂在线观看无病毒| 欧美激情女人20p| 午夜精品亚洲| 久久精品欧美| 韩国av一区二区| 欧美日一区二区在线观看 | 亚洲成人资源网| 欧美三级午夜理伦三级中视频| 午夜精品久久久久久久久| 亚洲福利视频专区| 久久久久久国产精品一区| 亚洲三级免费| 日韩午夜电影av| 国产在线视频欧美| 欧美伊人久久久久久午夜久久久久| 亚洲免费在线电影| 国产精品二区三区四区| 99精品热6080yy久久 | 一区二区高清视频在线观看| 一区二区三区四区五区精品视频 | 国产一区二区视频在线观看 | 亚洲国产精品久久久久秋霞影院| 久久天天躁狠狠躁夜夜av| 一区二区三区欧美激情| 亚洲国产第一| 久久综合九色综合欧美就去吻| 在线观看日韩欧美| 欧美片第1页综合| 亚洲精品综合久久中文字幕| 欧美大片网址| 一区二区三区免费网站| 亚洲二区视频在线| 黄色工厂这里只有精品| 国产一区二区三区久久精品| 国产精品永久入口久久久| 欧美一区二区三区免费在线看 | 亚洲综合清纯丝袜自拍| 久久久久久久欧美精品| 激情五月婷婷综合| 欧美va亚洲va国产综合| 亚洲精品无人区| 亚洲国产你懂的| 性欧美8khd高清极品| 极品尤物av久久免费看| 国内免费精品永久在线视频| 国产亚洲一区在线播放| 国产一区二区视频在线观看| 国内精品久久久久影院优| 国产综合色一区二区三区| 国产日韩亚洲欧美精品| 欧美精品久久久久久| 欧美精品一区二区三区很污很色的 | 国产一区自拍视频| 国产一区二区三区在线观看精品| 国产欧美在线| 欧美日韩亚洲系列| 久久另类ts人妖一区二区| 久久久99爱| 亚洲一区成人| 亚洲国产精品第一区二区| 欧美国产日韩精品| 亚洲人午夜精品免费| 99在线|亚洲一区二区| 一区二区黄色| 亚洲欧美日韩国产综合在线| 久久国产天堂福利天堂| 一区二区三区三区在线| 国产精品99久久久久久久久久久久| 欧美成人免费一级人片100| 亚洲国产高潮在线观看| 亚洲巨乳在线| 亚洲欧美在线免费| 久久一综合视频| 欧美精品免费看| 国产精品美女久久久久久免费 | 午夜在线成人av| 欧美一区二区三区另类| 亚洲私人影院在线观看| 久久国产色av| 亚洲高清成人| 亚洲欧美经典视频| 久久综合九色99| 欧美性大战久久久久久久蜜臀| 欧美激情国产日韩| 欧美aⅴ一区二区三区视频| 欧美日本一区二区三区| 国产婷婷色一区二区三区在线 | 国产精品综合色区在线观看| 亚洲成色www久久网站| 一本色道久久综合狠狠躁篇怎么玩| 亚洲激情一区| 欧美一区午夜精品| 欧美黄色aaaa| 亚洲欧美日韩国产中文在线| 欧美激情视频一区二区三区在线播放 | 一区二区日韩精品| 久久激情五月丁香伊人| 欧美日韩一区二区在线观看视频| 国内久久婷婷综合| 亚洲欧美韩国| 91久久在线观看| 亚洲欧洲日夜超级视频| 欧美一激情一区二区三区| 欧美另类99xxxxx| 精品成人乱色一区二区| 午夜在线a亚洲v天堂网2018| 亚洲人成毛片在线播放| 久久蜜桃精品| 国产欧美日韩一区二区三区在线 | 国产日本亚洲高清| 在线亚洲电影| 亚洲国产毛片完整版 | 欧美成人免费视频| 欧美极品一区| 亚洲国产清纯| 久久亚洲欧洲| 亚洲欧美日韩精品久久久| 欧美日韩一区三区| 999亚洲国产精| 欧美成人免费网| 久久久久久穴| 国产综合色精品一区二区三区| 午夜精品久久久99热福利| 久久人体大胆视频| 午夜在线成人av| 国产精品免费一区豆花| 亚洲免费高清视频| 亚洲国产精品一区二区第四页av | 亚洲精品国精品久久99热| 美女日韩欧美| 欧美午夜视频在线观看| 亚洲另类视频| 欧美激情黄色片| 美女亚洲精品| 亚洲精选成人| 日韩午夜激情av| 久久精品成人欧美大片古装| 国产亚洲精品一区二区| 欧美中文字幕视频在线观看| 亚洲亚洲精品三区日韩精品在线视频 | 国产精品丝袜白浆摸在线| 在线播放国产一区中文字幕剧情欧美 | 99re6这里只有精品| 欧美日韩国语| 亚洲欧美激情视频在线观看一区二区三区| 亚洲巨乳在线| 国产精品日韩精品欧美在线| 亚洲欧美韩国| 欧美在线视频导航| 精品av久久707| 欧美高清在线播放| 欧美激情成人在线视频| 一区二区三区成人精品| 中日韩美女免费视频网址在线观看 | 亚洲伊人久久综合| 亚洲欧美999| 国内精品久久久久久久97牛牛| 久久久久久久一区二区| 麻豆国产精品777777在线| 亚洲另类在线视频| 中文一区二区在线观看| 国产亚洲精品久久久久动| 男女av一区三区二区色多| 亚洲午夜精品福利| 国产视频不卡| 欧美成人一区二区| 欧美日韩视频| 久久成人久久爱| 免费在线成人| 亚洲视频1区2区| 欧美亚洲三区| 99pao成人国产永久免费视频| 在线一区欧美| 亚洲国产合集| 中国成人在线视频| 一区二区在线观看视频在线观看 |