北京 | 深度学习与人工智能

12月23-24日

再设经典课程 重温深度学习阅读全文>

正文共3359个字,11张图,预计阅读时间:9分钟。

1、阻塞,非阻塞

首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图:

进程状态

一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。各个状态的转换条件如上图,其中有个阻塞状态,就是说当线程中调用某个函数,需要IO请求,或者暂时得不到竞争资源的,操作系统会把该线程阻塞起来,避免浪费CPU资源,等到得到了资源,再变成就绪状态,等待CPU调度运行。

定义:
阻塞调用是指调用结果返回之前,调用者会进入阻塞状态等待。只有在得到结果之后才会返回。
非阻塞调用是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

阻塞调用:比如 socket 的 recv(),调用这个函数的线程如果没有数据返回,它会一直阻塞着,也就是 recv() 后面的代码都不会执行了,程序就停在 recv() 这里等待,所以一般把 recv() 放在单独的线程里调用。

非阻塞调用:比如非阻塞socket 的 send(),调用这个函数,它只是把待发送的数据复制到TCP输出缓冲区中,就立刻返回了,线程并不会阻塞,数据有没有发出去 send() 是不知道的,不会等待它发出去才返回的。

拓展

如果线程始终阻塞着,永远得不到资源,于是就发生了死锁。

比如A线程要X,Y资源才能继续运行,B线程也要X,Y资源才能运行,但X,Y同时只能给一个线程用(即互斥条件)用的时候其他线程又不能抢夺。

A 有 X,等待 Y。
B 有 Y,等待 X。

于是A,B发生了循环等待,造成死锁。给用户的感觉就是程序卡着不动了。

在写代码的时候要特别注意共享资源的使用,用信号量控制好,避免造成死锁。死锁的解除有个著名的银行家算法(https://baike.baidu.com/item/%E9%93%B6%E8%A1%8C%E5%AE%B6%E7%AE%97%E6%B3%95)

阻塞和挂起:阻塞是被动的,比如抢不到资源。挂起是主动的,线程自己调用 suspend() 把自己退出运行态了,某些时候调用 resume() 又恢复运行。

线程执行完就会被销毁,如果不想线程被频繁的创建,销毁,怎么办?可以给线程里面写个死循环,或者让线程有任务的时候执行,没任务的时候挂起,就像iOS中的 runloop 机制一样。线程就不会随便的终止了。

2、同步、异步

定义
同步:在发出一个同步调用时,在没有得到结果之前,该调用就不返回。
异步:在发出一个异步调用后,调用者不会立刻得到结果,该调用就返回了.

同步例子

int n = func(); next(); // func() 的结果没有返回,next() 就不会执行,直到 func() 运行完。

异步例子

func(callback); next(); ... void callback(int n)     // func 结果回调 {  int k = n; } // func() 执行后,还没得出结果就立即返回,然后执行 next() 了 // 等到结果出来,func() 回调 callback() 通知调用者结果。

同步的定义看起来跟阻塞很像,但是同步跟阻塞是两个概念,同步调用的时候,线程不一定阻塞,调用虽然没返回,但它还是在运行状态中的,CPU很可能还在执行这段代码,而阻塞的话,它就肯定不在CPU中跑这个代码了。这就是同步和阻塞的区别。同步是肯定可以在,阻塞是肯定不在。

异步和非阻塞的定义比较像,两者的区别是异步是说调用的时候结果不会马上返回,线程可能被阻塞起来,也可能不阻塞,两者没关系。非阻塞是说调用的时候,线程肯定不会进入阻塞状态。

上面两组概念,就有4种组合。

同步阻塞调用:得不到结果不返回,线程进入阻塞态等待。

同步非阻塞调用:得不到结果不返回,线程不阻塞一直在CPU运行。

异步阻塞调用:去到别的线程,让别的线程阻塞起来等待结果,自己不阻塞。

异步非阻塞调用:去到别的线程,别的线程一直在运行,直到得出结果。

3、并发,并行

先从定义说起,定义经过我通俗化了,原定义有点难理解。

并发是指一个时间段内,有几个程序都在同一个CPU上运行,但任意一个时刻点上只有一个程序在处理机上运行。

并行是指一个时间段内,有几个程序都在几个CPU上运行,任意一个时刻点上,有多个程序在同时运行,并且多道程序之间互不干扰。

两者区别如下图:

并行是多个程序在多个CPU上同时运行,任意一个时刻可以有很多个程序同时运行,互不干扰。

并发是多个程序在一个CPU上运行,CPU在多个程序之间快速切换,微观上不是同时运行,任意一个时刻只有一个程序在运行,但宏观上看起来就像多个程序同时运行一样,因为CPU切换速度非常快,时间片是64ms(每64ms切换一次,不同的操作系统有不同的时间),人类的反应速度是100ms,你还没反应过来,CPU已经切换了好几个程序了。

切换耗时:线程用完了时间片,释放CPU控制权,引发系统中断,调度程序根据相关策略选取下一个线程来运行,这里需要一点耗时。

举个例子吧,并行就是,多个人,有人在扫地,有人在做饭,有人在洗衣服,扫地,做饭,洗衣服都是同时进行的。

并发就是,有一个人,这个人一会儿扫地,一会儿做饭,一会儿洗衣服,他在这3件事中来回做,同一时刻只做一件事,不是同时做的,但最后3件事都可以做完。

时间片大小的选取


时间片取的小,假设是20ms,切换耗时假设是 10ms。
那么用户感觉不到多个程序之间会卡,响应很快,因为切换太快了,但是CPU的利用率就低了,20 / (20 + 10) = 66% 只有这么多,33%都浪费了。

时间片取的大,假设是200ms,切换耗时是 10ms
那么用户会觉得程序卡,响应慢,因为要200ms后才轮到我的程序运行,但是CPU利用率就高了,200 / (200 + 10) = 95% 有这么多被利用的。

所以时间片取太大或者太小都不好,一般在 10 - 100 ms 之间。

CPU调度策略


在并发运行中,CPU需要在多个程序之间来回切换,那么如何切换就有一些策略。

3.1 先来先服务-时间片轮转调度

这个很简单,就是谁先来,就给谁分配时间片运行,缺点是有些紧急的任务要很久才能得到运行。

3.2 优先级调度

每个线程有一个优先级,CPU每次去拿优先级高的运行,优先级低的等等,为了避免优先级低的等太久,每等一定时间,就给优先级低的线程提高一个级别。

3.3 最短作业优先

把线程任务量排序,每次拿处理时间短的线程运行,就像我去银行办业务一样,我的事情很快就处理完了,所以让我插队先办完,后面时间长的人先等等,时间长的人就很难得到响应了。

3.4 最高响应比优先

用线程的等待时间除以服务时间,得到响应比,响应比小的优先运行。这样不会造成某些任务一直得不到响应。

3.5 多级反馈队列调度

有多个优先级不同的队列,每个队列里面有多个等待线程。

CPU每次从优先级高的遍历到低的,取队首的线程运行,运行完了放回队尾,优先级越高,时间片越短,即响应越快,时间片大小就不是固定的了。

每个队列的内部还是用先来先服务的策略。

最后发个以前写的模拟CPU调度的程序(下载地址

https://github.com/hehe520/Data-structure-and-algorithm/tree/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9B%B8%E5%85%B3%E7%AE%97%E6%B3%95/%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6%E5%92%8C%E9%A1%B5%E9%9D%A2%E7%BD%AE%E6%8D%A2%E7%AE%97%E6%B3%95)

原文链接:http://www.jianshu.com/p/2116fff869b6

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org

请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

点击“阅读原文”直接打开报名链接

深入理解并发/并行,阻塞/非阻塞,同步/异步相关推荐

  1. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

  2. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行

    基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程 ...

  3. 进程线程、同步异步、阻塞非阻塞、并发并行

    一.进程和线程 1️⃣[进程Process]是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程. 进程 ...

  4. 进程线程、同步异步、阻塞非阻塞、并发并行、多线程

    一: 进程和线程 1: 进程(Process) 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线 ...

  5. cpu 被挂起和阻塞_同步异步阻塞非阻塞并发并行讲解

    通过一个很形象的例子来说明同步异步阻塞非阻塞. 场景: 小明使用 chrome 下载一个软件. 1. 同步阻塞 小明使用 没有提醒功能的chrome 下载一个软件.小明 一直坐在电脑面前什么事也不做, ...

  6. 并发编程:并发和并行、多进程、同步异步,阻塞非阻塞、进程同步(进程锁)、线程、GIL全局解释器锁、锁-信号量-Event事件、协程

    文章目录 一. 操作系统的发展史 二. 进程基础 三. 并发和并行 四. 如何开启多进程 五. 进程调度算法(了解) 六. 同步异步,阻塞非阻塞(了解) 1. 状态介绍 2.同步和异步.阻塞和非阻塞 ...

  7. 怎样理解阻塞非阻塞与同步异步的区别

    怎样理解阻塞非阻塞与同步异步的区别? 发现很多人对这两个概念往往混为一谈 6 条评论 分享 按投票排序 按时间排序 47 个回答 605赞同 反对,不会显示你的姓名 卢毅 ,Lyft full-sta ...

  8. 怎样理解阻塞非阻塞与同步异步的区别?

    发现很多人对这两个概念往往混为一谈(包括本人,不是很理解). 阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个 ...

  9. 异步/同步、阻塞/非阻塞的理解

    异步/同步.阻塞/非阻塞的理解 [同步和异步] 通俗的讲: 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式.  异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个 ...

  10. python 进程池阻塞和非阻塞_python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)...

    9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型池子内什么时候装线程:并发的任务属于IO ...

最新文章

  1. java与众包的联系_众包、众筹和众创是什么 三者区别与联系
  2. C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究
  3. eclipse打包项目为aar_eclipse中将项目打包成jar的两种方法,及其问题与解决方法...
  4. java redis服务_java链接redis服务器
  5. 制作.sens数据集跑通bundlefusion
  6. hadoop 多机全分布式安装步骤(虚拟机1master+2slave)
  7. linux基础操作与实践,Linux操作系统基础与实践
  8. Django ORM QuerySet集合对象的特性
  9. Mac安装tensorflow
  10. Android 实现全屏、无标题栏
  11. 自己的myeclipse添加javaee7步骤
  12. python函数的传参要求_python函数传参问题,一直没弄明白
  13. LSTM神经网络算法
  14. 华北电力大学微型计算机,华北电力大学 微机原理与应用
  15. InstallShield 下载安装
  16. C语言扫雷游戏代码以及基本原理教学(一看就会)
  17. 划词翻译—多种翻译平台集合体积不足1mb——QTranslate
  18. ArcGIS如何获取地理要素的几何属性
  19. [计算机网络]HTTP、UDP、TCP协议
  20. DB2 Merge 语句的使用

热门文章

  1. android studio 新建工程慢,关于AndroidStudio新建与编译项目速度慢解决办法
  2. tolua打包Android后路径出错,unity+tolua 64位android崩溃排查过程记录
  3. three.js和php,前端图形学(二十二)一切绕过原生WebGl直接上ThreeJs的都是耍流氓
  4. python把csv做成柱状图_用Python的Matplotlib模块实现CSV数据格式的可视化
  5. vue动态生成下拉框_解决vue动态下拉菜单 有数据未反应的问题
  6. java 人脸识别jar包_java版天网人脸识别系统,获取视频流人脸识识别推送服务器展示...
  7. Java redis
  8. 【Linux】处理数据文件
  9. 51 Nod 1161 Partial sums
  10. cogs 167. [USACO Mar07] 月度花费