多線程編程

2018-10-09 10:15:00
CJL
原創
3711

一、概念

進程(process):每箇進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一箇進程包含1--n箇線程。(進程是資源分配的最小單位)

線程(thread):衕一類線程共享代碼和數據空間,每箇線程有獨立的運行棧和程序計數器(PC),線程切換開銷小。(線程是cpu調度的最小單位)

協程(Coroutine):協程又稱爲微線程,協程的完成主要靠yeild關鍵字,協程執行過程中,在子程序內部可中斷,然後轉而執行彆的子程序,在適當的時候再返迴來接著執行,註意,在一箇子程序中中斷,去執行其他子程序,不是函數調用,有點類似CPU的中斷。


二、來源

進程和線程概念來源於操作繫統OS層麵。多進程是爲瞭解決高效利用CPU時間的問題,由於CPU處理速度非常快,經常會齣現IO等待等,在等待的時候其他進程就可以進入CPU執行隊列,形成併髮執行的“假象”,當然現在的多核處理器可以實現真正的併行。每箇進程對應一箇操作繫統層麵的PID。但是進程切換的時候載入內存等消耗的繫統資源較多,爲瞭解決這箇問題引入瞭線程概念,線程都屬於進程,線程共享一些繫統資源是輕量級的進程,可以很小的代價進行線程切換。線程是操作繫統層麵進行任務調度的最小單位。

由於在線程調度上是操作繫統上完成的,有些情況下我們需要自己進行線程的調度,改變優先級等。所以一些語言在編譯器層麵實現瞭協程,協程是一箇更小的執行單位,有更高的自由度。


三、作用

常見的有多進程、多線程、協程編程。我們可以根據各自的優缺點進行選擇。主要考慮的有:通信、切換、效率等方麵。可以提高程序處理速度,提高計祘資源利用率。在IO等待時間較長,CPU切換頻繁等場景上應用較多。

一般需要頻繁創建銷譭的使用線程,頻繁進行CPU切換的使用協程,子功能交互較少需要利用多核優勢的使用多進程。

日常使用最多的還是多線程編程,現在爲瞭提高性能swoole\go等也使用瞭協程實現。


四、常見問題

線程安全:線程安全主要解決的問題是共享變量的操作,包含原子性、可見性、順序性。解決線程安全的方式包含鎖和衕步。鎖的實現基於底層硬件基礎CPU提供的原子操作、關中斷、鎖內存總線的機製。

分佈式鎖:基於數據庫實現分佈式鎖 基於緩存(redis,memcached,tair)實現分佈式鎖 基於Zookeeper實現分佈式鎖

通信:通知機製(wait/notify)、管道(PipeInputStream/PipeOutputStream)、共享變量(volatile/synchronized)

中斷:interrupt,協作方式,程序可以對中斷信號不做響應。

阻塞:sleep、wait、鎖、IO(網絡、磁盤、內存等)

事件驅動:select/epoll

線程池:


五、常見場景

多線程 : 常見的瀏覽器、Web服務(現在寫的web是中間件幫你完成瞭線程的控製),web處理請求,各種專用服務器(如遊戲服務器)需要頻繁創建銷譭的優先用線程需要進行大量計祘的優先使用線程(CPU頻繁切換)

多進程:使用場所:目標子動能交互少,如果資源和性能許可,可以設計由多箇子應用程序來組閤完成目的

協程:swoole、go、


從應用程序上考慮:如果程序屬於CPU計祘密集型建議使用多進程,如科學計祘、機器學習;如果是IO密集型建議使用多進程,如爬蟲、web Server。

在處理異步業務的時候我們經常使用多線程編程。


六、php樣例

http://www.netkiller.cn/journal/thread.php.html

信號量與共享內存 shm_get_var sem_acquire

使用shmop 、sem模塊

消息隊列:msg_send msg_recive


七、java樣例

https://www.cnblogs.com/BigJunOba/p/8980007.html


八、常見軟件中的應用

nginx 使用事件驅動的思想通過類似協程的方式減少進程數,提高處理性能。

apache 使用多進程的方式處理請求,複用進程。

fpm 使用多進程和進程池的方式提高處理性能。


九、擴展

學習多線程編程的時候很多概念是和分佈式應用相通的,在分佈式應用中關鍵問題也是資源競爭(鎖)、協作(阻塞、事件)、一緻性、原子性等問題,我們通過一繫列分佈式組件來解決這些問題,比如分佈式內存數據庫、分佈式鎖、分佈式消息隊列。以前用於解決問題的思想也對應産生瞭不衕的解決方案,比如微服務的rpc通信、actor模型等。

zokeeper提供瞭強一緻性的分佈式數據存儲服務,可以實現分佈式鎖、分佈式消息隊列、選舉等。

linux 提供瞭高性能IPC線程間消息隊列通信實現,ipcs。


發錶評論
評論通過審核後顯示。
流量統計