有位站友問,如何在linux下實現程序池技術,原貼見:
之前雖對程序池這個名詞早有耳聞,但一直沒有真正接觸過。乍一聽好像有點複雜,但稍微一想卻也簡單,下面我就按自己的想法來實現乙個簡單的模型。
跟最簡單的資源管理一樣,程序池技術的應該致少由以下兩部分組成
資源程序
預先建立好的空閒程序,管理程序會把工作分發到空閒程序來處理。
管理程序
管理程序負責建立資源程序,把工作交給空閒資源程序處理,**已經處理完工作的資源程序。
上面資源程序跟管理程序的概念很好理解,下面就是程序池的關鍵,管理程序如何有效的管理資源程序,如何分配任務給資源程序,如何**空閒資源程序。其實稍加分析一下也很簡單,管理程序要有效的管理資源程序,那麼管理程序跟資源程序間必然需要互動,如何互動呢?linux下兩個程序如何互動?ipc唄,訊號,訊號量,訊息佇列,管道,隨便選乙個合適的就可以了。
下面我就用訊號加訊息佇列來完成上面帖子裡的程序池需求。
[cpp:showcolumns]view plain
copy
print?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
//主接收網路訊息程序
int main()
} ...
} //
int submitwork(void *pbuffer, int imsglen)
int initprocesspoll(const
int iprocessnum)
return 0;
} typedef
struct
t_processstatus;
//指向資源程序管理結構
t_processstatus *pprocessmng = null;
//記錄有總共有多少個資源程序
int32 imaxprocessnum = 0;
//初始管理程序管理結構並建立資源子程序,最後接收外部工作請求並分發到資源進行進行處理
initmngprocess(const
int iprocessnum)
pprocessmng[i].pid = ipid; //記錄資源程序的程序號
pprocessmng[i].iflag = 0; //把資源程序置為空閒
} imaxprocessnum = iprocessnum;
//建立外部跟管理程序通訊的訊息佇列;
imsgque1 = createmsgque();
//建立管理程序跟資源程序通訊的訊息佇列;
imsgque2 = createmsgque();
//安裝資源程序**訊號處理函式
signal(sigusr1, releaseaprocess);
//開始接收外部傳入的任務
while(1)
} //通知乙個空閒資源程序進行處理
int noticeaidleprocess()
} return -1;
} //**乙個處理完成的資源程序
void releaseaprocess(int ipid)
} return;
} //資源程序的處理
void resourceprocess()
} //處理訊息
void startwork()
//通知管理程序**資源程序
void noticemngprocessfinishedwork();
如上,乙個基本的程序池處理模型就建立好了, 當然你不能直接拿到編譯,因為裡面很多都是偽**,另個上面的模型忽略了很多細節處理,很多地方是很不可靠的。
現在你是不是對程序池技術更了解了呢?
程序池實現
本文是基於半同步 半非同步程序池的實現,半同步 半非同步模型主要是主程序監視listen套接字,然後發訊號給子程序,子程序完成鏈結和讀寫資料。1.使用epoll實現i 0復用 2.實現訊號和i o事件的統一事件源。3.使用管道進行子程序和父程序的通訊。如下 ifndef processpool h ...
Linux 程序池實現
程序池在伺服器應用中有很多很多 下面是半同步半非同步程序池的實現 ifndef processpool h define processpool h include include include include include include include include include inc...
記憶體池 程序池 執行緒池介紹及執行緒池C 實現
平常我們使用new malloc在堆區申請一塊記憶體,但由於每次申請的記憶體大小不一樣就會產生很多記憶體碎片,造成不好管理與浪費的情況。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊...