多線程實現(xiàn)并發(fā)TCP服務器課件_第1頁
多線程實現(xiàn)并發(fā)TCP服務器課件_第2頁
多線程實現(xiàn)并發(fā)TCP服務器課件_第3頁
多線程實現(xiàn)并發(fā)TCP服務器課件_第4頁
多線程實現(xiàn)并發(fā)TCP服務器課件_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

彭丹多線程并發(fā)服務器彭丹多線程并發(fā)服務器知識點回顧1.多線程2.Socket知識點回顧1.多線程1.多線程1.概念線程是程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不同的工作,稱為多線程。2.共享資源一個進程的所有線程共享進程的地址空間和全局變量3.函數(shù)

int

pthread_create(pthread_t

*tidp,const

pthread_attr_t

*attr,(void*)(*start_rtn)(void*),void

*arg);

編譯鏈接參數(shù) -pthread1.多線程1.概念2.Socket建立TCP連接流程代碼演示1TCP-簡單收發(fā)2.Socket建立TCP連接流程代碼演示本章知識點1.并發(fā)

2.

Linux下tcp并發(fā)服務器的幾種設計模式3.阻塞

4.

如何實現(xiàn)client和server實時收發(fā)數(shù)據(jù)5.如何實現(xiàn)TCPserver同時和多個客戶端相連6.

如何實現(xiàn)TCP多個客戶端互相通信本章知識點1.并發(fā)1.并發(fā)概念

當有多個線程在操作時,如果系統(tǒng)只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間段分配給各個線程執(zhí)行,在一個時間段的線程代碼運行時,其它線程處于掛起狀。這種方式我們稱之為并發(fā)(Concurrent)。1.并發(fā)概念3.Linux下tcp并發(fā)服務器的幾種設計模式多進程模式

accept返回成功時候,就為這一個連接fork一個進程,專門處理這個連接上的數(shù)據(jù)收發(fā),等這個連接處理結(jié)束之后就結(jié)束這個進程。

優(yōu)點:

編程相對簡單,不用考慮線程間的數(shù)據(jù)同步等。

缺點:

資源消耗大。啟動一個進程消耗相對比啟動一個線程要消耗大很多,同時在處理很多的連接時候需要啟動很多的進程多去處理,這時候?qū)ο到y(tǒng)來說壓力就會比較大。另外系統(tǒng)的進程數(shù)限制也需要考慮。

應用:

在客戶端數(shù)據(jù)不多的時候使用很方便,比如小于10個客戶端。3.Linux下tcp并發(fā)服務器的幾種設計模式多進程模式Linux下tcp并發(fā)服務器的幾種設計的模式多線程模式

類似多進程方式,但是針對一個連接啟動一個線程。

優(yōu)點:

相對多進程方式,會節(jié)約一些資源,會更加高效一些。

缺點:

相對多進程方式,增加了編程的復雜度,因為需要考慮數(shù)據(jù)同步和鎖保護。另外一個進程中不能啟動太多的線程。在Linux系統(tǒng)下線程在系統(tǒng)內(nèi)部其實就是進程,線程調(diào)度按照進程調(diào)度的方式去執(zhí)行的。

應用:

類似于多進程方式,適用于少量的客戶端的時候。Linux下tcp并發(fā)服務器的幾種設計的模式多線程模式Linux下tcp并發(fā)服務器的幾種設計的模式

select+多線程模式

有一個線程專門用于監(jiān)聽端口,accept返回之后就把這個描述符放入描述符集合fd中,一個線程用select去輪訓描述符集合,在有數(shù)據(jù)的連接上接收數(shù)據(jù),另外一個線程專門發(fā)送數(shù)據(jù)。當然也可以接收和發(fā)送用一個線程。描述符可以設置成非阻塞模式,也可以設置成阻塞模式。通常連接設置成非阻塞模式,發(fā)送線程獨立出來。

優(yōu)點:

相對前幾種模式,這種模式大大提高了并發(fā)量。

缺點:

系統(tǒng)一般實現(xiàn)描述符集合是采用一個大數(shù)組,每次調(diào)用select的時候都會輪詢這個描述符數(shù)組,當連接數(shù)很多的時候就會導致效率下降。連接數(shù)在1000以上時候效率會下降到不能接受。應用:

目前windows和一般的Unix上的tcp并發(fā)都采用select方式,應該說應用還是很廣泛的。Linux下tcp并發(fā)服務器的幾種設計的模式

selectLinux下tcp并發(fā)服務器的幾種設計的模式

epoll方式

在Linux2.6版本之后,增加了epoll。具體的使用是:一個線程專門進行端口監(jiān)聽,accept接收到連接的時候,把該連接設置成非阻塞模式,把epoll事件設置成邊緣觸發(fā)方式,加入到epoll管理。接收線程阻塞在epoll的等待事件函數(shù)。另外一個線程專門用于數(shù)據(jù)發(fā)送。

優(yōu)點:

由于epoll的實現(xiàn)方式先進,所以這種方式可以大規(guī)模的實現(xiàn)并發(fā)。我們現(xiàn)在的應用在一個3年前的dell的pcserver可以實現(xiàn)2萬個連接的并發(fā)。

缺點:

由于涉及了線程和非阻塞,所以會導致編碼的復雜度增大一些。這種方式只適用于Linux2.6內(nèi)核以后。

Linux下tcp并發(fā)服務器的幾種設計的模式

epoll方式

1。如果把epoll事件設置成水平觸發(fā)效率就下降到類似采用select的水平。

2。

Unix系統(tǒng)下有單個進程打開的描述符數(shù)目限制,還有系統(tǒng)內(nèi)打開的描述符數(shù)目限制。系統(tǒng)內(nèi)打開的描述符數(shù)目限制由軟硬限制兩個。硬限制是根據(jù)機器的配置而不同。軟限制可以更改,但是必須小于系統(tǒng)的硬限制。在suseLinux下,可以在root用戶下,通過ulimit-n數(shù)目

去修改這個限制。

應用:

Linux下大規(guī)模的tcp并發(fā)。

注意

1。如果把epoll事件設置成水平觸發(fā)效率就

當前并發(fā)還有其他的方式,比如進程池,線程池等,每種模式都有它的優(yōu)點和缺點,在適當?shù)那闆r用合適的模式是最重要的。

如果需要很大規(guī)模的并發(fā),經(jīng)過測試,采用epoll方式效率比較高。其他

其他進程并發(fā):通常用在業(yè)務不相關的組件場景中。例如,日志管理、業(yè)務管理、系統(tǒng)管理、文件管理通常是放在不同的進程去處理。因為這幾種組件處理的業(yè)務都是很內(nèi)聚的,沒有共享數(shù)據(jù)和資源,只有在少量情況下需要互相通信。場景進程并發(fā):場景多線程并發(fā):比如在業(yè)務管理進程中,我們則希望不同類業(yè)務數(shù)據(jù)和資源容易互相訪問,但是不同種類的業(yè)務邏輯是彼此獨立的,即,線程之間會去看共享數(shù)據(jù),而線程公平性的調(diào)度則交給操作系統(tǒng)。場景多線程并發(fā):場景IO多路復用:是在同一種類型業(yè)務中,資源是強相關的,也就是說業(yè)務之間會互相看對方的數(shù)據(jù)或者狀態(tài)來決定自己的行為,并且我們可能希望控制不同子業(yè)務間的執(zhí)行順序。而各種子業(yè)務間也需要一定的并發(fā)性,即,各子業(yè)務間不應強行互相等待,保證子業(yè)務在等待某種資源時,能夠騰出手來干其他子業(yè)務。這種方式下,由于是單線程,能夠保證一個子業(yè)務在訪問其他業(yè)務的狀態(tài)和數(shù)據(jù)時,保持一個穩(wěn)定狀態(tài)。場景IO多路復用:場景3.阻塞1.阻塞式I/O2.

非阻塞式I/O3.阻塞函數(shù)3.阻塞1.阻塞式I/O概念阻塞

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會被掛起(線程進入非可執(zhí)行狀態(tài),在這個狀態(tài)下,cpu不會給線程分配時間片,即線程暫停運行)。函數(shù)只有在得到結(jié)果之后才會返回。

快遞的例子:比如到你某個時候到A樓一層(假如是內(nèi)核緩沖區(qū))取快遞,但是你不知道快遞什么時候過來,你又不能干別的事,只能死等著。但你可以睡覺(進程處于休眠狀態(tài)),因為你知道快遞把貨送來時一定會給你打個電話(假定一定能叫醒你)。

非阻塞

非阻塞和阻塞的概念相對應,指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當前線程,而會立刻返回。

還是等快遞的例子:如果用忙輪詢的方法,每隔5分鐘到A樓一層(內(nèi)核緩沖區(qū))去看快遞來了沒有。如果沒來,立即返回。而快遞來了,就放在A樓一層,等你去取。

概念阻塞

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會Linux下的五種I/O模型阻塞式I/OLinux下的五種I/O模型阻塞式I/O阻塞式I/O阻塞式I/OLinux下的五種I/O模型非阻塞式I/OLinux下的五種I/O模型非阻塞式I/O3)I/O復用(select和poll)

(I/Omultiplexing)

4)信號驅(qū)動I/O

(signaldrivenI/O(SIGIO))

5)異步I/O

(asynchronousI/O(thePOSIXaio_functions))Linux下的五種I/O模型3)I/O復用(select和poll)

(I/Omu阻塞函數(shù)accept()函數(shù)accept缺省是阻塞函數(shù),阻塞直到有連接請求,將響應連接請求,建立連接,產(chǎn)生一個新的socket描述符來描述該連接,這個連接用來與特定的Client交換信息recv()函數(shù)recv缺省是阻塞函數(shù),用于TCP協(xié)議中接收信息,直到接收到信息或出錯Send()函數(shù)recv缺省是阻塞函數(shù),用于TCP協(xié)議中發(fā)送信息,直到發(fā)送完畢或出錯阻塞函數(shù)accept()函數(shù)4.代碼演示2TCP同步收發(fā)實現(xiàn)client、server實時收發(fā)數(shù)據(jù)4.代碼演示實現(xiàn)client、server實時收發(fā)數(shù)據(jù)5.實現(xiàn)TCPserver和多個客戶端相連模塊圖代碼演示3TCP-和多個客戶端同時相連-簡單連接5.實現(xiàn)TCPserver和多個客戶端相連代碼演示5.如何實現(xiàn)TCP多個客戶端互相通信代碼演示3TCP-和多個客戶端同時相連-廣播5.如何實現(xiàn)TCP多個客戶端互相通信代碼演示彭丹多線程并發(fā)服務器彭丹多線程并發(fā)服務器知識點回顧1.多線程2.Socket知識點回顧1.多線程1.多線程1.概念線程是程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不同的工作,稱為多線程。2.共享資源一個進程的所有線程共享進程的地址空間和全局變量3.函數(shù)

int

pthread_create(pthread_t

*tidp,const

pthread_attr_t

*attr,(void*)(*start_rtn)(void*),void

*arg);

編譯鏈接參數(shù) -pthread1.多線程1.概念2.Socket建立TCP連接流程代碼演示1TCP-簡單收發(fā)2.Socket建立TCP連接流程代碼演示本章知識點1.并發(fā)

2.

Linux下tcp并發(fā)服務器的幾種設計模式3.阻塞

4.

如何實現(xiàn)client和server實時收發(fā)數(shù)據(jù)5.如何實現(xiàn)TCPserver同時和多個客戶端相連6.

如何實現(xiàn)TCP多個客戶端互相通信本章知識點1.并發(fā)1.并發(fā)概念

當有多個線程在操作時,如果系統(tǒng)只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間段分配給各個線程執(zhí)行,在一個時間段的線程代碼運行時,其它線程處于掛起狀。這種方式我們稱之為并發(fā)(Concurrent)。1.并發(fā)概念3.Linux下tcp并發(fā)服務器的幾種設計模式多進程模式

accept返回成功時候,就為這一個連接fork一個進程,專門處理這個連接上的數(shù)據(jù)收發(fā),等這個連接處理結(jié)束之后就結(jié)束這個進程。

優(yōu)點:

編程相對簡單,不用考慮線程間的數(shù)據(jù)同步等。

缺點:

資源消耗大。啟動一個進程消耗相對比啟動一個線程要消耗大很多,同時在處理很多的連接時候需要啟動很多的進程多去處理,這時候?qū)ο到y(tǒng)來說壓力就會比較大。另外系統(tǒng)的進程數(shù)限制也需要考慮。

應用:

在客戶端數(shù)據(jù)不多的時候使用很方便,比如小于10個客戶端。3.Linux下tcp并發(fā)服務器的幾種設計模式多進程模式Linux下tcp并發(fā)服務器的幾種設計的模式多線程模式

類似多進程方式,但是針對一個連接啟動一個線程。

優(yōu)點:

相對多進程方式,會節(jié)約一些資源,會更加高效一些。

缺點:

相對多進程方式,增加了編程的復雜度,因為需要考慮數(shù)據(jù)同步和鎖保護。另外一個進程中不能啟動太多的線程。在Linux系統(tǒng)下線程在系統(tǒng)內(nèi)部其實就是進程,線程調(diào)度按照進程調(diào)度的方式去執(zhí)行的。

應用:

類似于多進程方式,適用于少量的客戶端的時候。Linux下tcp并發(fā)服務器的幾種設計的模式多線程模式Linux下tcp并發(fā)服務器的幾種設計的模式

select+多線程模式

有一個線程專門用于監(jiān)聽端口,accept返回之后就把這個描述符放入描述符集合fd中,一個線程用select去輪訓描述符集合,在有數(shù)據(jù)的連接上接收數(shù)據(jù),另外一個線程專門發(fā)送數(shù)據(jù)。當然也可以接收和發(fā)送用一個線程。描述符可以設置成非阻塞模式,也可以設置成阻塞模式。通常連接設置成非阻塞模式,發(fā)送線程獨立出來。

優(yōu)點:

相對前幾種模式,這種模式大大提高了并發(fā)量。

缺點:

系統(tǒng)一般實現(xiàn)描述符集合是采用一個大數(shù)組,每次調(diào)用select的時候都會輪詢這個描述符數(shù)組,當連接數(shù)很多的時候就會導致效率下降。連接數(shù)在1000以上時候效率會下降到不能接受。應用:

目前windows和一般的Unix上的tcp并發(fā)都采用select方式,應該說應用還是很廣泛的。Linux下tcp并發(fā)服務器的幾種設計的模式

selectLinux下tcp并發(fā)服務器的幾種設計的模式

epoll方式

在Linux2.6版本之后,增加了epoll。具體的使用是:一個線程專門進行端口監(jiān)聽,accept接收到連接的時候,把該連接設置成非阻塞模式,把epoll事件設置成邊緣觸發(fā)方式,加入到epoll管理。接收線程阻塞在epoll的等待事件函數(shù)。另外一個線程專門用于數(shù)據(jù)發(fā)送。

優(yōu)點:

由于epoll的實現(xiàn)方式先進,所以這種方式可以大規(guī)模的實現(xiàn)并發(fā)。我們現(xiàn)在的應用在一個3年前的dell的pcserver可以實現(xiàn)2萬個連接的并發(fā)。

缺點:

由于涉及了線程和非阻塞,所以會導致編碼的復雜度增大一些。這種方式只適用于Linux2.6內(nèi)核以后。

Linux下tcp并發(fā)服務器的幾種設計的模式

epoll方式

1。如果把epoll事件設置成水平觸發(fā)效率就下降到類似采用select的水平。

2。

Unix系統(tǒng)下有單個進程打開的描述符數(shù)目限制,還有系統(tǒng)內(nèi)打開的描述符數(shù)目限制。系統(tǒng)內(nèi)打開的描述符數(shù)目限制由軟硬限制兩個。硬限制是根據(jù)機器的配置而不同。軟限制可以更改,但是必須小于系統(tǒng)的硬限制。在suseLinux下,可以在root用戶下,通過ulimit-n數(shù)目

去修改這個限制。

應用:

Linux下大規(guī)模的tcp并發(fā)。

注意

1。如果把epoll事件設置成水平觸發(fā)效率就

當前并發(fā)還有其他的方式,比如進程池,線程池等,每種模式都有它的優(yōu)點和缺點,在適當?shù)那闆r用合適的模式是最重要的。

如果需要很大規(guī)模的并發(fā),經(jīng)過測試,采用epoll方式效率比較高。其他

其他進程并發(fā):通常用在業(yè)務不相關的組件場景中。例如,日志管理、業(yè)務管理、系統(tǒng)管理、文件管理通常是放在不同的進程去處理。因為這幾種組件處理的業(yè)務都是很內(nèi)聚的,沒有共享數(shù)據(jù)和資源,只有在少量情況下需要互相通信。場景進程并發(fā):場景多線程并發(fā):比如在業(yè)務管理進程中,我們則希望不同類業(yè)務數(shù)據(jù)和資源容易互相訪問,但是不同種類的業(yè)務邏輯是彼此獨立的,即,線程之間會去看共享數(shù)據(jù),而線程公平性的調(diào)度則交給操作系統(tǒng)。場景多線程并發(fā):場景IO多路復用:是在同一種類型業(yè)務中,資源是強相關的,也就是說業(yè)務之間會互相看對方的數(shù)據(jù)或者狀態(tài)來決定自己的行為,并且我們可能希望控制不同子業(yè)務間的執(zhí)行順序。而各種子業(yè)務間也需要一定的并發(fā)性,即,各子業(yè)務間不應強行互相等待,保證子業(yè)務在等待某種資源時,能夠騰出手來干其他子業(yè)務。這種方式下,由于是單線程,能夠保證一個子業(yè)務在訪問其他業(yè)務的狀態(tài)和數(shù)據(jù)時,保持一個穩(wěn)定狀態(tài)。場景IO多路復用:場景3.阻塞1.阻塞式I/O2.

非阻塞式I/O3.阻塞函數(shù)3.阻塞1.阻塞式I/O概念阻塞

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會被掛起(線程進入非可執(zhí)行狀態(tài),在這個狀態(tài)下,cpu不會給線程分配時間片,即線程暫停運行)。函數(shù)只有在得到結(jié)果之后才會返回。

快遞的例子:比如到你某個時候到A樓一層(假如是內(nèi)核緩沖區(qū))取快遞,但是你不知道快遞什么時候過來,你又不能干別的事,只能死等著。但你可以睡覺(進程處于休眠狀態(tài)),因為你知道快遞把貨送來時一定會給你打個電話(假定一定能叫醒你)。

非阻塞

非阻塞和阻塞的概念相對應,指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當前線程,而會立刻返回。

還是等快遞的例子:如果用忙輪詢的方法,每隔5分鐘到A樓一層(內(nèi)核緩沖區(qū))

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論