日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

linux網(wǎng)絡(luò)配置命令 linux網(wǎng)絡(luò)配置的詳細(xì)過程( 二 )



網(wǎng)絡(luò)編程都需要知道FD??? FD是個什么鬼???
Linux:萬物都是文件,F(xiàn)D就是文件的引用 。像不像JAVA中萬物都是對象?程序中操作的是對象的引用 。JAVA中創(chuàng)建對象的個數(shù)有內(nèi)存的限制,同樣FD的個數(shù)也是有限制的 。

linux網(wǎng)絡(luò)配置命令 linux網(wǎng)絡(luò)配置的詳細(xì)過程


Linux在處理文件和網(wǎng)絡(luò)連接時,都需要打開和關(guān)閉FD 。
每個進(jìn)程都會有默認(rèn)的FD:
  • 0 標(biāo)準(zhǔn)輸入 stdin
  • 1 標(biāo)準(zhǔn)輸出 stdout
  • 2 錯誤輸出 stderr
1.5 服務(wù)端處理網(wǎng)絡(luò)請求的過程
linux網(wǎng)絡(luò)配置命令 linux網(wǎng)絡(luò)配置的詳細(xì)過程


  • 連接建立后 。
  • 等待數(shù)據(jù)準(zhǔn)備好(CPU 閑置) 。
  • 將數(shù)據(jù)從內(nèi)核拷貝到進(jìn)程中(CPU閑置) 。
怎么優(yōu)化呢?
對于一次I/O訪問(以read舉例),數(shù)據(jù)會先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū),然后才會從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間 。
所以說,當(dāng)一個read操作發(fā)生時,它會經(jīng)歷兩個階段:
  • 等待數(shù)據(jù)準(zhǔn)備 (Waiting for the data to be ready) 。
  • 將數(shù)據(jù)從內(nèi)核拷貝到進(jìn)程中 (Copying the data from the kernel to the process) 。
【linux網(wǎng)絡(luò)配置命令 linux網(wǎng)絡(luò)配置的詳細(xì)過程】正是因?yàn)檫@兩個階段,Linux系統(tǒng)升級迭代中出現(xiàn)了下面三種網(wǎng)絡(luò)模式的解決方案 。
二、IO模型介紹2.1 阻塞 I/O – Blocking I/O
linux網(wǎng)絡(luò)配置命令 linux網(wǎng)絡(luò)配置的詳細(xì)過程


簡介:最原始的網(wǎng)絡(luò)I/O模型 。進(jìn)程會一直阻塞,直到數(shù)據(jù)拷貝完成 。
缺點(diǎn):高并發(fā)時,服務(wù)端與客戶端對等連接,線程多帶來的問題:
  • CPU資源浪費(fèi),上下文切換 。
  • 內(nèi)存成本幾何上升,JVM一個線程的成本約1MB 。
public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket();ss.bind(new InetSocketAddress(Constant.HOST, Constant.PORT));int idx =0;while (true) {final Socket socket = ss.accept();//阻塞方法new Thread(() -> {handle(socket);},"線程["+idx+"]" ).start();}}static void handle(Socket socket) {byte[] bytes = new byte[1024];try {String serverMsg = "server sss[ 線程:"+ Thread.currentThread().getName() +"]";socket.getOutputStream().write(serverMsg.getBytes());//阻塞方法socket.getOutputStream().flush();} catch (Exception e) {e.printStackTrace();}}2.2 非阻塞 I/O – Non Blocking IO
linux網(wǎng)絡(luò)配置命令 linux網(wǎng)絡(luò)配置的詳細(xì)過程


簡介:進(jìn)程反復(fù)系統(tǒng)調(diào)用,并馬上返回結(jié)果 。
缺點(diǎn):當(dāng)進(jìn)程有1000fds,代表用戶進(jìn)程輪詢發(fā)生系統(tǒng)調(diào)用1000次kernel,來回的用戶態(tài)和內(nèi)核態(tài)的切換,成本幾何上升 。
public static void main(String[] args) throws IOException {ServerSocketChannel ss = ServerSocketChannel.open();ss.bind(new InetSocketAddress(Constant.HOST, Constant.PORT));System.out.println(" NIO server started ... ");ss.configureBlocking(false);int idx =0;while (true) {final SocketChannel socket = ss.accept();//阻塞方法new Thread(() -> {handle(socket);},"線程["+idx+"]" ).start();}}static void handle(SocketChannel socket) {try {socket.configureBlocking(false);ByteBuffer byteBuffer = ByteBuffer.allocate(1024);socket.read(byteBuffer);byteBuffer.flip();System.out.println("請求:" + new String(byteBuffer.array()));String resp = "服務(wù)器響應(yīng)";byteBuffer.get(resp.getBytes());socket.write(byteBuffer);} catch (IOException e) {e.printStackTrace();}}2.3 I/O 多路復(fù)用 – IO multiplexing
linux網(wǎng)絡(luò)配置命令 linux網(wǎng)絡(luò)配置的詳細(xì)過程


簡介:單個線程就可以同時處理多個網(wǎng)絡(luò)連接 。內(nèi)核負(fù)責(zé)輪詢所有socket,當(dāng)某個socket有數(shù)據(jù)到達(dá)了,就通知用戶進(jìn)程 。多路復(fù)用在Linux內(nèi)核代碼迭代過程中依次支持了三種調(diào)用,即select、POLL、EPOLL三種多路復(fù)用的網(wǎng)絡(luò)I/O模型 。下文將畫圖結(jié)合Java代碼解釋 。

推薦閱讀