池化技術(shù)指的是提前準備一些資源,在需要時可以重復使用這些預先準備的資源。 池化技術(shù)的優(yōu)點主要有兩個:提前準備和重復利用。

像池化技術(shù)一些典型的池子就比如線程池,內(nèi)存池,對象池,數(shù)據(jù)庫連接池等等,線程的創(chuàng)建銷毀,對象的創(chuàng)建銷毀,內(nèi)存的分配釋放,數(shù)據(jù)庫連接釋放等等,做池子里面伴隨著的就是生產(chǎn)者消費者模型。所以這些都是要搞清楚的
數(shù)據(jù)庫連接池:創(chuàng)建數(shù)據(jù)庫連接是?個很耗時的操作,客戶端和數(shù)據(jù)庫這個服務器去連接需要三次握手,身份連接認證,關(guān)閉連接回收資源和四次揮手太消耗資源了,也容易對數(shù)據(jù)庫造成安全隱患。所以,在程序初始化的時候,集中創(chuàng)建多個數(shù)據(jù)庫連接,并把他們集中管理,供程序使用,可以保證較快的數(shù)據(jù)庫讀寫速度,還更加安全可靠
連接池的機制:
前提:為數(shù)據(jù)庫連接建立一個緩沖池。
1:從連接池獲取或創(chuàng)建可用連接
2:使用完畢之后,把連接返回給連接池
3:在系統(tǒng)關(guān)閉前,斷開所有連接并釋放連接占用的系統(tǒng)資源
4:能夠處理無效連接,限制連接池中的連接總數(shù)不低于或者不超過某個限定值
數(shù)據(jù)庫連接池的基本思想是在系統(tǒng)初始化的時候?qū)?shù)據(jù)庫連接作為對象存儲在內(nèi)存中,當用戶需要訪問數(shù)據(jù)庫的時候,并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。在使用完畢后,用戶也不是將連接關(guān)閉,而是將連接放回到連接池中,以供下一個請求訪問使用,而這些連接的建立、斷開都是由連接池自身來管理的。 同時,還可以設置連接池的參數(shù)來控制連接池中的初始連接數(shù)、連接的上下限數(shù)和每個連接的大使用次數(shù)、大空閑時間等。當然,也可以通過連接池自身的管理機制來監(jiān)視連接的數(shù)量、使用情況等。
?
線程池就是實現(xiàn)線程的復用,它將線程和任務的概念分離開,使用線程來執(zhí)行任務,并提供統(tǒng)一的線程管理和任務管理的實現(xiàn)方法,避免了頻繁創(chuàng)建和銷毀線程所帶來的性能開銷。
線程池就是事先將多個線程對象放到一個容器中,當使用的時候就不用 new 線程而是直接去池中拿線程即可,節(jié)省了開辟子線程的時間,提高的代碼執(zhí)行效率。
線程池的原理很簡單,類似于操作系統(tǒng)中的緩沖區(qū)的概念。線程池中會先啟動若干數(shù)量的線程,這些線程都處于睡眠狀態(tài)。當客戶端有一個新的請求時,就會喚醒線程池中的某一個睡眠的線程,讓它來處理客戶端的這個請求,當處理完這個請求之后,線程又處于睡眠的狀態(tài)。
?
線程池相比于線程來說,它不需要頻繁的創(chuàng)建和銷毀線程,線程一旦創(chuàng)建之后,默認情況下就會一直保持在線程池中,等到有任務來了,再用這些已有的線程來執(zhí)行任務,如下圖所示:
?
關(guān)于線程池的實現(xiàn)一般分為三個部分
任務隊列,存儲需要處理的任務,由工作的線程來處理這些任務
通過線程池提供的 API 函數(shù),將一個待處理的任務添加到任務隊列,或者從任務隊列中刪除
已處理的任務會被從任務隊列中刪除
線程池的使用者,也就是調(diào)用線程池函數(shù)往任務隊列中添加任務的線程就是生產(chǎn)者線程
工作的線程(任務隊列任務的消費者)也就是池子里維護的線程,就是用來干事的,從隊列里面拿任
管理者線程(不處理任務隊列中的任務),用來生產(chǎn)工作的線程的,任務多了,池子里工作線程不夠了去創(chuàng)建一點;任務少了,池子里空閑線程多了,銷毀一點
用c寫的線程池
源碼:Xw-oorik/c-??
線程池和連接池就可以這么配套,線程池去拿任務,任務說要連數(shù)據(jù)庫,拿到任務的這個工作線程就去數(shù)據(jù)庫池子里拿連接,用完了再把連接還回去,任務干完了,任務就從消息隊列出去,結(jié)束任務的線程回到池子里等著拿后面的任務
?
為什么要用內(nèi)存池:
策略
?
內(nèi)存池在創(chuàng)建的過程中,會預先分配足夠大的內(nèi)存,形成一個初步的內(nèi)存池。然后每次用戶請求內(nèi)存的時候,就會返回內(nèi)存池中的一塊空閑的內(nèi)存,并將這塊內(nèi)存的標志置為已使用。當內(nèi)存使用完畢釋放內(nèi)存的時候,也不是真正地調(diào)用 free 或 delete 的過程,而是把內(nèi)存放回內(nèi)存池的過程,且放回的過程要把標志置為空閑。最后,應用程序結(jié)束就會將內(nèi)存池銷毀,將內(nèi)存池中的每一塊內(nèi)存釋放。
內(nèi)存池的優(yōu)點:
內(nèi)存池的缺點: 會造成內(nèi)存的浪費,因為要使用內(nèi)存池需要在一開始分配一大塊閑置的內(nèi)存,而這些內(nèi)存不一定全部被用到。
之前有寫過stl的底層的空間配置器,二級的空間配置器就是用內(nèi)存池+自由鏈表的形式避免了小塊內(nèi)存帶來的碎片化
看到內(nèi)存池這塊就要不得不了解這個配置器了,之前有寫過一篇博客?有關(guān)SGI STL的alloc_?純當復習了,再好好看看。
揭秘——STL空間配置器_?這一篇是在看alloc的時候找到了,也寫得很不錯,貼在這日后復習用
?
簡單說一說空間配置器
一級的話是大于128字節(jié)調(diào)用malloc申請
二級是小于128字節(jié),調(diào)用。底層是一個自由鏈表和內(nèi)存池實現(xiàn)的,底層維護了16條鏈表,0-15編號,每一條鏈表根據(jù)8字節(jié)遞增,當我們申請內(nèi)存的時候根據(jù)大小去轉(zhuǎn)到對應編號的鏈表上。看鏈表上掛的內(nèi)存空不空,不空的話看內(nèi)存夠不夠,夠的話分配出去,指針往后移動;如果鏈表空了,就看內(nèi)存池空不空,內(nèi)存池不空,就分配一些個結(jié)點大小的內(nèi)存,把一個給用戶去用,剩下的掛在那個鏈表上方便后面去取;如果內(nèi)存池不夠分配或者空的話,就會使用malloc()從堆上申請內(nèi)存,一半拿去用,一半就給內(nèi)存池;如果堆內(nèi)存不夠給內(nèi)存池分配,那么二級配置器就會搜索鏈表調(diào)到下一個編號的鏈表上去給用戶分配內(nèi)存;如果有就分配,如果最后還沒有找到能給分配的鏈表的話就調(diào)用一級配置器malloc

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文題目:總結(jié)各種常見的池子-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://www.chinadenli.net/article48/dcdgep.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、用戶體驗、營銷型網(wǎng)站建設、網(wǎng)頁設計公司、外貿(mào)建站、響應式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容