0nism

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

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

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

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

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

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

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

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

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

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

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

posted on 2018-12-09 16:28  0nism  阅读(114)  评论(0编辑  收藏  举报