我們都知道,互聯網的世界其實就是數據的世界,無論你是在微信上聊天,在玩王者榮耀,還是逛淘寶,看小姐姐直播,背后其實都是數據的傳輸。
相信大部分學過計算機操作系統的程序員都知道,假如我們的數據存放在計算機的文件上(數據庫實際上也是存放在文件上),要把文件上的內容拷貝給用戶,需要經過多少次復制呢?
首先,我們需要把內容從文件中拷貝到我們的應用中,雖然這聽起來只有一次拷貝,實際上操作系統會進行兩次拷貝,首先會先把文件拷貝到操作系統內核,然后再從操作系統內核上拷貝到應用當中。同理,我們把內容拷貝到Socket傳輸給用戶的過程也是一樣的,需要先拷貝給操作系統內核,再拷貝給對應的Socket。一個簡單的功能,竟然要經過4次拷貝。
那么如何優化這么一個過程呢?linux有一個非常牛的技術,叫做零拷貝,那么在JAVA中如何實現呢?我發現很多Java程序員,雖然說是精通Java更多的是精通JavaWeb。其實Java也是非常博大精深的,Java的NIO其實已經幫我們解決了這個問題。
在Java NIO中,我們可以通過FileChannel.map,可以越過內核態,直接從文件拷貝數據到應用當中,同樣,可以把越過內核態,直接把數據從應用中拷貝到Socket中發送給用戶。這樣子,我們的系統調用,就變成了文件到應用到Socket,只要進行2次拷貝即可。
同時,我們Java NIO還提供給我們另外一個方法,可以不用經過應用,直接從文件中拷貝到Socket中,這就是FileChannel.transferTo。它會把數據從文件拷貝到內核中,然后從內核直接把數據再次拷貝給接收的Socket發送給用戶。
總結
好了,這就是Java當中的零拷貝技術了。JavaNIO,在程序員面試中也是經常出現的,如果你有興趣,歡迎關注我,我們一起學習,共同進步。同名公眾號(沙茶敏碎碎念)