作者:廖雪峰
博客链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319292979766bd3285c9d6b4942a8ea9b4e9cfb48d8000

线程切换

无论是多进程还是多线程,只要数量一多,效率肯定上不去,为什么呢?

我们打个比方,假设你不幸正在准备中考,每天晚上需要做语文、数学、英语、物理、化学这5科的作业,每项作业耗时1小时。

如果你先花1小时做语文作业,做完了,再花1小时做数学作业,这样,依次全部做完,一共花5小时,这种方式称为单任务模型,或者批处理任务模型。

假设你打算切换到多任务模型,可以先做1分钟语文,再切换到数学作业,做1分钟,再切换到英语,以此类推,只要切换速度足够快,这种方式就和单核CPU执行多任务是一样的了,以幼儿园小朋友的眼光来看,你就正在同时写5科作业。

但是,切换作业是有代价的,比如从语文切到数学,要先收拾桌子上的语文书本、钢笔(这叫保存现场),然后,打开数学课本、找出圆规直尺(这叫准备新环境),才能开始做数学作业。操作系统在切换进程或者线程时也是一样的,它需要先保存当前执行的现场环境(CPU寄存器状态、内存页等),然后,把新任务的执行环境准备好(恢复上次的寄存器状态,切换内存页等),才能开始执行。这个切换过程虽然很快,但是也需要耗费时间。如果有几千个任务同时进行,操作系统可能就主要忙着切换任务,根本没有多少时间去执行任务了,这种情况最常见的就是Linux swap交换分区或Windows pagefile频繁读写(硬盘灯狂闪),点窗口无反应,系统处于假死状态。

所以,多任务一旦多到一个限度,就会消耗掉系统所有的资源,结果效率急剧下降,所有任务都做不好。

“计算密集型任务” V.S. “IO 密集型任务”

是否采用多任务的第二个考虑是任务的类型。我们可以把任务分为计算密集型和IO密集型。

计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写

第二种任务的类型是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。

IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差

【转载】什么时候该选C语言实现业务逻辑,什么时候该选Python?相关推荐

  1. linux u8 头文件,2019-12-11 转载TCP/IP编程常用C语言头文件

    网络编程的头文件(这里所有的头文件都在/usr/include目录下面) 经常被一些头文件搞大,不知到到哪个头文件去找结构.这里做个总结 ---------------- 版权声明:本文为CSDN博主 ...

  2. 2019-12-11 转载TCP/IP编程常用C语言头文件

    网络编程的头文件(这里所有的头文件都在/usr/include目录下面) 经常被一些头文件搞大,不知到到哪个头文件去找结构.这里做个总结 ---------------- 版权声明:本文为CSDN博主 ...

  3. python和c哪个适合入门-编程入门选什么语言好?C 语言还是Python ?为你解析

    前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...

  4. C++11新特性选讲 语言部分 侯捷

    C++11新特性选讲 语言部分 侯捷 本课程分为两个部分:语言的部分和标准库的部分.只谈新特性,并且是选讲. 本文为语言部分笔记. 语言 Variadic Templates move semanti ...

  5. Sketch 选错语言怎么办丨使用教程

    Sketch在Mac 应用程序中是支持简体中文的,具体取决于您的语言和地区首选项.如果选错语言您可以按照以下步骤进行修复. 语言设置如下: 1.转到  > 系统偏好设置 > 语言和地区 ...

  6. html语言图像,[多选] HTML语言能描述图像的()

    [多选] HTML语言能描述图像的() 更多相关问题 [判断题] 离子过滤器发生醚化反应,会影响筒式反应器床层温度的控制. [判断题] 在化工装置.储罐等生产区易起火,如扑救不及时,火势扩大既影响生产 ...

  7. 编程语言的被淘汰:选错语言毁终身

    在我当前所在项目里,其中的某一个子系统是用 Groovy 中的 Gradle 插件.Groovy 作为一个运行在 JVM 上的脚本语言,天生具有胶水的特性.加之,它支持 DSL 与其程式的简洁语法.嗯 ...

  8. [转载]中国文明网:拒绝语言暴力不做孩子的差评师

    [转载]中国文明网:拒绝语言暴力不做孩子的差评师 俗话说,"良言一句三冬暖,恶语伤人六月寒",语言暴力是伤害孩子精神与心灵的钢刀利箭.北京师范大学心理学教授邹泓说,"家长 ...

  9. 编程入门选什么语言好?C 语言还是Python ?为你解析

    前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...

最新文章

  1. java学习路线导航【教学视频+博客+书籍整理】
  2. new Map的妙用
  3. 基于js鼠标拖动图片排序
  4. 5G与数据中心是新基建“耗电双雄”?事情不能这么看……
  5. Redis事务,ACID性质,但是Redis不支持事务回滚
  6. 【⛸️拒绝手滑,我们都是稳准狠⛸️】C++のmemset函数的小探究
  7. jQuery的this $this $(this)
  8. taskscheduler java_java – 针对不同任务的不同taskScheduler
  9. 《数据结构与抽象:Java语言描述(原书第4版)》一P.4.1 标识类
  10. flex布局 - justify-content: space-evenly
  11. Enterprise Library 系列教程
  12. 【TSP】基于matlab GUI混合粒子群算法求解旅行商问题【含Matlab源码 925期】
  13. SWUST OJ Coin Changing
  14. java毕业设计德云社票务系统Mybatis+系统+数据库+调试部署
  15. Photoshop插件-证件照-3寸裁剪-3寸排版-脚本开发-PS插件
  16. Xcel 测试版使用手册
  17. matlab指数形式复数运算,[转载]MATLAB学习(4)——复数及其运算
  18. Python 如何画出漂亮的地图?
  19. 搭建授权服务器oauth2
  20. c语言矢量字体库,单片机用矢量字库的C语言调用

热门文章

  1. xml,String互转
  2. 对象tostring后怎么转成对象_和女生相亲后怎么联系对方?和相亲对象该如何聊天...
  3. tensorflow2.0对应python版本_TensorFlow2.1.0最新版本安装详细教程
  4. Opencv之二维码识别---QRCodeDetector
  5. sql server insert 锁表_SQL Server的insert执行的秘密(下) 带外键的insert分析
  6. 转载关于使用Ant打包Flex的一些脚本
  7. Python标准库 - subprocess
  8. SK海力士与电装四巨头论半导体供给
  9. 大数组情况下栈溢出解决
  10. 《强化学习》中的 时序差分学习 Temporal-Difference Learning (基于与动态规划 DP 、蒙特卡洛方法 MC 的对比)