zoukankan      html  css  js  c++  java
  • 异步/同步,阻塞/非阻塞

    异步/同步,阻塞/非阻塞

    简单举例:
    老张喜欢喝茶,所以他需要煮开水。

    • 老张把开水壶放到火上,站在那里等水开。(同步阻塞)
    • 老张不在那等水开,他去看电视,时不时回来看水烧没烧开。(同步非阻塞)
    • 老张买了个响水壶(水烧好了,就发出声音),他把响水壶放火上,站在那里等水烧开。(异步阻塞)
    • 老张不在那等水开,他去看电视。只有当响水壶发出信号时,他才回去看。(异步非阻塞)

    同步与异步的区别出现在老张怎么知道水开没开
    这是一种交互方式上的区别。水壶怎么让老张知道水开还是没开?
    普通水壶没有别的办法,所以老张只能自己看着。
    响水壶可以提供一种方式,发出信号,让老张知道。

    阻塞与非阻塞的区别出现在老张是否什么都不干,只等水开
    老张站在那一动不动,连老婆讲话他也不管,他只关心水开还是没开。
    老张去干别的事,老婆叫他,他得有反应。

    老张相当于用户线程
    水壶这个概念本身相当于操作系统内核提供的交互方式

    老张期望通过水壶完成烧水的操作
    相当于用户线程期望通过内核完成某个IO操作

    烧水需要一定时间。
    IO操作也需要一定时间。

    水烧开的标志有哪些?
    没有标志:需要老张自己判断,所以无论是阻塞还是非阻塞,他都得不停的看水是否烧开。
    有标志:采用响水壶后,只需要一个特定的声音信号,就可以让老张知道水烧没烧开。
    ???
    内核IO操作完成的标志有哪些?
    简单标志:通过函数返回值,以及轮询
    特定标志:专门用于确定某IO是否完成(信号量?
    ???

    内核与用户线程间的交互方式是什么样的呢?
    就像市场上本身就存在两种水壶一样。
    内核当然可以提供普通水壶的交互方式,但它也可以提供响水壶的交互方式
    用户线程可以选择使用普通水壶的交互方式还是响水壶的交互方式
    程序员选择使用哪种方式与内核进行通信。

    用户线程需不需要等待IO操作完成呢?
    选择了响水壶,本身就是为了解决普通水壶的等待问题。响水壶具有一个独一无二的发声功能。
    其实在选择交互方式时,我们就应该已经明白异步方式不应该使用阻塞方式通讯。
    针对同步方式,我们才需要考虑阻塞与非阻塞的问题。

  • 相关阅读:
    数据持久化的基础知识
    svn常用命令
    关于SVN 目录结构
    linux查看CPU信息
    一个服务器上启动两台tomcat
    centos6.0 配置SVN
    mysql插入表情
    MAC 安装 PIL
    安装freetype
    Hadoop基本文件命令
  • 原文地址:https://www.cnblogs.com/0nism/p/10091878.html
Copyright © 2011-2022 走看看