赖勇浩(http://laiyonghao.com)

线程

线程是指进程中的一个单一顺序的控制流,是操作系统能够调度的最小单位,一个进程中可以有多条线程,分别执行不同的任务。线程有内核线程和用户线程之分,但在本文中仅指内核线程。在软件开发中,使用线程有以下好处:
1、在多核或多路 CPU 的机器上多线程程序能够并发执行,提高运算速度;
2、把 I/O,人机交互等与密集运算部分分离,提升 I/O 吞吐量和增进用户体验。
线程的缺点也很明显:
1、创建一条线程需要较大的内存开销,导致不能创建海量的线程;
2、线程由操作系统调度(分配时间片),线程切换的 CPU 成本比较高,导致大量线程存在时大量 CPU 资源消耗在线程切换上;
3、同一进程的多条线程共享全部系统资源,在多线程间共享资源需要进入加锁,大量的锁开销不提,重要的是加大了编写程序的复杂性,这一点你看看有多少书名含有“多线程”三个字就明白写个多线程应用有多难了;
4、I/O 方面,多线程帮助有限,以 TCP Socket Server 为例,如果每一个 client connection 由一条专属的线程服务,那么这个 server 可能并发量很难超过 1000。为了进一步解决并发带来的问题,现代服务器都使用 event-driven i/o 了。
event-driven i/o 解决了并发量的问题,但引入了“代码被回调函数分割得零零碎碎”的问题。特别是当 event-driven i/o 跟 multi-threading 结合在一起的时候,麻烦就倍增了。解决这个问题的办法就使用绿色线程,绿色线程可以在同一个进程中成千上万地存在,从而可以在异步 I/O 上封装出同步的 APIs,典型的就是用基于 greenlet + libevent 开发的 python 库 gevent。绿色线程的缺陷在于操作系统不知道它的存在,需要用户进行调度,也就无法利用到多核或多路 CPU 了。为了解决这个问题,很多大牛都做出了巨大的努力,并且成果斐然,scala、google go 和 rust 都较好地解决了问题,下文以 rust 的并发模型为例讲一下。
rust 提出一个 Task 的概念,Task 有一个入口函数,也有自己的栈,并拥有进程堆内存的一部分,为方便理解,你可以把它看作一条绿色线程。rust 进程可以创建成千上万个 Tasks,它们由内建的调度器进行调度,因为 Tasks 之间并不共享数据,只通过 channels/ports 通信,所以它们是可并行程度很高。rust 程序启动时会生成若干条(数量由 CPU 核数决定或运行时指定)线程,这些线程并行执行 Tasks,从而利用多个 CPU 核心。

如上图,rust 应用程序不停地 spawn 出一个又一个 Tasks,它们由 tasks 调度器管理,在适当的时机,调度器会把某一个 Task 分配给原生线程执行,如果这个 Task 进入 I/O 等待或主动让出 CPU(sleep),那么这个 Task 会被交回给调度器,而相应的原生线程会执行另一个新分派的 Task。尽管使用 rust 编程语言是不能创建线程的(直接调用 C 函数不算),但 rust 应用程序实际上是多线程的(一般情况下),它能够充分地利用多核或多路 CPU。
综上,类似 rust 的 Task 的概念是比线程更好的并发模型,更安全,编写的代码也更加容易维护(关于维护性,我相信写过 gevent 程度或 go 程序的同学会认同的)。线程当然不会消亡,但随着 scala/go/rust 的成熟,在可以预见的将来,线程会退到它呆着的角落:远离普通程序员,只有少数人需要了解它的细节。

2012 不宜进入的三个技术点(中)相关推荐

  1. 2012 不宜进入的三个技术点(下)

    赖勇浩(http://laiyonghao.com) C++ C++ 在 2011 年其实风头甚劲,C++2011 标准出台,gcc/msvc/clang 都很快速地支持了许多新特性,新兴的移动设备的 ...

  2. 2012 不宜进入的三个技术点

    http://blog.csdn.net/lanphaday/article/details/7217506 2012 不宜进入的三个技术点(上) 赖勇浩( http://laiyonghao.com ...

  3. 2012 不宜进入的三个技术点(上)

    赖勇浩( http://laiyonghao.com) 其实写这篇博客的想法在年前已经有了,但一直在犹豫要不要写,一是因为写出来肯定会有人骂的了,刚过完春节的,在自己地头找骂,实在是晦气:二是因为我对 ...

  4. 关于2012年度土建工程专业中级专业技术资格考试有关问题的通知

    关于2012年度土建工程专业中级专业技术资格考试有关问题的通知 现将2012年度土建工程专业初.中级专业技术资格考试.报名.培训工作有关事项通知如下: 一.考试组织 湖南省住房和城乡建设厅.省人力资源 ...

  5. 三次技术转型,程序员的北漂奋斗史

    作者 |  门心叼龙 责编 | 伍杏玲 出品 | CSDN博客 卧室里家人已经熟睡,虽然已经是深夜11点多了,我却一点睡意都没有,窗外的马路上依然是车水马龙,我坐在电脑桌旁,带着耳机听着汪峰的< ...

  6. 02205微型计算机原理与接口技术自考,2012年微型计算机原理与接口技术自考题模拟(2)...

    2012年微型计算机原理与接口技术自考题模拟(2):2012年微型计算机原理与接口技术自考题模拟.本试卷总分100分:共有10类型题目 一.单项选择题 ,每小题1分,共16分,在每小题列出的四个备选项 ...

  7. 三次技术转型的我在帝都的北漂奋斗史

    卧室里家人已经熟睡,虽然已经是深夜12点多了,我却一点睡意都没有,窗外的马路上依然是车水马龙,我坐在电脑桌旁,带着耳机听着汪峰的<北京,北京>,想着MV里面里的那些人,高楼林立,街景复杂, ...

  8. 三次技术转型,程序员的北漂奋斗史 | 程序员有话说

    卧室里家人已经熟睡,虽然已经是深夜11点多了,我却一点睡意都没有,窗外的马路上依然是车水马龙,我坐在电脑桌旁,带着耳机听着汪峰的<北京,北京>,想着MV里面里的那些人,高楼林立.街景复杂. ...

  9. Airplay、DLNA和Miracast三种技术的介绍

    Airplay.DLNA和Miracast三种技术的介绍 AirPlay AirPlay 是苹果开发的一种无线技术,可以通过WiFi将iPhone .iPad.iPod touch 等iOS 设备上的 ...

最新文章

  1. mysql设置约束l命令_mysql建表约束,sql
  2. es6 --- 异步迭代生成器 Promise
  3. python算法题_python基本算法题(一)
  4. java 课后习题 冒泡排序的运用
  5. 使用spring 配置数据源,并用数据源得到连接,操作sql
  6. Ubuntu 16.04出现chmod: 无效模式:a的问题解决
  7. Python PIL支持的图像文件格式
  8. Codeforces Round #184 (Div. 2)
  9. 又一种页面之间传值方式
  10. win10系统QQ音乐安装包无法打开解决方法!
  11. 银行卡三要素/三元素检测API,银行卡实名认证接口文档
  12. 修改ubuntu终端显示目录和计算机名称(转)
  13. c语言实验报告总结通用版,C语言实训心得体会
  14. 已知两边求角度公式_有30度角的直角三角形,已知一直角边,求另两边的公式,快速求法...
  15. html有形状导航栏制作,div css制作导航栏
  16. 入门级概述光学相干层析(OCT)原理
  17. qt4.8.7 2016年4月18日 error reading collection file qthelpcollection cannot load sql
  18. jfreechart折线图+柱状图、柱状图(堆叠)+折线图、饼状图、环形图
  19. 使用太乐地图下载器下载cesium适用瓦片
  20. echart图表环形图(饼图)

热门文章

  1. 有没有五金产品展开计算机软件,常熟ug数控编程培训
  2. 太阳能光伏发电整流逆变实训装置,QY-TF01
  3. 现在面试都问什么「字节、蚂蚁、美团、滴滴面试小记」
  4. Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
  5. 自学Arduino UNO串口(制造光控灯)
  6. linux刷分区表,Ubuntu更新致MBR破坏 误操作丢失分区表
  7. 生成不重复的id的方式——Java
  8. 紫外分析软件安装及使用
  9. 计算机山东省科技馆,山东省2018年信息学奥赛总结表彰大会在昌邑一中隆重举行...
  10. MAX6675驱动(STM32,K 热电偶)