• 同步,异步,阻塞,非阻塞


     同步 ,  异步

    有很多人认为同步就是阻塞,异步就是非阻塞,这完全是一种误解

    同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

    所谓同步就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果

    异步则相反,调用在发出之后,这个调用就直接返回了,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态来通知调用者,或通过回调函数处理这个调用

     阻塞I/O ,  非阻塞I/O

    一个I/O过程分为两部分

    1 应用程序在用户态下发出I/O请求(系统调用),等待内核空间数据准备完成

    2 操作系统在内核态下去读取I/O驱动中的实际数据,并将数据复制到用户空间

    阻塞I/O 

    当应用程序去调用Socket的recvfrom()方法,系统会切换至内核态,去查询内核空间是否已经有读入的数据,假如这时候数据还在网络上传输,等待数据的过程中,操作系统会阻塞该调用线程,直到内核空间数据准备好,这时才返回,这就是阻塞I/O。

    非阻塞I/O

    当应用程序去调用Socket的recvfrom()方法,如果内核中没有准备好数据,则直接返回一个错误码(EWOULDBLOCK),使用非阻塞I/O前,要将I/O操作设置为NONBLOCK(非阻塞)就是告诉内核,当内核没有准备好数据时,不阻塞线程

     阻塞:当应用程序调用操作系统的某些方法时,假如内核态中数据没有准备好,这时该线程会进入Sleep状态,CPU的时间片段被分配到其余的线程去执行了

     非阻塞:当应用程序调用操作系统的某些方法时,假如内核态中数据没有准备好,这时返回一个错误码EAGAIN,线程不会进入Sleep状态,即该线程的时间片段没有执行完是不是被系统结束

    I/O多路复用和JavaNIO

    虽然I/O多路复用的函数也是阻塞的,I/O多路复用是阻塞在select这样的系统调用之上,而没有阻塞在真正的I/O系统调用如recvfrom方法

    JavaNIO事实上就是基于操作系统的I/O多路复用实现的

    I/O多路复用可以使用一个线程操作多个本应该多线程并发进行的I/O。这样就减少了多线程的开销,减少了线程切换的代价。

  • 相关阅读:
    JavaSE 窗口事件类(WindowEvent)实现
    ChemBioDraw 制作DMT屏保
    Sourcery G++ Lite 2009q3-67 ARM交叉工具链【分享】
    Beej's Guide to C Programming 【分享】
    囚徒健身 mobi 【分享】
    屏幕录像专家2011build1226 【分享】
    Fraps3.4.7 注册版【分享】
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(1)--服务台请求
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板
    一步步学习微软InfoPath2010和SP2010--第十二章节--管理和监控InfoPath Form Services(IPFS)(7)--关键点
  • 原文地址:https://www.cnblogs.com/moris5013/p/10870819.html
Copyright © 2020-2023  润新知