本文目錄一覽:
- 1、C語言 阻塞,非阻塞和多線程有什麼關係
- 2、C語言中buffer到底是什麼意思?是數組?緩衝區?為什麼一般C程序中都不定義他直接拿來用呢?
- 3、c語言socket客戶端怎麼發送到mina nio
- 4、NiO?是什麼
C語言 阻塞,非阻塞和多線程有什麼關係
阻塞是在傳統的網路編程中我們依賴於ServerSocket,Socket進行通信,大致的框架就是ServerSocket調用accept方法,等待客戶端的連接,如果連接進來的時候則創建一個伺服器端socket,客戶端和伺服器端socket建立好InputStream 和outputStream通道進行通信,在這個網路IO的過程中inputStream的read 和outputStream的write方法都可能發送阻塞。為了減少這種阻塞對其他連接的影響,一般都會在伺服器端為每個連接開闢一個新的線程,或者使用線程池技術來避免線程的創建銷毀同時又一定程度支持並發量。然而這種情況下,如果發生大量的read 或者write阻塞線程池的效率會大大降低,而且操作系統也額外需要頻繁的處理cpu的切換。
非阻塞式通信實際是對上述模式的擴展,它的核心思想是為傳統的socket加入事件監聽的功能,操作系統可以在socket和serversocket上進行事件監聽,一旦監聽的對象發生了連接和可讀可寫的事件,監聽器就會對註冊了事件的對象返回相應的通知。在javaNIO中實現這一套的機制就是把socket 和ServerSocket重寫成為SocketChanel,ServerSocketChanel,他們的底層仍然使用socket實現,所以原則上javaNIO包可以完全實現阻塞和非阻塞兩種編程模式。事件監聽的功能由Selection類完成,他使用select方法一直阻塞式監聽註冊了的事件是否發生,對於每一個發生的事件,他都會返回一個selectionKey,通過這個key我們就可以確定這個事件的發生源(socket)和相關信息。對於ServerSocketChanel,Socketchanel分別對應了不同的事件,serverChanel只有OP_ACCEPT代表是否可以接受連接,而socketChanel則有OP_CONNECT、read、write事件。筆者認為與阻塞IO相比他的優勢在於可以避免read 和write的阻塞,因為這個比較具有實際意義的。比如是一個網路文件傳輸系統,read方法可能會因為網路原因發生多次阻塞,使用非阻塞IO read的話線程可以立即返回去處理其他任務。
多線程是在進程中進一步去劃分的獨立單元。
C語言中buffer到底是什麼意思?是數組?緩衝區?為什麼一般C程序中都不定義他直接拿來用呢?
C語言中buffer是緩衝區的意思。
不定義是不能拿過來直接用的,因為它肯定是在別的地方定義的,比如頭文件,或者是個全局變數等。一般是在編譯器裡面,右鍵這個變數,選gotodifination就可以看到它在哪定義的了。
緩衝區它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩衝輸入或輸出的數據,這部分預留的空間就叫做緩衝區。
擴展資料
C語言循環buffer的實現
#ifdefined(__CIRCLE_BUFFER__)
//”circle_buffer.h”
#ifndef__CIRCLE_BUFFER_H__
#define__CIRCLE_BUFFER_H__
#ifdefined(__CIRCLE_BUFFER__)
#includestdio.h
#includestring.h
#includestdlib.h
#includeassert.h
typedefunsignedcharcb_u8;
typedefunsignedshortintcb_u16;
typedefunsignedintcb_u32;
typedefsignedcharcb_s8;
typedefsignedshortintcb_s16;
typedefsignedintcb_s32;
typedefcharcb_char;
typedefenum{cb_false,cb_true}cb_bool;
typedefstruct{
cb_u8*bufptr;
cb_u32buflen;
cb_u32datalen;
cb_u32readpos;
cb_u32writepos;
}CircleBufferMngr;
typedefstruct{
void(*cb_init)(CircleBufferMngr**,cb_u32);
void(*cb_deinit)(CircleBufferMngr**);
void(*cb_info)(CircleBufferMngr*,cb_char*,cb_u32);
cb_u32(*cb_read)(CircleBufferMngr*,cb_u8*,cb_u32);
cb_u32(*cb_write)(CircleBufferMngr*,cb_u8*,cb_u32);
cb_u32(*cb_datalen)(CircleBufferMngr*);
cb_bool(*cb_full)(CircleBufferMngr*);
cb_bool(*cb_empty)(CircleBufferMngr*);
}CircleBufferApi;
#defineCB_MEMCPYmemcpy
#defineCB_MEMSETmemset
#defineCB_SPRINTsprintf
#defineCB_MALLOCmalloc
#defineCB_MFREEfree
#defineCB_ASSERTassert
#defineCB_SNPRINTsnprintf
#defineCB_TRACEprintf
//鎖定,禁止中斷和任務調度
#defineCB_GLOBAL_LOCK
#defineCB_GLOBAL_UNLOCK
externconstCircleBufferApicircleBufApi;
#defineCBMA_INITcircleBufApi.cb_init
#defineCBMA_DEINITcircleBufApi.cb_deinit
#defineCBMA_INFOcircleBufApi.cb_info
#defineCBMA_READcircleBufApi.cb_read
#defineCBMA_WRITEcircleBufApi.cb_write
#defineCBMA_DATALENcircleBufApi.cb_datalen
#defineCBMA_FULLcircleBufApi.cb_full
#defineCBMA_EMPTYcircleBufApi.cb_empty
#endif/*__CIRCLE_BUFFER__*/
#endif/*__CIRCLE_BUFFER_H__*/
c語言socket客戶端怎麼發送到mina nio
按 格式,生成相應的unsigned char [] 數據,傳送就是了
~
~
~
~
~
NiO?是什麼
Java NIO框架MINA用netty性能和鏈接數、並發等壓力測試參數好於mina。
特點:
1。NIO彌補了原來的I/O的不足,它再標準java代碼中提供了高速和面向塊的I/O
原力的I/O庫與NIO最重要的區別是數據打包和傳輸方式的不同,原來的I/O以流的方式處理數據,而NIO以塊的方式處理數據;
2.NIO以通道channel和緩衝區Buffer為基礎來實現面向塊的IO數據處理,MINA是開源的。
JavaNIO非堵塞應用通常適用用在I/O讀寫等方面,我們知道,系統運行的性能瓶頸通常在I/O讀寫,包括對埠和文件的操作上,過去,在打開一個I/O通道後,read()將一直等待在埠一邊讀取位元組內容,如果沒有內容進來,read()也是傻傻的等,這會影響我們程序繼續做其他事情,那麼改進做法就是開設線程,讓線程去等待,但是這樣做也是相當耗費資源的。
Java NIO非堵塞技術實際是採取Reactor模式,或者說是Observer模式為我們監察I/O埠,如果有內容進來,會自動通知我們,這樣,我們就不必開啟多個線程死等,從外界看,實現了流暢的I/O讀寫,不堵塞了。
Java NIO出現不只是一個技術性能的提高,會發現網路上到處在介紹它,因為它具有里程碑意義,從JDK1.4開始,Java開始提高性能相關的功能,從而使得Java在底層或者並行分散式計算等操作上已經可以和C或Perl等語言並駕齊驅。
如果至今還是在懷疑Java的性能,說明思想和觀念已經完全落伍了,Java一兩年就應該用新的名詞來定義。從JDK1.5開始又要提供關於線程、並發等新性能的支持,Java應用在遊戲等適時領域方面的機會已經成熟,Java在穩定自己中間件地位後,開始蠶食傳統C的領域。
原理:
NIO 有一個主要的類Selector,這個類似一個觀察者,只要我們把需要探知socketchannel告訴Selector,我們接著做別的事情,當有事件發生時,他會通知我們,傳回一組SelectionKey,我們讀取這些Key,就會獲得我們剛剛註冊過的socketchannel,然後,我們從這個Channel中讀取數據,放心,包準能夠讀到,接著我們可以處理這些數據。Selector內部原理實際是在做一個對所註冊的channel的輪詢訪問,不斷的輪詢(目前就這一個演算法),一旦輪詢到一個channel有所註冊的事情發生。比如數據來了,他就會站起來報告,交出一把鑰匙,讓我們通過這把鑰匙來讀取這個channel的內容。在使用上,也在分兩個方向,一個是線程處理,一個是用非線程,後者比較簡單。
原創文章,作者:KBHT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/141232.html