1. 程式人生 > >程序池,執行緒池

程序池,執行緒池

池的概念

由於伺服器的硬體資源“充裕”,那麼提高伺服器效能的一個很直接的方法就是以空間換時間,即“浪費”伺服器的硬體資源,以換取其執行效率。這就是池的概念。池是一組資源的集合,這組資源在伺服器啟動之初就完全被建立並初始化,這稱為靜態資源分配。當伺服器進入正式執行階段,即開始處理客戶請求的時候,如果它需要相關的資源,就可以直接從池中獲取,無需動態分配。很顯然,直接從池中取得所需資源比動態分配資源的速度要快得多,因為分配系統資源的系統呼叫都是很耗時的。當伺服器處理完一個客戶連線後,可以把相關的資源放回池中,無需執行系統呼叫來釋放資源。從最終效果來看,池相當於伺服器管理系統資源的應用設施,它避免了伺服器對核心的頻繁訪問。

池可以分為多種,常見的有記憶體池、程序池、執行緒池和連線池。

記憶體池

記憶體池是一種記憶體分配方式。通常我們習慣直接使用new、malloc等系統呼叫申請分配記憶體,這樣做的缺點在於:由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。

記憶體池則是在真正使用記憶體之前,先申請分配一定數量的、大小相等(一般情況下)的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的一個顯著優點是,使得記憶體分配效率得到提升。

程序池和執行緒池

程序池和執行緒池相似,所以這裡我們以程序池為例進行介紹。如沒有特殊宣告,下面對程序池的描述也適用於執行緒池。

程序池是由伺服器預先建立的一組子程序,這些子程序的數目在 3~10 個之間(當然這只是典型情況)。執行緒池中的執行緒數量應該和 CPU 數量差不多。

程序池中的所有子程序都執行著相同的程式碼,並具有相同的屬性,比如優先順序、 PGID 等。

當有新的任務來到時,主程序將通過某種方式選擇程序池中的某一個子程序來為之服務。相比於動態建立子程序,選擇一個已經存在的子程序的代價顯得小得多。至於主程序選擇哪個子程序來為新任務服務,則有兩種方法:

1)主程序使用某種演算法來主動選擇子程序。最簡單、最常用的演算法是隨機演算法和 Round Robin (輪流演算法)。

2)主程序和所有子程序通過一個共享的工作佇列來同步,子程序都睡眠在該工作佇列上。當有新的任務到來時,主程序將任務新增到工作佇列中。這將喚醒正在等待任務的子程序,不過只有一個子程序將獲得新任務的“接管權”,它可以從工作佇列中取出任務並執行之,而其他子程序將繼續睡眠在工作佇列上。

當選擇好子程序後,主程序還需要使用某種通知機制來告訴目標子程序有新任務需要處理,並傳遞必要的資料。最簡單的方式是,在父程序和子程序之間預先建立好一條管道,然後通過管道來實現所有的程序間通訊。在父執行緒和子執行緒之間傳遞資料就要簡單得多,因為我們可以把這些資料定義為全域性,那麼它們本身就是被所有執行緒共享的。

執行緒池主要用於:

1)需要大量的執行緒來完成任務,且完成任務的時間比較短。 比如WEB伺服器完成網頁請求這樣的任務,使用執行緒池技術是非常合適的。因為單個任務小,而任務數量巨大。但對於長時間的任務,比如一個Telnet連線請求,執行緒池的優點就不明顯了。因為Telnet會話時間比執行緒的建立時間大多了。

2)對效能要求苛刻的應用,比如要求伺服器迅速響應客戶請求。

3)接受突發性的大量請求,但不至於使伺服器因此產生大量執行緒的應用。

相關推薦

程序執行

池的概念由於伺服器的硬體資源“充裕”,那麼提高伺服器效能的一個很直接的方法就是以空間換時間,即“浪費”伺服器的硬體資源,以換取其執行效率。這就是池的概念。池是一組資源的集合,這組資源在伺服器啟動之初就完全被建立並初始化,這稱為靜態資源分配。當伺服器進入正式執行階段,即開始處理客戶請求的時候,如果它需要相關的資

Python併發程式設計(十一):程序執行協程

目錄 注意 二、執行緒池 協程的本質 注意 1、不能無限的開程序和執行緒,最常用的就是開程序池,開執行緒池。 2、其中回撥函式非常重要,回撥函式其實可以作為一種程式設計思想,函數語言程式設

連線執行 概念

資料庫連線池    引數介紹:     name:表示你的連線池的名稱也就是你要訪問連線池的地址     auth:是連線池管理權屬性,Container表示容器管理     type:是物件的型別  

使用concurrent.futures模組併發實現程序執行

Python標準庫為我們提供了threading和multiprocessing模組編寫相應的非同步多執行緒/多程序程式碼 從Python3.2開始,標準庫為我們提供了concurrent.futures模組,它提供了ThreadPoolExecutor和ProcessPoolExecutor兩個類Thre

java:記憶體程序執行

記憶體池: 自定義記憶體池的思想通過這個"池"字表露無疑,應用程式可以通過系統的記憶體分配呼叫預先一次性申請適當大小的記憶體作為一個記憶體池,之後應用程式自己對記憶體的分配和釋放則可以通過這個記憶體池來完成。 只有當記憶體池大小需要動態擴充套件時,才需要再呼叫系統的記憶體分配函式,其他時間對

第三十八天 GIL 程序執行

今日內容: 1.GIL 全域性直譯器鎖 2.Cpython直譯器併發效率驗證 3.執行緒互斥鎖和GIL對比 4.程序池與執行緒池 一.全域性直譯器鎖   1.GIL:全域性直譯器鎖     GIL本質就是一把互斥鎖,是夾在直譯器身上的     統一程序內的所有執行緒都需要先搶到GIL鎖,才能執

程序執行實現高併發伺服器

思想:   1.  建立與伺服器相同cpu個數的程序個數來監聽(accept)客戶端響應,並在每個程序中先建立好一個執行緒池   2.  有客戶端訪問時,解除其中一個程序的accpet阻塞,進入到執行緒中來執行接收資料工作( recv() ),用執行緒防止recv阻塞,執行緒呼叫recv方法   3. 

day 34 GIL鎖執行佇列執行執行回撥函式

一 . GIL鎖   GIL鎖是python程式碼轉直譯器程式碼的一個鎖         雖然我們加鎖的原因是因為要保護安全性從而降低了效率,但是加鎖也會出現安全性的問題!         二 . 執行緒佇列   import queue   三種佇列形式

java 多執行執行

如果執行緒數量<=核心執行緒數量,那麼直接啟動一個核心執行緒來執行任務,不會放入佇列中。 如果執行緒數量>核心執行緒數,但<=最大執行緒數,並且任務佇列是LinkedBlockingDeque的時候,超過核心執行緒數量的任務會放在任務佇列中排隊。 如果執行緒數量>核心執行緒數,

10.執行執行的區別執行有哪些什麼情況下使用

一:執行緒和執行緒池的區別 (1)new Thread 的弊端       a. 每次new Thread時,新建物件效能差。       b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,可能佔用過多系統資源導致宕機或oom。       c. 缺乏更多功能

11.執行的狀態執行的構造方式執行的特性

一:執行緒的狀態 (1)初始狀態         實現Runnable介面和繼承Thread可以得到一個執行緒類,new一個例項出來,執行緒就進入了初始狀態。 (2) 就緒狀態       1)就緒狀態只是說你資格執行,排程程式沒有挑選到你,你就永遠是就緒狀態。

高效能伺服器程式設計——程序執行

前言   一般來說,伺服器的硬體資源相對充裕,很多時候都用空間換時間的方法來提高伺服器的效能,不惜浪費大量的空間資源來換取伺服器的執行效率。 池的概念   具體做法:提前申請大量的資源,以備不時之需以及重複使用。這就是池的概念  

執行(十一)兩種傳統傳統方式建立:(thread、Runnable) 執行方式ExcutorServicePool

傳統方式建立執行緒: 1、繼承Thread類,重寫run方法 2、實現Runnable介面,覆蓋介面中的run方法,然後將介面實現扔給Thread run方法探祕: Thread原始碼中的run方法,如下: @Override public void run

JAVA基礎24-多執行(四)【讀寫鎖阻塞佇列執行

一、讀寫鎖   使用步驟 二、阻塞佇列 (BlockingQueue) 提供執行緒安全的佇列訪問方式; 當阻塞佇列進行插入資料時,若佇列滿,則執行緒阻塞,直到佇列非滿的時候 當阻塞佇列取資料時,若佇列為空,則執行緒阻塞直到佇列非空時候。

(四)java 執行執行的使用

為什麼要使用執行緒池?    建立執行緒是簡單的,但啟動後的執行緒猶如脫繮野馬,難於管理,特別是多執行緒使用場景,執行緒之間的互相競爭,可能使 cpu 花費更多時間在各個執行緒之間切換,而且執行緒結束後的回收由垃圾回收控制,你不知道工作結束的執行緒還會存活多久,是否持有著什麼資源。而

Python系列之程序執行

在剛開始學多程序或多執行緒時,我們迫不及待地基於多程序或多執行緒實現併發的套接字通訊,然而這種實現方式的致命缺陷是:服務的開啟的程序數或執行緒數都會隨著併發的客戶端數目地增多而增多,這會對服務端主

JAVA執行--Executors之什麼是執行為什麼使用執行以及執行的使用

1. 為什麼需要執行緒池?      多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。              假設一個伺服器完成一項任務所需時間為:T1 建立執行緒時間,T2 線上程中執行任務的時間,T

GIL鎖、程序執行

1.什麼是GIL? 官方解釋: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes

CIL鎖,GIL與執行的區別,程序執行,同步與非同步

一.GIL鎖 什麼是GIL? 全域性直譯器鎖,是加在直譯器上的互斥鎖 GC是python自帶的記憶體管理機制,GC的工作原理:python中的記憶體管理使用的是應用計數,每個數會被加上一個整型的計數器,表示這個資料被引用的次數,當這個整數變為0時則表示該資料已經沒有人使用,成為了垃圾資料,當記憶體佔用達到

python GIL鎖、程序執行、同步非同步

一、GIL全域性直譯器鎖 全域性直譯器鎖 在CPython中,全域性直譯器鎖(GIL)是一個互斥鎖,它可以防止多個本機執行緒同時執行Python程式碼。之所以需要這個鎖,主要是因為CPython的記憶體管理不是執行緒安全的。(然而,自從GIL存在以來,其他特性已經逐漸依賴於它所執行的保證)