現在買東西真的是太方便了

科技始終來自於惰性真的沒錯~~~好像怪怪的~~

因為物流的進步以及無遠弗屆網路商城,現在不用出門也可以買到自己喜歡的東西

無論是生活上用的,還是個人運動類的產品

網路商城幾乎都可以買到~

尤其最近很常逛momo,真的是感覺非常方便啊

有一次買到瑕疵品,他們物流很快就收走,換新的給我真的很不錯

【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)是我在網路上閒逛時,猛然看到的產品

簡直讓我非常驚艷!

這類型的產品其實本來我就有在找,不過一直遇不到打折的好時機

現在終於等到了,而且廠商也正好有貨

不然等下次折扣,不知道等到什麼時候

所以我個人對【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)的評比如下

外觀質感:★★★★

使用爽感:★★★★☆

性能價格:★★★★☆

詳細介紹如下~參考一下吧

 

完整產品說明

呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)AngelHoney天使霓裳







品牌名稱

  •  

組裝方式

  • 免組裝

商品規格

  • 品牌    其他品牌
    款式    蛙鏡呼吸管
    產地    中國
    顏色    白, 黑, 黃, 粉, 桃
    尺寸    FREE SIZE

 

非常推薦【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)給大家

↓↓↓【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)限量特惠的優惠按鈕↓↓↓

↓↓↓更多優質好物推薦↓↓↓

 

標籤註解:

PTT鄉民【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)限量,團購,限時,週年慶,禮物,優惠,【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)特價,開箱,比價,活動,好評,推薦

01網友【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)哪裡便宜,採購,優缺點,試用【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色),好用,CP值,經驗,好康,集購,下殺,免比價,去哪買?,

名人推薦【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)介紹,部落客,排行,【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色),體驗,精選,限定,折扣,折價卷

↓↓↓【Angel 天使霓裳】快速到貨 呼吸管 夏日戲水 潛水浮淺用濕式呼吸管(208-共5色)限量特惠的優惠按鈕↓↓↓

熱點新聞搶先報

 

I/O( INPUT OUTPUT),包括文件I/O、網絡I/O。 計算機世界裡的速度鄙視: 內存讀數據:納秒級別。 千兆網卡讀數據:微妙級別。1微秒=1000納秒,網卡比內存慢了千倍。 磁碟讀數據:毫秒級別。1毫秒=10萬納秒 ,硬碟比內存慢了10萬倍。 CPU一個時鐘周期1納秒上下,內存算是比較接近CPU的,其他都等不起。 CPU 處理數據的速度遠大於I/O準備數據的速度 。 任何程式語言都會遇到這種CPU處理速度和I/O速度不匹配的問題! 在網絡編程中如何進行網絡I/O優化:怎麼高效地利用CPU進行網絡數據處理??? 一、相關概念 從作業系統層面怎麼理解網絡I/O呢?計算機的世界有一套自己定義的概念。如果不明白這些概念,就無法真正明白技術的設計思路和本質。所以在我看來,這些概念是了解技術和計算機世界的基礎。 1.1 同步與異步,阻塞與非阻塞 理解網絡I/O避不開的話題:同步與異步,阻塞與非阻塞。 拿山治燒水舉例來說,(山治的行為好比用戶程序,燒水好比內核提供的系統調用),這兩組概念翻譯成大白話可以這麼理解。 同步/異步關注的是水燒開之後需不需要我來處理。 阻塞/非阻塞關注的是在水燒開的這段時間是不是幹了其他事。 1.1.1 同步阻塞 點火後,傻等,不等到水開堅決不干任何事(阻塞),水開了關火(同步)。 ... 1.1.2 同步非阻塞 點火後,去看電視(非阻塞),時不時看水開了沒有,水開後關火(同步)。 ... 1.1.3 異步阻塞 按下開關後,傻等水開(阻塞),水開後自動斷電(異步)。 ... 網絡編程中不存在的模型。 1.1.4 異步非阻塞 按下開關後,該幹嘛幹嘛 (非阻塞),水開後自動斷電(異步)。 ... 1.2 內核空間 、用戶空間 ... 內核負責網絡和文件數據的讀寫。 用戶程序通過系統調用獲得網絡和文件的數據。 1.2.1 內核態 用戶態 ... 程序為讀寫數據不得不發生系統調用。 通過系統調用接口,線程從用戶態切換到內核態,內核讀寫數據後,再切換回來。 進程或線程的不同空間狀態。 1.2.2 線程的切換 ... 用戶態和內核態的切換耗時,費資源(內存、CPU) 優化建議: 更少的切換。 共享空間。 1.3 套接字 – socket ... 有了套接字,才可以進行網絡編程。 應用程式通過系統調用socket(),建立連接,接收和發送數據(I / O)。 SOCKET 支持了非阻塞,應用程式才能非阻塞調用,支持了異步,應用程式才能異步調用 1.4 文件描述符 –FD 句柄 ......... 網絡編程都需要知道FD??? FD是個什麼鬼??? Linux:萬物都是文件,FD就是文件的引用。像不像JAVA中萬物都是對象?程序中操作的是對象的引用。JAVA中創建對象的個數有內存的限制,同樣FD的個數也是有限制的。 ... Linux在處理文件和網絡連接時,都需要打開和關閉FD。 每個進程都會有默認的FD: 0 標準輸入 stdin 1 標準輸出 stdout 2 錯誤輸出 stderr 1.5 服務端處理網絡請求的過程 ... 連接建立後。 等待數據準備好(CPU 閒置)。 將數據從內核拷貝到進程中(CPU閒置)。 怎麼優化呢? 對於一次I/O訪問(以read舉例),數據會先被拷貝到作業系統內核的緩衝區,然後才會從作業系統內核的緩衝區拷貝到應用程式的地址空間。 所以說,當一個read操作發生時,它會經歷兩個階段: 等待數據準備 (Waiting for the data to be ready)。 將數據從內核拷貝到進程中 (Copying the data from the kernel to the process)。 正是因為這兩個階段,Linux系統升級疊代中出現了下面三種網絡模式的解決方案。 二、IO模型介紹 2.1 阻塞 I/O - Blocking I/O ... 簡介:最原始的網絡I/O模型。進程會一直阻塞,直到數據拷貝完成。 缺點:高並發時,服務端與客戶端對等連接,線程多帶來的問題: CPU資源浪費,上下文切換。 內存成本幾何上升,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 ... 簡介:進程反覆系統調用,並馬上返回結果。 缺點:當進程有1000fds,代表用戶進程輪詢發生系統調用1000次kernel,來回的用戶態和內核態的切換,成本幾何上升。 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 = "伺服器響應"; byteBuffer.get(resp.getBytes()); socket.write(byteBuffer); } catch (IOException e) { e.printStackTrace(); } } 2.3 I/O 多路復用 - IO multiplexing ... 簡介:單個線程就可以同時處理多個網絡連接。內核負責輪詢所有socket,當某個socket有數據到達了,就通知用戶進程。多路復用在Linux內核代碼疊代過程中依次支持了三種調用,即SELECT、POLL、EPOLL三種多路復用的網絡I/O模型。下文將畫圖結合Java代碼解釋。 2.3.1 I/O 多路復用- select ... 簡介:有連接請求抵達了再檢查處理。 缺點: 句柄上限- 默認打開的FD有限制,1024個。 重複初始化-每次調用 select(),需要把 fd 集合從用戶態拷貝到內核態,內核進行遍歷。 逐個排查所有FD狀態效率不高。 服務端的select 就像一塊布滿插口的插排,client端的連接連上其中一個插口,建立了一個通道,然後再在通道依次註冊讀寫事件。一個就緒、讀或寫事件處理時一定記得刪除,要不下次還能處理。 public static void main(String[] args) throws IOException { ServerSocketChannel ssc = ServerSocketChannel.open();//管道型ServerSocket ssc.socket().bind(new InetSocketAddress(Constant.HOST, Constant.PORT)); ssc.configureBlocking(false);//設置非阻塞 System.out.println(" NIO single server started, listening on :" + ssc.getLocalAddress()); Selector selector = Selector.open(); ssc.register(selector, SelectionKey.OP_ACCEPT);//在建立好的管道上,註冊關心的事件 就緒 while(true) { selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> it = keys.iterator(); while(it.hasNext()) { SelectionKey key = it.next(); it.remove();//處理的事件,必須刪除 handle(key); } } } private static void handle(SelectionKey key) throws IOException { if(key.isAcceptable()) { ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); SocketChannel sc = ssc.accept(); sc.configureBlocking(false);//設置非阻塞 sc.register(key.selector(), SelectionKey.OP_READ );//在建立好的管道上,註冊關心的事件 可讀 } else if (key.isReadable()) { //flip SocketChannel sc = null; sc = (SocketChannel)key.channel(); ByteBuffer buffer = ByteBuffer.allocate(512); buffer.clear(); int len = sc.read(buffer); if(len != -1) { System.out.println("[" +Thread.currentThread().getName()+"] recv :"+ new String(buffer.array(), 0, len)); } ByteBuffer bufferToWrite = ByteBuffer.wrap("HelloClient".getBytes()); sc.write(bufferToWrite); } } 2.3.2 I/O 多路復用 – poll ... 簡介:設計新的數據結構(鍊表)提供使用效率。 poll和select相比在本質上變化不大,只是poll沒有了select方式的最大文件描述符數量的限制。 缺點:逐個排查所有FD狀態效率不高。 2.3.3 I/O 多路復用- epoll 簡介:沒有fd個數限制,用戶態拷貝到內核態只需要一次,使用事件通知機制來觸發。通過epoll_ctl註冊fd,一旦fd就緒就會通過callback回調機制來激活對應fd,進行相關的I/O操作。 缺點: 跨平臺,Linux 支持最好。 底層實現複雜。 同步。 public static void main(String[] args) throws Exception { final AsynchronousServerSocketChannel serverChannel = AsynchronousServerSocketChannel.open() .bind(new InetSocketAddress(Constant.HOST, Constant.PORT)); serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() { @Override public void completed(final AsynchronousSocketChannel client, Object attachment) { serverChannel.accept(null, this); ByteBuffer buffer = ByteBuffer.allocate(1024); client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() { @Override public void completed(Integer result, ByteBuffer attachment) { attachment.flip(); client.write(ByteBuffer.wrap("HelloClient".getBytes()));//業務邏輯 } @Override public void failed(Throwable exc, ByteBuffer attachment) { System.out.println(exc.getMessage());//失敗處理 } }); } @Override public void failed(Throwable exc, Object attachment) { exc.printStackTrace();//失敗處理 } }); while (true) { //不while true main方法一瞬間結束 } } 當然上面的缺點相比較它優點都可以忽略。JDK提供了異步方式實現,但在實際的Linux環境中底層還是epoll,只不過多了一層循環,不算真正的異步非阻塞。而且就像上圖中代碼調用,處理網絡連接的代碼和業務代碼解耦得不夠好。Netty提供了簡潔、解耦、結構清晰的API。 public static void main(String[] args) { new NettyServer().serverStart(); System.out.println("Netty server started !"); } public void serverStart() { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new Handler()); } }); try { ChannelFuture f = b.localAddress(Constant.HOST, Constant.PORT).bind().sync(); f.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } } class Handler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; ctx.writeAndFlush(msg); ctx.close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } } bossGroup 處理網絡請求的大管家(們),網絡連接就緒時,交給workGroup幹活的工人(們)。 三、總結 回顧 同步/異步,連接建立後,用戶程序讀寫時,如果最終還是需要用戶程序來調用系統read()來讀數據,那就是同步的,反之是異步。Windows實現了真正的異步,內核代碼甚為複雜,但對用戶程序來說是透明的。 阻塞/非阻塞,連接建立後,用戶程序在等待可讀可寫時,是不是可以干別的事兒。如果可以就是非阻塞,反之阻塞。大多數作業系統都支持的。 Redis,Nginx,Netty,Node.js 為什麼這麼香? 這些技術都是伴隨Linux內核疊代中提供了高效處理網絡請求的系統調用而出現的。了解計算機底層的知識才能更深刻地理解I/O,知其然,更要知其所以然。與君共勉!

 

RF4545NNEEFE115R

 

 

文章來源取自於:

 

 

每日頭條 https://kknews.cc/code/kkeggqq.html

MOMO購物網 https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=6910345&memid=6000007380&cid=apuad&oid=1&osm=league

如有侵權,請來信告知,我們會立刻下架。

DMCA:dmca(at)kubonews.com

聯絡我們:contact(at)kubonews.com


【momo購物網 折價券折扣優惠開箱評價】【富邦momo客服折扣優惠開箱評價】【momo優惠賣場】【momo taiwan折扣優惠開箱評價】
【momo旅遊購物台折扣優惠開箱評價】 【SANLUX 台灣三洋】2.2L健康氣炸鍋(SK-F820)【momo親子台折扣優惠開箱評價】 【KitchenAid】4.8公升5Q桌上型攪拌機(南瓜橘)【富邦momo電視購物折扣優惠開箱評價】 【送陶板屋餐券1張★Panasonic 國際牌】55型4K連網液晶電視(TH-55GX900W)【momo親子台折扣優惠開箱評價】 順天本草長大人黃金升級版(女方)

arrow
arrow
    全站熱搜

    核桃龍桃 發表在 痞客邦 留言(0) 人氣()