PHP核心學習 執行緒安全

2021-06-21 10:10:11 字數 2061 閱讀 4911

php同一程序下的多個執行緒會試圖讀寫一些儲存在程序記憶體空間的公共資源,此時這些執行緒訪問的記憶體位址空間相同,當乙個執行緒修改時,會影響其它執行緒,這種共享會提高一些

操作的速度, 但是多個執行緒間就產生了較大的耦合,並且當多個執行緒併發時,就會產生常見的資料一致性問題或資源競爭等併發常見問題。

如果每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,則這些個全域性變數就是

執行緒安全的.

為解決執行緒的併發問題,php引入了tsrm: 執行緒安全資源管理器(thread safe resource manager)。 trsm 的實現**在 php 原始碼的 /tsrm 目錄下,我們稱之為 tsrm 層。

我的php原始碼位置(gentoo  x86_64 gnu/linux):

php的執行緒安全策略是將執行緒的共享資源複製多份,程序中的每個執行緒各自都有乙份共享資源的拷貝,各做各的,完全隔離

原理圖:

(出處:

_tsrm_tls_entry(tsrm )結構體:

struct _tsrm_tls_entry ;
每個tsrm_tls_entry結構負責表示乙個執行緒的所有全域性變數資源,其中thread_id儲存執行緒id,count記錄全域性變數數,next指向下乙個節點。storage可以看做指標陣列,其中每個元素是乙個指向本節點代表執行緒的乙個全域性變數。最終各個執行緒的tsrm_tls_entry被組成乙個鍊錶結構,並將煉表頭指標賦值給乙個全域性靜態變數tsrm_tls_table。注意,因為tsrm_tls_table是乙個貨真價實的全域性變數,所以所有執行緒會共享這個變數,這就實現了執行緒間的記憶體管理一致性。

(出處:

通過乙個ts_allocate_id()函式為新的執行緒分配乙個執行緒安全資源id(thread safe resource id):

/* allocates a new thread-safe-resource id */

tsrm_api ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor)

resource_types_table_size = id_count;

}resource_types_table[tsrm_unshuffle_rsrc_id(*rsrc_id)].size = size;

resource_types_table[tsrm_unshuffle_rsrc_id(*rsrc_id)].ctor = ctor;

resource_types_table[tsrm_unshuffle_rsrc_id(*rsrc_id)].dtor = dtor;

resource_types_table[tsrm_unshuffle_rsrc_id(*rsrc_id)].done = 0;

/* enlarge the arrays for the already active threads */

for (i=0; icount < id_count)

}p->count = id_count;

}p = p->next;}}

tsrm_mutex_unlock(tsmm_mutex);

tsrm_error((tsrm_error_level_core, "successfully allocated new resource id %d", *rsrc_id));

return *rsrc_id;

}

珠玉在前:

1.2.

3.

RT Thread核心學習之執行緒管理

執行緒是作業系統能夠進行運算排程的最小單位,它被包含在程序之中,是程序中的實際運作單位,其本質是將複雜的應用 乙個程序 分解成多個小的 可排程的 序列化的程式單元,當合理的劃分任務並正確執行時,能夠讓系統滿足實時系統的效能及時間的要求。如下圖所示,嵌入式系統執行任務a,該任務是系統通過感測器採集資料...

Linux核心學習

交叉工具鏈 核心相關知識 linux系統的構成 使用者空間 核心空間 思考 為什麼劃分為兩個層次?目的其實是為保護作業系統,防止應用程式的異常導致作業系統崩潰。核心空間與使用者空間是程式執行的兩種不同狀態,通過系統呼叫和硬體中斷能夠完成從使用者空間到核心空間的轉移。那麼linux的核心由哪些構成呢?...

linux 核心學習

linux核心獲取 官網 linux作業系統的核心是模組化,可以使用lsmod命令檢視核心模組,下面展示已載入系統的模組 root 172.16.0.55 vendor composer test lsmod module size used by nfnetlink queue 8111 0 nf...