這得益於linux的IO多路複用
應用層可以把多個socket連線註冊給作業系統,讓作業系統幫忙盯著這些socket有沒有資料過來(可讀/可寫)。
註冊完成之後,應用層就可以去幹別的事了。當socket有資料過來時,作業系統會通知應用層,應用層再去處理。這樣的優勢在於應用層1個執行緒,就可以服務多個網路請求,即 IO 多路複用。
IO多路複用的具體實現模型有 select/poll/epoll,目前epoll是效能最好的。
一個網路程式,客戶端A給服務端B發資料,A編寫socket程式,呼叫write API向這個socket fd寫資料。
寫完之後,資料怎麼發給B呢?
是需要經過作業系統、網絡卡、網線發過去的。
A的作業系統把資料按照網路協議包裝好,透過網絡卡發出去,經過網路線路,最終都到B了。
B誰先來處理?肯定是作業系統先拿到這些資料,它會先放在核心態,然後通知上層的應用,你的資料來了,你來讀取吧。
epoll是作業系統提供的API,應用層把socket提前註冊給作業系統,先調epoll的註冊方法,這就託管給作業系統了。
然後應用層再呼叫epoll的 wait 方法,有fd有資料過來/可寫,就返回,返回指的就是wait方法return了,應用層就拿到這個fd可以操作了。不返回說明,註冊的這些fd都不能讀寫,那應用層就阻塞在wait上等著,除非wait方法傳了個timeout引數,那就到了timeout也給應用層返回。
這是讀的情況。除了讀,還有寫。寫對應的是發資料,fd可以寫了,就通知應用層,應用就寫這個fd。
還是拿剛才A->B傳輸資料來說。剛才說的是讀,是B要讀A的資料。現在看A這一側,A要寫這個fd給B發資料。
一開始寫,fd對應的是作業系統的緩衝區,A寫fd,會先寫到作業系統的緩衝區裡,然後由作業系統把緩衝區的資料發給B。
但如果A一直寫一直寫,B那邊讀的慢,那A這邊的緩衝區就會滿了,滿了之後應用層還在調write,肯定就不可以寫了,那啥時再可以寫?A作業系統能知道B那邊有沒有把緩衝區的資料讀走,如果讀走了,緩衝區空出來了,那A的作業系統就通知應用層說,緩衝區空出來了,你繼續可以寫了。
fd是作業系統封裝的資料結構,但凡一個應用層要做網路互動,必須經過作業系統,所以作業系統就提供了很多高效的辦法,比如緩衝區和這些通知機制。
說白了就是,作業系統是一個大管家,其目的就是為了更好地服務上層應用,所以它做了很多事,這些IO多路複用,都是作業系統在幫應用層幹活。
這得益於linux的IO多路複用
核心點應用層可以把多個socket連線註冊給作業系統,讓作業系統幫忙盯著這些socket有沒有資料過來(可讀/可寫)。
註冊完成之後,應用層就可以去幹別的事了。當socket有資料過來時,作業系統會通知應用層,應用層再去處理。這樣的優勢在於應用層1個執行緒,就可以服務多個網路請求,即 IO 多路複用。
IO多路複用的具體實現模型有 select/poll/epoll,目前epoll是效能最好的。
簡單描述客戶端和服務端是如何透過 epoll 讀寫資料的。一個網路程式,客戶端A給服務端B發資料,A編寫socket程式,呼叫write API向這個socket fd寫資料。
寫完之後,資料怎麼發給B呢?
是需要經過作業系統、網絡卡、網線發過去的。
A的作業系統把資料按照網路協議包裝好,透過網絡卡發出去,經過網路線路,最終都到B了。
B誰先來處理?肯定是作業系統先拿到這些資料,它會先放在核心態,然後通知上層的應用,你的資料來了,你來讀取吧。
epoll是作業系統提供的API,應用層把socket提前註冊給作業系統,先調epoll的註冊方法,這就託管給作業系統了。
然後應用層再呼叫epoll的 wait 方法,有fd有資料過來/可寫,就返回,返回指的就是wait方法return了,應用層就拿到這個fd可以操作了。不返回說明,註冊的這些fd都不能讀寫,那應用層就阻塞在wait上等著,除非wait方法傳了個timeout引數,那就到了timeout也給應用層返回。
這是讀的情況。除了讀,還有寫。寫對應的是發資料,fd可以寫了,就通知應用層,應用就寫這個fd。
還是拿剛才A->B傳輸資料來說。剛才說的是讀,是B要讀A的資料。現在看A這一側,A要寫這個fd給B發資料。
一開始寫,fd對應的是作業系統的緩衝區,A寫fd,會先寫到作業系統的緩衝區裡,然後由作業系統把緩衝區的資料發給B。
但如果A一直寫一直寫,B那邊讀的慢,那A這邊的緩衝區就會滿了,滿了之後應用層還在調write,肯定就不可以寫了,那啥時再可以寫?A作業系統能知道B那邊有沒有把緩衝區的資料讀走,如果讀走了,緩衝區空出來了,那A的作業系統就通知應用層說,緩衝區空出來了,你繼續可以寫了。
fd是作業系統封裝的資料結構,但凡一個應用層要做網路互動,必須經過作業系統,所以作業系統就提供了很多高效的辦法,比如緩衝區和這些通知機制。
說白了就是,作業系統是一個大管家,其目的就是為了更好地服務上層應用,所以它做了很多事,這些IO多路複用,都是作業系統在幫應用層幹活。