poll函數編程教學 在非阻塞模式上怎么知道recv接收數據完成?
在非阻塞模式上怎么知道recv接收數據完成?以linux下的tcp socket編程為例:阻塞是指recv/read時,如果socket接收緩沖區有數據,我會一直保持清醒,直到有數據來了,我才讀完。在
在非阻塞模式上怎么知道recv接收數據完成?
以linux下的tcp socket編程為例:阻塞是指recv/read時,如果socket接收緩沖區有數據,我會一直保持清醒,直到有數據來了,我才讀完。
在發送/寫的時候,如果發送緩沖區滿了,沒有空間繼續發送,我就睡覺,磨蹭,直到發送緩沖區騰出足夠的空間讓我把所有的數據都塞進發送緩沖區。
(當然,如果你通過setsockopt設置了讀寫超時,超時到期后仍然會返回-1和EAGAIN,不會等待睡眠。)
非阻塞是指在recv/read時,如果接收緩沖區有數據并且我讀完了,如果沒有數據,我會直接帶著返回的-1和EGAIN離開,絕不會休眠等待任何延遲。
寫/發送時,如果發送緩沖區有足夠的空間,立即將數據放入發送緩沖區,然后離開。如果發送緩沖區已滿,空間不足,直接用返回的-1和EAGAIN離開。至于IO多路復用,首先要理解的是操作系統為你提供了一個功能。當你的一個套接字接收緩沖區有數據要讀或者發送緩沖區有空間要寫時,它會給你一個通知。
這樣在配合非阻塞socket使用的時候,我只會在系統通知我可以讀取哪個描述符的時候進行讀取操作,這樣可以保證我每次讀取的時候都能讀取到有效數據,除了return -1和EAGAIN我什么都不會做。
寫操作是相似的。
操作系統的這個功能被select/poll/epoll等系統調用函數使用,可以同時監控多個描述符的讀寫準備情況,使得多個描述符的I/O操作可以在一個線程中完成,稱為I/O復用。,其中 "再利用和指的是同一線程的重用。至于事件驅動,其實是I/O復用的另一種叫法。至于異步同步,我們在linux下常見的網絡編程模型大多是同步io。以讀操作為例,本質上用戶需要調用re。Ad/recv在處理業務邏輯之前從內核緩沖區讀取數據。
異步io意味著內核已經讀取了數據,用戶直接處理邏輯。
異步IO一般使用linux下的aio庫。
java初學推薦書籍有哪些?
排名不分先后
Effective Java
了解過Java的人應該或多或少聽過這本書,堪稱經典。書中主要列舉了一些知識點,然后分別對這些知識點進行闡述。內容相當深入,推薦有基礎的人閱讀。
Thinking with Java 4
Java思維被譽為Java圣經。不管你處于什么階段,每次看都能有所收獲。所以,對于初學者來說,這本書有褒有貶。你自己想想。
Java并發編程實踐
外國人寫的書,這是翻譯版,原著《Java Concurrency in Practice》,堪稱并發中的經典之作。翻譯的也很好,書內容偏理論,基本知識點都能概括。當然這本書還是要適合有一點并發基礎的人,零基礎的看起來會有點吃力。這本書可以大量閱讀。一遍又一遍,你不看一遍也會有新的理解。
對Java虛擬機的深刻理解
這本書也很經典,作者是國內的,在市場泛濫的今天,也算是上品了。書中對JVM進行了詳細而深刻的講解,是學習JVM原理的必備書籍。
頭部優先設計模式
Head first系列教材,看起來特別輕松,圖文并茂,通俗易懂,適合初學者選擇。
重構——改進現有代碼的設計
書中給出了70多個可行的重構,每個重構都介紹了一個經過驗證的代碼轉換技術的動機和技術。本書中提出的重構標準將幫助您一次一小步地修改代碼,從而降低開發過程中的風險。
MySQL技術內幕
本文從源代碼的角度深入分析了InnoDB的體系結構、實現原理和工作機制,并給出了大量的最佳實踐,可以幫助您系統深入地掌握InnoDB,更重要的是可以為您設計和管理高性能、高可用的數據庫系統提供優秀的指導。
另外,我可以和大家分享一下這幾年收集的關于Java三個方面的書籍。大概有幾個G 你可以通過回復 "Java書籍和雜志在后臺。如果對你有幫助,請點擊喜歡。